Servlet
Servlet是用Java编写的服务端程序,其主要功能在于交互式地浏览和修改数据,生成动态的Web内容。
Servlet的生命周期
下面我们通过一段代码和配置文件来试验一下Servlet的生命周期
代码
package Servlet;
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 Servlet extends HttpServlet {
public Servlet() {
System.out.println("调用了Servlet的构造方法");
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// TODO Auto-generated method stub
super.doGet(req, resp);
}
@Override
public void init() throws ServletException {
System.out.println("调用了Servlet的init方法");
}
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("调用了Servlet的service方法");
}
@Override
public void destroy() {
System.out.println("调用了Servlet的destory方法");
}
}
Web.xml文件配置
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<display-name></display-name>
<servlet>
<servlet-name>Servlet</servlet-name>
<servlet-class>Servlet.Servlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Servlet</servlet-name>
<url-pattern>/servlet/Servlet</url-pattern>
</servlet-mapping>
</web-app>
通过网页访问Servlet方法,在控制带依次输出的文字为:
调用了Servlet的构造方法
调用了Servlet的init方法
调用了Servlet的service方法
如果刷新网页,或者打开一个新的网页访问会发现,程序在控制台中接着输出
调用了Servlet的service方法
没有在调用Serlvet的构造方法和init初始化方法,说明Servlet是单实例多线程的,所以我们在写代码的时候要注意线程安全的问题。
那么Servlet的调用过程是怎样的呢?下面用一个图简单说明一下
详细的执行过程为
1、 Servlet容器启动,加载web.xml文件,读取相关配置
2、 客户访问Servlet容器,如果Servlet类还没有被初始化,那么Servlet容器根据客户输入的URL地址,去配置文件中找到与之相对应的映射类
3、 Servlet容器通过反射的方法实例化该类
4、 实例化类后Servlet容器会调用init(ServletConfigconfig)方法,获取web.xml中的相关配置。
5、 Servlet容器会调用调用init()方法。
6、 调用 publicvoid service(ServletRequest req, ServletResponse res)方法,将ServletRequest和ServletResponse转换成HttpServletRequest和HttpServletResponse方法。并调用protectedvoid service(HttpServletRequest req, HttpServletResponse resp)方法
7、 在service(HttpServletRequestreq, HttpServletResponse resp)方法中判断用户是通过什么请求来进行的页面访问,并调用相关的方法。
8、 当容器关闭的时候调用destory()方法销毁。
注意
1、 Servlet容器的默认配置是当有用户访问Serlvet类的时候才会对该类进行初始化操作,这样首次访问的用户等待的时间可能会比较长,所以用户可以通过在<servlet></servlet>中添加<load-on-startup>(正整数)</load-on-startup>来使该类在Servlet容器启动的时候就完成Servlet类的初始化。
2、 init(ServletConfig config)方法是Servlet容器自己调用的初始化方法,最好不要重写这个方法,如果需要在容器初始化时候进行某些操作,可以重写init()方法,该方法是专门为开发人员设置的。
3、 重写service方法最好重写service(HttpServletRequestreq, HttpServletResponse resp)方法,因为service(ServletRequest req, ServletResponse res)方法是将ServletRequest和ServletResponse对象转换为HttpServletRequest对象和HttpServletResponse对象的。