servlet

一.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中去执行。
}
发布了24 篇原创文章 · 获赞 19 · 访问量 8万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章