zoukankan      html  css  js  c++  java
  • Java Servlet(二):servlet配置及生命周期相关(jdk7+tomcat7+eclipse)

    该篇文章记录了Servlet配置相关用法及Servlet在Servlet容器中生命周期方法。

    • Tomcat是一个Servlet容器:

    1、Servlet容器管理了Servlet的整个生命周期,并调用servlet的生命周期的方法。

    2、Servlet容器不只是Servlet的生命周期,而且还是Jsp,Filter,Listener,Tag等生命周期管理容器。

    • Servlet的注册与运行

    1、Servlet程序必须通过Servlet容器来启动运行,并且存储目录有特殊要求,通常servlet编译好的.class文件要存储在<WEB应用程序目录>WEB-INFclasses目录中。

    2、Servlet程序必须在WEB应用程序的web.xml文件中进行注册和映射其访问路径,才可以被Servlet引擎加载被外界访问。

    3、一个<servlet>元素用户注册一个Servlet,它包含有两个主要的子元素:<servlet-name>和<servlet-class>,分别用户设置Servlet的注册名称和Servlet的完整类名。

    4、一个<servlet-mapping>元素用于映射一个已注册的Servlet的一个对外访问路径,它包含有两个子元素:<servlet-name>和<url-pattern>,分别用户指定Servlet的注册名称和Servlet的对外访问路径。

    • Servlet容器相应客户请求的过程:

    1、servlet引擎检查是否已经装载被创建该servlet的实例对象。如果已经创建,则直接执行第4步;否则,执行第2步。

    2、装载并创建该servlet的一个实例对象:调用该servlet的构造函数。

    3、调用servlet实例对象的init方法。

    4、创建一个用于封装请求的ServletRequest对象和一个代表相应消息的ServletResponse对象,然后调用Servlet的service方法并将请求和相应对象作为参数传递进去。

    5、web应用程序被停止或者重启之前,servlet引擎将卸载servlet,并在卸载之前调用servlet的destory方法。

    • Servlet生命周期的方法(以下方法都是有Servlet容器负责调用):

    1、首先是创建实例时调用构造器:只被调用一次,只有第一次请求Servlet时,创建Servlet的实例,调用构造器。
    2、init方法:只被调用一次,在创建好Servlet实例后立即调用init函数,用户初始化当前Servlet实例

    3、service方法:被多次调用,每次请求都会被调用,用于相应请求。

    4、destory方法:只被调用一次,在当前servlet所在的web应用被卸载前调用,用于释放servlet所占用的资源。

    • Servlet配置需要注意事项:

    servlet节点下的load-on-startup配置:

    1、可以指定servlet被创建的时机;

    2、默认该参数为负数,在加载web应用时,不加载servlet实例,而在第一次请求时被创建;

    3、若为0或者正数,则在当前WEB应用被servlet加载时创建家实例,且值越小越早被创建。

    配置示例:

     1 <!-- 配置和映射 servlet -->
     2     <servlet>
     3         <!-- Servlet注册的名字 -->
     4         <servlet-name>helloServlet</servlet-name>
     5         <!-- Servlet全类名 -->
     6         <servlet-class>com.dx.hello.HelloServlet</servlet-class>
     7         <load-on-startup>1</load-on-startup>
     8     </servlet>
     9     <servlet-mapping>
    10         <!-- 对应servlet节点下的servlet-name的注册名字一致 -->
    11         <servlet-name>helloServlet</servlet-name>
    12         <!-- 映射具体的访问路径,其中/代表当前web的根目录 -->
    13         <url-pattern>/hello</url-pattern>
    14     </servlet-mapping>
    • Servlet映射的细节:

    1、同一个Servlet可以被映射到多个URL上,即多个<servlet-mapping>元素的<servlet-name>子元素的设置值可以是同一个Servlet的注册名。

    比如:

     1 <!-- 配置和映射 servlet -->
     2     <servlet>
     3         <!-- Servlet注册的名字 -->
     4         <servlet-name>helloServlet</servlet-name>
     5         <!-- Servlet全类名 -->
     6         <servlet-class>com.dx.hello.HelloServlet</servlet-class>
     7         <load-on-startup>1</load-on-startup>
     8     </servlet>
     9     <servlet-mapping>
    10         <!-- 对应servlet节点下的servlet-name的注册名字一致 -->
    11         <servlet-name>helloServlet</servlet-name>
    12         <!-- 映射具体的访问路径,其中/代表当前web的根目录 -->
    13         <url-pattern>/hello</url-pattern>
    14     </servlet-mapping>
    15     <servlet-mapping>
    16         <!-- 对应servlet节点下的servlet-name的注册名字一致 -->
    17         <servlet-name>helloServlet</servlet-name>
    18         <!-- 映射具体的访问路径,其中/代表当前web的根目录 -->
    19         <url-pattern>/hello2</url-pattern>
    20     </servlet-mapping>

    这样子就可以通过http://localhost:8080/MyServlet001/hello和http://localhost:8080/MyServlet001/hello2访问同一个servlet。

    2、在Servlet映射到URL中也可以使用*通配符,但是只能有两种固定的格式:一种是“*.扩展名”,另外一种是以正斜杠“/”开头并以“/”结尾。

    比如:

     1 <servlet-mapping>
     2         <!-- 对应servlet节点下的servlet-name的注册名字一致 -->
     3         <servlet-name>helloServlet2</servlet-name>
     4         <!-- 映射具体的访问路径,其中/代表当前web的根目录 -->
     5         <url-pattern>*.do</url-pattern>
     6         <!-- <url-pattern>*.html</url-pattern> -->
     7     </servlet-mapping>
     8     <servlet-mapping>
     9         <!-- 对应servlet节点下的servlet-name的注册名字一致 -->
    10         <servlet-name>helloServlet1</servlet-name>
    11         <!-- 映射具体的访问路径,其中/代表当前web的根目录 -->
    12         <url-pattern>/hello2/*</url-pattern>
    13         <!-- <url-pattern>/*</url-pattern> -->
    14     </servlet-mapping>

    但需要注意事项:

    1、*.html这样写是没有问题的,如果配置为/*.html或者/*.action、/*.do等格式的,是错误的配置,加载时会跑出异常信息。

    2、若果配置为*没有后缀名,则必须浅表带/,格式为:/*或者/a/*等等。

  • 相关阅读:
    48. Rotate Image
    83. Remove Duplicates from Sorted List
    46. Permutations
    HTML5笔记
    18. 4Sum
    24. Swap Nodes in Pairs
    42. Trapping Rain Water
    Python modf() 函数
    Python min() 函数
    Python max() 函数
  • 原文地址:https://www.cnblogs.com/yy3b2007com/p/5224362.html
Copyright © 2011-2022 走看看