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/*等等。

  • 相关阅读:
    windows下虚拟环境安装方法
    用python 将 pymysql操作封装成类
    通过python的logging模块输出日志文件
    详细User-Agent大全
    多个结果显示成一个group_concat函数
    pytest 失败用例重试
    Python selenium 三种等待方式详解
    自定义列标题 case when
    查询结果多个合并一个GROUP_CONCAT(EmployeeName)
    win7_32虚拟机网络设置
  • 原文地址:https://www.cnblogs.com/yy3b2007com/p/5224362.html
Copyright © 2011-2022 走看看