Servlet简介
servlet系列要实现的功能便是接收浏览器的请求,响应请求。
完成这个功能可以有三种方式:
- 实现Servlet接口,这个最为原始,共有五种方法
- 继承GenericServlet类,对Servlet接口的两种方法实现了重写
- 继承HttpServlet类,对GenericServlet类也进行了重写
通常继承HttpServlet类实现功能
Servlet接口
Servlet接口中有三个生命周期方法,由Tomcat调用:
-
public void init(ServletConfig arg0)
方法讲解:当Tomcat接收到请求时创建对象,并调用init方法。可以看作是生命周期的开始。 -
public void service(ServletRequest arg0, ServletResponse arg1)
方法讲解:这个方法负责响应请求,浏览器每发送一次请求就运行一次servlet。ServletRequest类对象是接收的客户端发送的请求数据,ServletResponse返回给客户端服务器端的响应结果。 -
public void destroy()
方法讲解:当结束时会调用这个方法,但不是通过这个方法来结束,只是用来传递一些‘遗言’,用处不大。
还有两个方法,由我们自己调用:
- public ServletConfig getServletConfig()
方法讲解:返回的ServletConfig类型数据是Servlet的配置参数
最后一个方法作用是返回Servlet的信息,基本没用。
public class AServlet implements Servlet {
@Override
public void destroy() {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void init(ServletConfig arg0) throws ServletException {
}
@Override
public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
}
}
GenericServlet类
Servlet接口在使用时不够便利,将一些每次都要写的固定操作写到GenericServlet类,以供调用。
//在Servlet接口的基础上增加了一个私有属性
private ServletConfig config;
//接收servletConfig,即Servlet的配置信息
//添加了init()方法,是为了继承GenericServlet时可以再次覆写init()
public void init(ServletConfig config) throws ServletException {
this.config = config;
this.init();
}
public void init(){
}
//此时配置数据已经被赋值,可以返回
public ServletConfig getServletConfig() {
return this.config;
}
HttpServlet类
HttpServlet在GenericServlet类的基础上,再次对Servlet进行了覆写,将参数ServletRequest arg0, ServletResponse arg1进行强制转换成HttpServletRequest arg0,HttpServletResponse arg1,并且根据请求类型调用doGet(),doPost()方法,service()不再需要覆写。
大体代码如下:
public class CServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public CServlet() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.getWriter().append("Served at: ").append(request.getContextPath());
Integer number = (Integer)this.getServletContext().getAttribute("访问量");
System.out.println(number);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
Servlet不是线程安全的
一个类型的Servlet只有一个对象,同一时间内一个Servlert可能会处理多个请求,一存一取间就会产生错误。
解决之道:
- 不定义成员变量,,只定义局部变量
- 定义无状态的成员变量
- 定义只有读状态的成员变量
何时创建Servlet
当标签load-on-startup内的值大于负数时,Tomcat一启动就创建该Servlet。
注意::值越小越早创建。
<servlet>
<servlet-name>xxx</servlet-name>
<servlet-class>Com.AServlet</servlet-class>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>xxx</servlet-name>
<url-pattern>/AServlet</url-pattern>
</servlet-mapping>
当没有标签load-on-startup,默认情况下Tomcat在第一次接收到该Servlet的请求时创建该Servlet