JavaWeb学习笔记(二)---Servlet协议

来源:互联网 发布:淘宝店铺橱窗推荐 编辑:程序博客网 时间:2024/04/27 05:08

一、Servlet简介
1.概念
  Servlet是运行在Web服务器或应用服务器上的程序,它是作为来自Web浏览器或其他HTTP客户端的请求和HTTP服务器上的数据库或应用程序之间的中间层。
使用 Servlet可以收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页。
2.Servlet架构
Servlet在Web应用程序中的位置

  Sun公司在其API中提供了一个servlet接口,用户若想用发一个动态web资源(即开发一个Java程序向浏览器输出数据),需要完成以下2个步骤:
  (1)编写一个Java类,实现servlet接口。
  (2)把开发好的Java类部署到web服务器中。
  按照一种约定俗成的称呼习惯,通常我们也把实现了servlet接口的java程序,称之为Servlet。

二、Servlet 生命周期
Servlet 生命周期可被定义为从创建直到毁灭的整个过程。以下是 Servlet 遵循的过程:
(1)Servlet 通过调用 init () 方法进行初始化;
(2)Servlet 调用 service() 方法来处理客户端的请求;
(3)Servlet 通过调用 destroy() 方法终止(结束);
(4)最后,Servlet 是由 JVM 的垃圾回收器进行垃圾回收的。

1、init()方法
init()方法只在第一次创建Servlet时被调用,后续每次用户请求时不再调用。
当用户调用一个 Servlet 时,就会创建一个 Servlet 实例,每一个用户请求都会产生一个新的线程,适当的时候移交给 doGet 或 doPost 方法。init()简单地创建或加载一些数据,这些数据将用于Servlet的整个生命周期;

2、service()方法
service() 方法是执行实际任务的主要方法。Servlet 容器(即 Web 服务器)调用 service() 方法来处理来自客户端(浏览器)的请求,并把格式化的响应写回给客户端。
每次服务器接收到一个 Servlet 请求时,服务器会产生一个新的线程并调用服务。service() 方法检查 HTTP 请求类型(GET、POST、PUT、DELETE 等),并在适当的时候调用 doGet、doPost、doPut,doDelete 等方法。

service() 方法由容器调用,在适当的时候调用 doGet、doPost、doPut、doDelete 等方法。所以,不用对 service() 方法做任何动作,只需要根据来自客户端的请求类型来重载 doGet()或 doPost() 即可。

3、doGet()方法
GET 请求来自于一个 URL 的正常请求,或者来自于一个未指定METHOD的HTML表单,它由doGet()方法处理。
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
// Servlet 代码}

4、doPost()方法

POST请求来自于一个特别指定了METHOD为POST的HTML表单,它由doPost()方法处理。

public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
// Servlet 代码}

注:如果不论用户请求类型是get还是post,服务器处理过程完全相同,那么可只在doPost中编写处理过程,在doGet中调用doPost就行了,反之也可以doGet中处理,doPost中调用doGet。如果根据请求类型不同而需要不同的处理,就需要在两个方法中编写不同的处理过程。

5、destroy()方法

destroy()方法只会被调用一次,在 Servlet 生命周期结束时被调用。destroy() 方法可以让您的 Servlet 关闭数据库连接、停止后台线程、把 Cookie 列表或点击计数器写入到磁盘,并执行其他类似的清理活动。
在调用destroy()方法之后,servlet对象被标记为垃圾回收。

三、Servlet接口实现类  
Servlet接口SUN公司定义了两个默认实现类,分别为:GenericServlet、HttpServlet。
  HttpServlet指能够处理HTTP请求的servlet,它在原有Servlet接口上添加了一些与HTTP协议处理方法,它比Servlet接口的功能更为强大。因此开发人员在编写Servlet时,通常应继承这个类,而避免直接去实现Servlet接口。
  HttpServlet在实现Servlet接口时,覆写了service方法,该方法体内的代码会自动判断用户的请求方式,如为GET请求,则调用HttpServlet的doGet方法,如为Post请求,则调用doPost方法。因此,开发人员在编写Servlet时,通常只需要覆写doGet或doPost方法,而不要去覆写service方法。

四、Servlet访问URL映射配置  
由于客户端是通过URL地址访问web服务器中的资源,所以Servlet程序若想被外界访问,必须把servlet程序映射到一个URL地址 上,这个工作在web.xml文件中使用元素和元素完成。
  元素用于注册Servlet,它包含有两个主要的子元素:和,分别用于设置Servlet的注册名称和Servlet的完整类名。
一个元素用于映射一个已注册的Servlet的一个对外访问路径,它包含有两个子元素:和,分别用于指定Servlet的注册名称和Servlet的对外访问路径。例如:

   <servlet>     <servlet-name>Servlet1</servlet-name>     <servlet-class>com.servlet.study.Servlet1</servlet-class>   </servlet>   <servlet-mapping>     <servlet-name>Servlet1</servlet-name>     <url-pattern>/servlet/Servlet1</url-pattern>   </servlet-mapping>

同一个Servlet可以被映射到多个URL上,即多个元素的子元素的设置值可以是同一个Servlet的注册名。

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

<servlet-mapping>    <servlet-name>aaa</servlet-name><url-pattern>/*</url-pattern>

*可以匹配任意的字符,所以此时可以用任意的URL去访问aaa这个Servlet。

匹配规则
(1)精准匹配:如/foo.htm只会匹配foo.htm这个URL;
(2)最长路径匹配:如/foo/*会匹配以foo为前缀的URL;
(3)后缀匹配:如*.htm会匹配所有以.htm为后缀的URL。
按照(1)(2)(3)的顺序直到匹配成功,一次请求只会成功匹配到一个Servlet。
最长路径匹配是指
如果servlet1映射到/foo/*

servlet2映射到/*

那么请求url为/foo/foo.htm时,servlet引擎将调用servlet1.

2.如果某个Servlet的映射路径仅仅为一个正斜杠(/),那么这个Servlet就成为当前Web应用程序的缺省Servlet。
 凡是在web.xml文件中找不到匹配的元素的URL,它们的访问请求都将交给缺省Servlet处理,也就是说,缺省Servlet用于处理所有其他Servlet都不处理的访问请求。

3.如果在元素中配置了一个元素,那么WEB应用程序在启动时,就会装载并创建Servlet的实例对象、以及调用Servlet实例对象的init()方法。

例如:

 <servlet>          <servlet-name>appServlet</servlet-name>          <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>          <init-param>               <param-name>contextConfigLocation</param-name>               <param-value>classpath:applicationContext-servlet.xml</param-value>          </init-param>          <load-on-startup>2</load-on-startup></servlet>

这个配置的意义:

(1)load-on-startup元素标记容器是否在启动的时候就加载这个servlet(实例化并调用其init()方法);

(2)它的值必须是一个整数,表示servlet应该被载入的顺序,即优先级;
(a)当值为0或者大于0时,表示容器在应用启动时就加载并初始化这个servlet;
(b)当值小于0或者没有指定时,则表示容器在该servlet被选择时才会去加载;
(c) 正数的值越小,该servlet的优先级越高,应用启动时就越先加载;
(d)当值相同时,容器就会自己选择顺序来加载。

0 0
原创粉丝点击