servlet

来源:互联网 发布:linux操作系统原理 编辑:程序博客网 时间:2024/06/05 06:38

一.servlet容器

1,容器就是你的程序运行时需要的环境。Tomcat是Servlet的运行环境,即一个Servlet容器。

2,Servlet容器的作用是负责处理客户请求,当客户请求来到时,Servlet容器获取请求,然后调用某个Servlet,并把Servlet的执行结果返回给客户。

3,Servlet容器的工作过程是:当客户请求某个资源时,Servlet容器使用ServletRequest对象把客户的请求信息封装起来,然后调用Java Servlet API中定义的Servlet的一些生命周期方法,完成Servlet的执行,接着把Servlet执行的要返回给客户的结果封装到 ServletResponse对象中,最后Servlet容器把客户的请求发送给客户,完成为客户的一次服务过程。每一个Servlet的类都执行 init()、service()、destory()三个函数的自动调用,在启动时调用一次init()函数用以进行参数的初始化,在服务期间每当接收到对该Servlet的请求时都会调用Service()函数执行该Servlet的服务操作,当容器销毁时调用一次destory()函数。

二.生命周期

  • 1.加载——创建servlet对象,调用构造器

所谓加载是指servlet加载进JVM运行,在如下两种情况下会进行对象实例化。
第一种情况:
当请求到达容器时,容器查找该servlet对象是否存在,如果不存在,才会创建实例。
第二种情况:
容器在启动时,或者新部署了某个应用时,会检查web.xml当中,servlet是否有 load-on-starup配置。如果有,则会创建该servlet实例。load-on-starup参数值越小,优先级越高(最小值为0,优先级最高)。

  • 2.初始化——init():

在Servlet的生命周期中,仅执行一次init()方法。它是在服务器装入Servlet时执行的,负责初始化Servlet对象。无论有多少客户机访问Servlet,都不会重复执行init()。

  • 3.就绪/调用——服务service():

Servlet的核心,负责响应客户的请求。
每当一个客户请求一个HttpServlet对象,该对象的Service()方法就要调用,而且传递给这个方法一个“请求”(ServletRequest)对象和一个“响应”(ServletResponse)对象作为参数。HttpServlet中实现了service()方法,将请求ServletRequest、ServletResponse 强转为HttpRequest 和 HttpResponse,并依据请求方式来调用doGet()或者doPost()方法,因此默认的服务功能只需要重写doGET和doPOST方法。

  • 4.销毁——destroy():

仅执行一次,在服务器端停止且卸载Servlet时执行该方法。当Servlet对象退出生命周期时,负责释放占用的资源。一个Servlet在运行service()方法时可能会产生其他的线程,因此需要确认在调用destroy()方法时,这些线程已经终止或完成。

三.servlet在web.xml中配置

web.xml中

<!-- 声明Servlet对象 --><servlet>    <!-- 指定Servlet对象的名称 -->    <servlet-name>name</servlet-name>    <!-- 指定Servlet对象的完整位置,包含包名和类名 -->    <servlet-class>com.demo.FirstServlet</servlet-class></servlet><!-- 映射Servlet --><servlet-mapping>    <!--<servlet-name>与上面<Servlet>标签的<servlet-name>元素相对应,不可以随便起名  -->    <servlet-name>name</servlet-name>    <!-- 话用于映射访问URL -->    <url-pattern>/test</url-pattern></servlet-mapping>

FirstServlet. java中:
注意,此文件的完整路径是com.demo.FirstServlet

public class FirstServlet extends HttpServlet {    private static final long serialVersionUID = 1L;    /**     * @see HttpServlet#HttpServlet()     */    public FirstServlet() {        super();        // TODO Auto-generated constructor stub    }    /**     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)     */    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {        // TODO Auto-generated method stub        response.setContentType("text/html");        response.setCharacterEncoding("GBK");        PrintWriter out=response.getWriter();        out.print("<HTML>");        out.println("<HEAD><TITLE>Servlet实例</TITLE></HEAD>");        out.println("<BODY>");        out.println("servlet实例");        out.println("</BODY>");        out.println("</HTML>");        out.flush();        out.close();        response.getWriter().append("Served at: ").append(request.getContextPath());    }    /**     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)     */    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {        // TODO Auto-generated method stub        doGet(request, response);    }}

进行地址映射目的是为了使用servlet,它的工作过程是:

输入地址:http://localhost:8080/ test,通过它找到映射文件内部的文件名name,通过name找到对应的< servlet-name>name< /servlet-name>,然后定位到这个FirstServlet文件:com.demo.FirstServlet

由此可见,< servlet-name>name< /servlet-name>中的名字name不一定一定要与servlet的文件名“FirstServlet.java”一致,它只是在对web.xml文件配置的时候我们对servlet应用名字的定义,通过< servlet-class>com.demo.FirstServlet我们就可以定位到这个servlet文件。

四.ServletConfig

ServletConfig代表当前Servlet在web.xml中的配置信息

在Servlet的配置文件中,可以使用一个或多个< init-param>标签为servlet配置一些初始化参数。
当servlet配置了初始化参数后,web容器在创建servlet实例对象时,会自动将这些初始化参数封装到ServletConfig对象中,并在调用servlet的init方法时,将ServletConfig对象传递给servlet。进而,程序员通过ServletConfig对象就可以得到当前servlet的初始化参数信息。

<servlet>    <servlet-name>ServletConfigTest</servlet-name>    <servlet-class>com.demo.servlet.ServletConfigTest</servlet-class>    <init-param>        <param-name>name</param-name>        <param-value>value</param-value>    </init-param>    <init-param>        <param-name>encode</param-name>        <param-value>utf-8</param-value>    </init-param></servlet>
public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {    ServletConfig config = this.getServletConfig();  //拿到init方法中的ServletConfig对象    // --获取当前Servlet 在web.xml中配置的名称(用的不多)    String sName = config.getServletName();    System.out.println("当前Servlet 在web.xml中配置的名称:"+sName);    // --获取当前Servlet中配置的初始化参数(只能获取一个)经常用到    String value = config.getInitParameter("name");    System.out.println(value);    // --获取当前Servlet中配置的初始化参数(全部获取)经常用到    Enumeration enumration = config.getInitParameterNames();    while(enumration.hasMoreElements()){        String name = (String) enumration.nextElement();        String value = config.getInitParameter(name);        System.out.println(name+":"+value);    }}

五.ServletContext

WEB容器在启动时,它会为每个WEB应用程序都创建一个对应的ServletContext对象,它代表当前web应用。

ServletConfig对象中维护了ServletContext对象的引用,可以通过ServletConfig.getServletContext方法获得ServletContext对象。

由于一个WEB应用中的所有Servlet共享同一个ServletContext对象,因此Servlet对象之间可以通过ServletContext对象来实现通讯。ServletContext对象通常也被称之为context域对象。

1.做为域对象可以在整个web应用范围内设置共享数据。

public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {    ServletContext context = this.getServletContext();    context.setAttribute("name", "value");}

2.获取WEB应用的初始化参数
web.xml中

<context-param>      <param-name>name</param-name>      <param-value>value></param-value>  </context-param>  

servlet文件:

public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {    ServletContext context = this.getServletContext(); // 得到上下文对象    // 获取单个的Context里面的初始化参数    String value = context.getInitParameter("name");    System.out.println(value);    //一次性获取Context里所有的初始化参数    Enumeration enumeration = context.getInitParameterNames();    while (enumeration.hasMoreElements()) {        String name = (String) enumeration.nextElement();        String value = context.getInitParameter(name);        System.out.println(name + ";" + value);    }}

六.RequestDispatcher实现Servlet的转发

请求重定向:(两次请求两次响应)这种重定向的方法,将导致客户端浏览器的请求URL跳转。从浏览器中的地址栏中可以看到新的URL地址,作用类似于上面设置HTTP响应头信息的实现。

请求转发:(一次请求一次响应,来实现资源流转)

public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {    RequestDispatcher dispatcher = this.getServletContext().getRequestDispatcher("/servlet/ServletTest2");//拿到转发器dispatcher(参数中写虚拟路径)    dispatcher.forward(request, response); // 执行完这一行代码后,将会跳到ServletTest2中去执行。}
0 0