JavaWeb之Servlet配置及生命周期方法

 
Servlet 简介
  1. java Servlet是和平台无关的服务器端组件,它运行在Servlet容器中。
  2. Servlet容器负责Servlet和客户的通信以及调用Servlet的方法,Servlet和客户端的通信采用“请求/响应”的模式。
  3. Servlet可完成如下功能:
         -创建并返回基于客户请求的 动态HTML页面;
         -创建可嵌入到现有HTML页面中的部分HTML页面(HTML片段);
         -与其他服务器资源(如数据库或基于java的应用程序)进行通信。

Servlet 容器:运行Servlet、JSP、Filter等的软件环境
  1. 可以创建Servlet,并调用Servlet 的相关生命周期方法
  2. JSP ,Filter ,Listenter ,Tag。。。。

Servlet 生命周期的方法:以下方法都是由Servlet容器自动调用
  1. 构造器:只有第一次请求Servlet 时 ,创建Servlet的实例。调用构造器。说明 Servlet是单实例的
  2. init 方法: 只被调用一次 ,,在创建好实例后立即被调用,用于初始化当前的Servlet。
  3. service:被多次调用,每次请求都会调用service方法,实际用于响应请求。
  4. destroy:只被调用一次,在当前Servlet所在的WEB应用被卸载前调用,用于释放当前Servlet所占用的资源

load-on-startup:参数
  1. 配置在Servlet节点中:
< servlet >
             < servlet-name > helloServlet </ servlet-name >
             < servlet-class > HelloServletOne </ servlet-class >
             < load-on-startup > 1 </ load-on-startup >
  </ servlet >
  1. load-on-startup :可以指定Servlet被创建的时机,若为负数,则在第一次请求时被创建,若为0或正数,则则在当前Web应用被Servlet容器加载时创建实例,且数值越小越早被创建。

Servlet容器响应客户请求的过程
  1. Servlet引擎检查是否已经装载并创建了该Servlet的实例对象。如果是,则直接执行第4步,否则执行第2步;
  2. 装载并创建该Servlet的一个实例对象:调用该Servlet的构造器;
  3. 调用Servlet实例对象的 init()方法;
  4. 创建一个用于封装请求的ServletRequest对象和一个代表响应消息的ServletRequest对象,然后调用Servlet的 service() 方法并将请求和响应对象作为参数 传递进去;
  5. Web应用程序被停止或重新启动之前,Servlet引擎将卸载Servlet,并在卸载之前调用Servlet的 destroy() 方法。

Servlet的注册与运行
  1. Servlet程序必须通过Servlet容器来启动运行,并且存储目录有特殊要求,通过需要存储在 <WEB应用程序目录>\WEB-INF\classes\ 目录中
  2. Servlet程序必须在WEB应用程序的 web.xml文件中进行 注册和映射其访问路径,才可以被Servlet引擎加载和被外界访问;
  3. 一个 <servlet></servlet>元素用于注册一个Servlet,它包含两个主要的子元素: <servlet-name></servlet-name> 和 <servlet-class></servlet-class>,分别用于设置Servlet的 注册名称和Servlet的 完整类名
  4. 一个 <servlet-mapping></servlet-mapping>元素用于映射一个已注册的Servlet的一个对外访问路径,它包含两个子元素: <servlet-name></servlet-name> 和 <url-pattern></url-pattern>,分别用于指定Servlet的 注册名称和Servlet的 对外访问路径

Servlet映射的细节
  1. 同一个Servlet可以被映射到对个URL上,即多个<servlet-mapping>元素的<servlet-name>子元素的设置值可以是同一个Servlet的注册名;
  2. 在Servlet映射到的URL中也可以使用 * 通配符,但是只能有两种固定格式:A、 *.扩展名      B、以正斜杠( / )开头并以 " /* " 结尾。

ServletConfig :
[x] 封装了Servlet 的配置信息,并且可以获取 ServletContext 对象
  1. 配置Servlet 的初始化参数
   <servlet>
             < servlet-name > helloServlet </ servlet-name >
             < servlet-class > HelloServletOne </ servlet-class >
            
             <!--  配置 Servlet 的初始或参数  ,并且该节点必须在 load-on-startup 节点之前-->
             < init-param >
                         <!-- 参数名 -->
                         < param-name > user </ param-name >
                         <!-- 参数值 -->
                         < param-value > root </ param-value >
             </ init-param >
             < init-param >
                         < param-name > password </ param-name >
                         < param-value > long </ param-value >
             </ init-param >
            
             < load-on-startup > 1 </ load-on-startup >
  </ servlet >
  1. 获取初始化参数
            > getInitParameter(String name) :获取指定参数名的初始化参数
            > getInitParameterNames()  :获取参数名组成的 Enumeration 对象。
public void init( ServletConfig servletConfig ) throws ServletException {
                         // TODO Auto-generated method stub
                         System . out . println ( "init.........." ) ;
                         String user = servletConfig . getInitParameter ( "user" ) ;
                         System . out . println ( "user:" + user ) ;
                        
                         Enumeration < String > names   = servletConfig . getInitParameterNames () ;
                         while ( names . hasMoreElements ()) {
                                     String name = names . nextElement () ;
                                     String value = servletConfig . getInitParameter ( name ) ;
                                     System . out . println ( "****" + name + "->" + value ) ;
                         }
             }
  1. 获取Servlet的注册(配置)名:
String servletname = servletConfig . getServletName () ;
                         System . out . println ( "servletname:  " + servletname ) ;
ServletContext
ServletContext接口:
  1. Servlet引擎为 每个WEB应用程序都创建一个对应的 ServletContext对象,ServletContext对象被 包含在ServletConfig对象中,调用 ServletConfig.getServletContext 方法返回ServletContext 对象的引用。
  2. 由于一个WEB应用程序中的所有Servlet都共享同一个ServletContext对象,所以,ServletContext对象被称之为application对象(Web应用程序对象)。
  3. 功能
    1. 获取WEB应用程序的初始化参数
<!-- 设置当前WEB 应用 的初始化参数-->
 <!-- 可以被所有Servlet 所获取 ,而Servlet中的初始化参数,只能被其本身的Servlet所获取-->
  < context-param >
             < param-name > driverlong </ param-name >
             < param-value > com.mysql.jdbc.Driver </ param-value >
  </ context-param >
 
  < context-param >
             < param-name > jdbcURL </ param-name >
             < param-value > jdbc:mysql:/// atguigu </ param-value >
  </ context-param >

/*获取ServletContext 对象*/
                         ServletContext servletContext = servletConfig . getServletContext () ;
                        
                         String driver = servletContext . getInitParameter ( "driverlong" ) ;
                         System . out . println ( "driver :" + driver ) ;
                        
                         Enumeration < String > namesTwo = servletContext . getInitParameterNames () ;
                         while ( namesTwo . hasMoreElements ()){
                                     String name = namesTwo . nextElement () ;
                                     System . out . println ( "***" + name ) ;
                         }
/* rusult
* driver :com.mysql.jdbc.Driver
* ***driverlong
* ***jdbcURL
*/

  • 记录日志
  • application域范围的属性
  • 访问资源文件
  • 获取虚拟路径所映射的本地路径
  • WEB应用程序之间的访问
  • ServletContext的其他方法
  1. 获取当前WEB 应用程序的某个文件在服务器上的绝对路径:
        getRealPath (String Path )
String path = servletContext . getRealPath ( "/01.png" ) ;
System . out . println ( "01.png 's path:-->" + path ) ;


  1. 获取当前 WEB 应用的名称:
        getContextPath ()
String contextPath = servletContext . getContextPath () ;
System . out . println ( "contextPath:-->" + contextPath ) ;
  1. 获取当前WEB 应用中某个文件对应的输入流:
         getResourceAsStream (String Path )
try {
                 ClassLoader classloader = getClass () . getClassLoader () ;
                  InputStream is = classloader . getResourceAsStream ( "jdbc.properties" ) ;
                 System . out . println ( "1." + is ) ;
} catch ( Exception e) {
                 // TODO Auto-generated catch block
                 e . printStackTrace () ;
}
try {
                InputStream is2 = servletContext . getResourceAsStream ( "/WEB-INF/classes/jdbc.properties" ) ;
                System . out . println ( "2." + is2 ) ;
} catch ( Exception e) {
                // TODO Auto-generated catch block
                e . printStackTrace () ;
}

猜你喜欢

转载自blog.csdn.net/long_zhiqi/article/details/80055178
今日推荐