你的位置:首页 > Java教程

[Java教程]Servlet的生命周期+实现方式


    1.Servlet的生命周期:
        (1)被创建:
            默认情况下,Servlet第一次被访问时,被服务器创建。会调用init()方法。
                一个Servlet只会被创建一次。init()方法也只会被调用一次。
                Servlet是单例的。而服务器时多线程的。可能存在线程安全问题。
                  为了避免安全问题,在Servlet中尽量不要定义成员变量。即使定义了。也不要进行其他操作(只能查询)。

            可以配置启动服务器时,创建Servlet
                配置启动创建
                   值:
                       0和正整数:在服务器启动时创建
                           数字越小 优先级越高
                       负整数:-1是默认值。在第一次被访问时创建
                <load-on-startup>2</load-on-startup>
            
         (2)提供服务:
                每一次被被访问,都会调用service方法提供服务。调用多次。
                提供服务:
                    1.获取请求消息数据
                    2.设置响应消息数据
        
         (3)被销毁:
             服务器关闭时,servlet被销毁。
            
             服务器正常关闭前,会销毁Servlet,在销毁之前,会调用destory()方法。只调用一次。


    2.Servlet的实现方式:
        (1)实现Servlet接口:
            * ServletConfig:Servlet配置对象
                * getInitParameter(String name) :获取servlet的初始化参数值
                * Enumeration getInitParameterNames() :获取servlet的初始化参数的名称枚举
                * ServletContext getServletContext()  :获取ServletContext
                * String getServletName() :获取Servlet名称
                
                * 服务器创建的。
                * 对于getServletConfig()的实现。
                    1.定义成员变量。ServletConfig config
                    2.在init 方法中 对其赋值
                    3.在getServletConfig() 返回成员变量。
 
        (2)继承GenericServlet:
              优化1:对于getServletConfig()的实现。
                在该类中,init方法有两个,一个有参的,一个无参的。我们要复写无参的。
            
              优化2:实现了ServletConfig 接口
                我们可以通过简单方式获取ServletContext对象。
                    
                    
        (3)继承HTTPServlet:对HTTP协议的封装。
            // 1.获取请求方式
            String method = req.getMethod();
            //2.根据方式的不同,执行不同的操作
            if("GET".equals(method)){
                //get方式的代码
                doGet(req,resp);
            }else if("POST".equals(method)){
                //get方式的代码
                doPost(req,resp);
            }
            
            以后我们需要复写 doGet()和 doPost();

 

  代码演示:

 1 import java.io.IOException; 2  3 import javax.servlet.Servlet; 4 import javax.servlet.ServletConfig; 5 import javax.servlet.ServletException; 6 import javax.servlet.ServletRequest; 7 import javax.servlet.ServletResponse; 8  9 10 public class ServletTest implements Servlet {11 12   /**13    * 初始化方法。Servlet创建之后调用,调用一次14   */15   public void init(ServletConfig config) throws ServletException {16 17     System.out.println("init() 被调用了。。。");18   }19 20   /**21    * 获取ServletConfig对象的方法22   */23   public ServletConfig getServletConfig() {24     // TODO Auto-generated method stub25     return null;26   }27 28   /**29    * 提供服务的方法,调用多次30   */31   public void service(ServletRequest req, ServletResponse res)32       throws ServletException, IOException {33 34     res.setContentType(getServletInfo());35     String ip = req.getRemoteAddr();36     System.out.println(req.getRemoteAddr() +"哎呀,怎么就被访问了呢?!。。。。。。");37     if("192.168.1.65".equals(ip)){38       res.getWriter().write("<h1>你被和谐了!。。。</h1>");39       return;40     }41     res.getWriter().write("<h3>haha Servlet</h3>");42     43   }44 45   /**46    * 获取Servlet信息的方法。如:版本号,作者等47   */48   public String getServletInfo() {49     // TODO Auto-generated method stub50     return null;51   }52 53   /**54    * 销毁方法 调用一次。55   */56   public void destroy() {57 58     System.out.println("destroy() 要挂了...");59   }60 61 62 }

 

  

 1 <??> 2 <web-app version="2.5"  3   ="http://java.sun.com/  4   ="http://www.w3.org/2001/  5   xsi:schemaLocation="http://java.sun.com/ 6   http://java.sun.com/> 7   8  <servlet> 9     <servlet-name>one</servlet-name>10     <servlet-class>Serlet.ServletTest</servlet-class>  11   <load-on-startup>5</load-on-startup>12   </servlet>13   <servlet-mapping>14     <servlet-name>one</servlet-name>15     <url-pattern>/one</url-pattern>16   </servlet-mapping>17 18  <display-name></display-name>  19  <welcome-file-list>20   <welcome-file>index.jsp</welcome-file>21  </welcome-file-list>22 </web-app>