servlet小结

来源:互联网 发布:java更换jdk版本 编辑:程序博客网 时间:2024/05/21 22:32

servlet小结  

2011-03-02 14:23:19|  分类: Java|字号 订阅

今天我就来把Servlet这块捋一捋。 
1 .首先,什么是Servlet? 
       Servlet是一个Java编写的程序,此程序是在服务器端运行的,是按照Servlet规范编写的一个Java类。


   2.Servlet是做什么的? 
       Servlet是处理客户端的请求并将其发送到客户端。


   3.Servlet API


   1> Servlet框架的组成 
        Servlet框架是由2个Java包组成:(1)javax.servlet和(2)javax.servlet.http 
       (1) javax.servlet包中定义了所有Servlet类都必须实现的接口和类。 
          javax.servlet包的接口为: 
                            ServletConfig接口  ---- 在初始化过程中由Servlet容器使用 
                            ServletContext接口  ---- 定义Servlet用于获取容器信息的方法 
                            ServletRequest接口 ---- 向服务器请求信息 
                            ServletResponse接口 ----  响应客户端请求 
                             Servlet接口  ---- 定义所有Servlet必须实现的方法 
          javax.servlet包中的类为: 
                              ServletInputStream类  ---- 用于从客户端读取二进制数据 
                              ServletOutputStream类  ---- 用于将二进制数据发送到客户端 
                               GenericServlet类  ---- 抽象类,定义一个通用的,独立于地层协议的Servlet。 

       (2) javax.servlet.http包中定义了采用HTTP通信的HttpServlet类。 
          javax.servlet.http包的接口为: 
                         HttpServletRequest接口  ---- 提供http请求 
                         HttpServletResponse接口  ---- 提供http响应 
                         HttpSession接口  ---- 用于标识客户端并存储有关客户信息 
                         HttpSessionAttributeListener接口  ----实现这个侦听接口用户获取会话的属性列表的改变的通知 
          javax.servlet.http包中的类: 
                         HttpServlet类 ---- 扩展了 GenericServlet的抽象类,用于扩展创建Http Servlet 
                          Cookie类  ---- 创建一个Cookie,用于存储Servlet发送给客户端的信息 
                                                      
   2> Servlet框架的核心 
        Servlet框架的核心是:javax.servlet.Servlet接口,所有的Servlet都必须实现这一接口。


   4. Http Servlet 
       HttpServlet是一个抽象类,用来创建用户自己的 HTTP Servlet。HttpServlet类的子类必须至少重写一下方法中的一个:doGet()和doPost()。 

      HttpServlet类提供doGet()方法来处理GET请求 
        public void doGet(HttpServletRequest req,HttpServletResponse res) 
              提供doPost()方法处理POST请求  
        public void doPost(HttpServletRequest req,HttpServletResponse res) 
        其中有2个参数:HttpServletRequset和HttpServlerResponse 
         这2个类实现了ServlerRequset接口和ServletResponse接口 
        ServletRequest接口中封装了客户请求信息<客户请求方式,参数名,参数值等> 
        ServletResponse接口 为 Servlet提供了返回相应结果的方法。 
    

5. Servlet体系结构 
          Servlet-->GenericServlet-->HttpServlet-->用户自定义的Servlet 
    

 6. Servlet的生命周期 
         Servlet的生命周期由Servlet容器控制,该容器创建Servlet的实例。 
         Servlet生命周期就是指创建Servlet实例后响应客户请求直至销毁的全过程。 
        

1> Serlvet生命周期的三个方法:init()-->service()-->destroy() 
        

2> 生命周期的各个阶段: 
            实例化:Servlet容器创建Servlet类的实例对象 
            初始化:Servlet容器调用Servlet的init()方法 
            服务:如果请求Servlet,则容器调用service()方法 
            销毁:销毁实例之前调用destroy()方法 
            不可用:销毁实例并标记为垃圾处理 


 

Servlet 是个特殊的Java 类,这个Java 类必须继承HttpServlet 。每个Servlet 可以响应客户端的请求。Servlet 提供不同的方法用于响应客户端请求。 
? doGet: 用于响应客户端的get 请求。 
? doPost: 用于响应客户端的post 请求。 
? doPut: 用于响应客户端的put 请求。 
? doDelete: 用于响应客户端的delete 请求。


事实上,客户端的请求通常只有get 和post 两种; Servlet 为了响应这两种请求,必须重写doGet 和doPost 两个方法。如果Servlet 为了响应四个方法,则需要同时重写上面的四个方法。


大部分时候, Servlet 对于所有请求的响应都是完全一样的。此时,可以采用重写一个方法来代替上面的几个方法, Servlet 只需重写service 方法即可响应客户端的所有请求。


另外, HttpServlet 还包含两个方法。 
? init(ServletConfig config): 创建Servlet 实例时,调用的初始化方法。 
? destroy(): 销毁Servlet 实例时,自动调用的资源回收方法。 
通常无须重写init()和destroy()两个方法,除非需要在初始化Servlet 时,完成某些资源初始化的方法,才考虑重写init 方法。如果需要在销毁Servlet 之前,先完成某些资源的回收,比如关闭数据库连接等,才需要重写destroy 方法。

 
注意:如果重写了init(ServletConfig config)方法,则应在重写该方法的第一行调用super.init(config) 。该方法将调用HttpServlet 的init 方法。


Servlet 和JSP 的区别在于: 
? Servlet 中没有内置对象,原来JSP 中的内置对象都必须通过HttpServletRequest对象,或由HttpServletResponse 对象生成; 
? 对于静态的HTML 标签, Servlet 都必须使用页面输出流逐行输出。 
JSP 是Servlet 的一种简化,使用JSP 只需要完成程序员需要输出到客户端的内容,至于JSP 中的Java 脚本如何镶嵌到一个类中,由JSP 容器完成。而Servlet 则是个完整的Java 类,这个类的service 方法用于生成对客户端的响应。


编辑好的Servlet 源文件并不能响应用户请求,还必须将其编译成class 文件。将编译后的FirstServlet. class 文件放在WEB-INF/classes 路径下,如果Servlet 有包,则还应该将class 文件放在对应的包路径下。


为了让Servlet 能响应用户请求,还必须将Servlet 配置在Web 应用中。配置Servlet时,需要修改web.xrnl 文件。 
配置Servlet 需要配置两个部分。


·配置Servlet 的名字:对应web.xml 文件中的<servlet/>元素。 
·配置Servlet 的URL: 对应web.xml 文件中的<servlet-mapping/>元素。 
因此,配置一个能响应客户请求的Servlet ,至少需要配置两个元素,例: 
Xml代码 
<! -- 配置Servlet 的名字-->  
<servlet>  
<! -- 指定Servlet 的名字-->  
<servlet-name>firstServlet</servlet-name>  
<! -- 指定Servlet 的实现类--〉   
<servlet-class>lee.FirstServlet</servlet-class>  
</servlet>  
<! -- 配置Servlet 的URL-->  
<servlet-mapping>  
<!--指定Servlet 的名字-->  
<servlet-name>firstServlet</servlet-name>  
<!--指定Servlet 映射的URL 地址-->  
<url-pattern>/firstServlet</url-pattern>  
</servlet-mapping>  

<! -- 配置Servlet 的名字-->  <servlet>  <! -- 指定Servlet 的名字-->  <servlet-name>firstServlet</servlet-name>  <! -- 指定Servlet 的实现类--〉  <servlet-class>lee.FirstServlet</servlet-class>  </servlet>  <! -- 配置Servlet 的URL-->  <servlet-mapping>  <!--指定Servlet 的名字-->  <servlet-name>firstServlet</servlet-name>  <!--指定Servlet 映射的URL 地址-->  <url-pattern>/firstServlet</url-pattern>  </servlet-mapping>


Servlet 的创建有两个选择。 
·客户端请求对应的Servlet 时,创建Servlet 实例:大部分的Servlet 都是这种Servlet 。 
? Web 应用启动时,立即创建Servlet 实例:即load-on-startup Servlet 。 
每个Servlet 的运行都遵循如下生命周期。 
(1)创建Servlet 实例。 
(2) Web 容器调用Servlet 的init 方法,对Servlet 进行初始化。 
(3) Servlet 初始化后,将一直存在于容器中,用于响应客户端请求。如果客户端有get 请求,容器调用Servlet 的doGet 方法处理并响应请求。对于不同的请求,有不同的处理方法,或者统一使用service 方法处理来响应用户请求。 
(4) Web 容器角色销毁Servlet 时,调用Servlet 的destroy 方法,通常在关闭Web容器之时销毁Servlet。 
Servlet生命周期: 
开始-->创建实例完成-->初始化-->响应客户端请求-->被销毁-->结束 
在标准的MVC 模式中, Servlet 仅作为控制器使用。 
M: Model,即模型,对应JavaBean 。 
V: View ,即视图,对应JSP 页面。 
C: Controller,即控制器,对应Servlet。 
load-on-startup Servlet


Servlet 的实例化有两个时机:用户请求之时,或应用启动之时。应用启动时就启动的Servlet 通常是用于某些后台服务的Servlet ,或者拦截很多请求的Servlet; 这种Servlet 通常作为应用的基础Servlet 使用,提供重要的后台服务。


如果需要Web 应用启动时,可使用load-on-startup 元素完成Servlet 的初始化。load-on-startup 元素只接收一个整型值,这个整型值越小, Servlet 就越优先初始化。


Xml代码 
<servlet>  
<! -- Servlet 名-->  
<servlet-name>timerServlet</servlet-name>  
<!-- Servlet 的实现类-->  
<servlet-class>lee.TimerServlet</servlet-class>  
<!-- 配置应用启动时,创建Servlet 实例-->  
<load-on-startup>l</load-on-startup>  
</servlet>  

<servlet>  <! -- Servlet 名-->  <servlet-name>timerServlet</servlet-name>  <!-- Servlet 的实现类-->  <servlet-class>lee.TimerServlet</servlet-class>  <!-- 配置应用启动时,创建Servlet 实例-->  <load-on-startup>l</load-on-startup>  </servlet>

该Servlet 将一直作为后台服务执行。 
访问Servlet 的配置参数: 
访问Servlet 配置参数要通过ServletConfig 类的实例完成, ServletConfig提供如下 
方法。 
? java.lang.String getInitParameter(java.lang.String name): 用于获取初始化参数。 
注意: JSP 的内直对象config 就是此处的ServletConfig 
Jsp代码 复制代码
//获取ServletConfig对象   
ServletConfig config = getServletConfig();   
//通过ServletConfig对象获取配置参数: dirver   
String driver = config.getInitParameter("driver");  

//获取ServletConfig对象  ServletConfig config = getServletConfig();  //通过ServletConfig对象获取配置参数: dirver  String driver = config.getInitParameter("driver");


Servlet 访问配置参数的方式非常类似于application方式。只是application 的配置参 
数对整个Web 应用有效,而Servlet 配置参数仅对该Servlet 有效,下面是配置该Servlet的配置片段: 
Xml代码 
<servlet>  
<!--配置Servlet 名-->  
<servlet-name>testServlet</servlet-name>  
<!--指定Servlet 的实现类-->  
<servlet-class>lee.TestServlet</servlet-class>  
<!--配置Servlet 的初始化参数: driver-->  
<init-param>  
<param-name>driver</param-name>  
<param-value>com.mysql.jdbc.Driver</param-value>  
</init-param>  
</servlet>  
<servlet-mapping>  
<!--确定Servlet 名-->  
<servlet-name>testServlet</servlet-name>  
<!--配置Servlet 映射的URL-->  
<url-pattern>/testServlet</url-pattern>  
</servlet-mapping>  

原创粉丝点击