Servlet
Web资源
在http协议当中,规定了请求和响应双方,客户端和服务器端。与web相关的资源
- 有两种分类
- 静态资源
html、js、css - 动态资源
servlet/jsp
Servlet
Servlet是什么?
其实Servlet就是一个Java程序,运行在我们的web服务器上,用于接受和响应客户端的http请求
更多的是配合动态资源来做。
当然静态资源也需要使用到Servlet,只不过Tomcat里面已经定义好了一个DefaultServlet
HelloServlet
- 创建一个Web工程,要有一个服务器
- 测试运行Web工程
//1、新建一个类,实现Servlet接口
import java.io.IOException;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class HelloServlet implements Servlet{
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public ServletConfig getServletConfig() {
// TODO Auto-generated method stub
return null;
}
@Override
public String getServletInfo() {
// TODO Auto-generated method stub
return null;
}
@Override
public void init(ServletConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
@Override
public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
// TODO Auto-generated method stub
System.out.println("Hello,Servlet......");
}
}
<!-- 2、配置Servlet,用于告诉服务器,我们应用有这么些个Servlet.(在/HelloServlet/WebContent/WEB-INF/web.xml里面配置) .当然也可以右击java程序new Servlet自动生成-->
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>com.java1995.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/a</url-pattern>
</servlet-mapping>
Servlet执行过程
Servlet的通用写法
Servlet(接口)
|
|
GenericServlet
|
|
HttpServlet(用于处理http的请求)
- 定义一个类,继承HttpServlet 复写doGet和doPost方法
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class HelloServlet02 extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
super.doGet(req, resp);
System.out.println("doGet...");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
super.doPost(req, resp);
System.out.println("doPost...");
}
}
Servlet的生命周期
生命周期
从创建到销毁的一段时间
生命周期方法
从创建到销毁,所调用的那些方法
init方法
在创建该Servlet的实例时,就执行该方法。 一个Servlet只会初始化一次,init方法只会执行一次,默认情况下不是:初次访问该Servlet,才会创建实例。
service方法
只要客户端来了一个请求,那么就执行这个方法。 该方法可以被执行多次。 一次请求,对应一次service方法的调用
destory方法
servlet销毁的时候,就会执行该方法 1. 该项目从tomcat的里面移除 2. 正常关闭tomcat就会执行(比如执行shutdown.bat)
doGet和doPost不算生命周期方法,所谓的生命周期方法是指,从这个对象的创建到销毁一定会执行的方法,但是这两个方法,不一定会执行。
让Servlet创建实例的时机提前。
- 默认情况下,只有在初次访问servlet的时候,才会执行init方法。有时候,我们可能需要在这个方法里面执行一些初始化操作,甚至是做一些比较耗时的逻辑。
- 那么这个时候,初次访问,可能会在init方法中逗留太久的时间。那么有没有方法可以让这个初始化的时机提前一点?
- 在配置的时候,使用load-on-startup元素来指定,给定的数字越小,启动的时机就越早。一般不写负数,从2开始即可。
<servlet>
<servlet-name>HelloServlet04</servlet-name>
<servlet-class>com.itheima.servlet.HelloServlet</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
ServletConfig
Servlet的配置,通过这个对象,可以获取servlet在配置的时候一些信息
- web.xml文件里的内容如下:
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>com.java1995.HelloServlet</servlet-class>
<init-param>
<param-name>address</param-name>
<param-value>beijing...</param-value>
</init-param>
<init-param>
<param-name>name</param-name>
<param-value>zhangsan...</param-value>
</init-param>
<init-param>
<param-name>age</param-name>
<param-value>18...</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/a</url-pattern>
</servlet-mapping>
- Java代码如下:
import java.io.IOException;
import java.util.Enumeration;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import sun.misc.ObjectInputFilter.Config;
public class HelloServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 1、得到servlet配置对象
ServletConfig config = getServletConfig();
//获取到的是配置servlet里面的servlet-name的文本内容
String servletName = config.getServletName();
System.out.println("ServletName"+servletName);
// 2、可以获取具体的某个参数
String address = config.getInitParameter("address");
System.out.println("address"+address);
// 3、获取所有的参数名称
Enumeration<String> names = config.getInitParameterNames();
//遍历取出所有的参数名称
while(names.hasMoreElements()) {
String key = (String)names.nextElement();
String value = config.getInitParameter(key);
System.out.println("key="+key+" "+"value"+value);
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
super.doPost(req, resp);
}
}
启动服务器得到的结果如下:
ServletNameHelloServlet addressbeijing... key=address valuebeijing... key=name valuezhangsan... key=age value18...