Servlet
您目前处于:笔记  2013-06-28

Servlet是用Java编写的应用程序,在服务器上运行,处理请求的信息并将其发送到客户端。Servlet在初始化后驻留内存,因此没做请求时无需加载。

1. HTTP基础

用户的请求和Web应用通过Internet从一台计算机发送到另一个台计算机或服务器,使用超文本传输协议HTTP,HTTP是一个客户端和服务器请求和答应的标准。

Get和Post方法

HTTP请求消息使用Get和Post方法在Web上传输请求。

检索信息时用Get方法,要检索的信息作为字符序列传递,称为查询字符串,因此传递的数据对客户端是可见的,即将查询字符串附加到URL中,但查询字符串有长度限制,最多1024字节。

Post方法是HTTP定义的另一种请求方法,使用Post发送数据对客户端是不可见的,且对数据量没有限制。

比较Get与Post方法

Get方法是从服务器上获取数据,Post是向服务器传送数据;

在客户端,Get通过URL提交数据,数据在URL可见,Post把数据放在form数据体内提交;

Get提交的数据最多只有1024字节,Post没有数据量限制;

使用Get时,参数显示在地址栏,而Post不会,所以,如果数据是非敏感的,使用Get,反之使用Post。

2. Servlet简介

当使用交互式Web应用时,Web服务器接收会话请求,处理请求和访问数据,并生成结果返回显示,servlet就是用于该过程的。

Java Servlet是为响应Web应用程序上下文中的HTTP请求而设计的。在创建一个Java Servlet时,一般需要子类HttpServlet,当用户通过URL发送一个请求时,Java运行环境(JRE)将结果包装在一个HttpServletResponse中,然后将原HTTP响应送回给发处该请求的客户机。在与Web应用进行交互式,通常是多个请求并获得响应,所有这些都是在一个会话语境中,Java语言将之包装在一个HttpSession对象中。

容器(如Tomcat)将为Servlet容器管理运行时环境。通过容器中的各种配置文件,在URL与服务器端组件之间搭建了一座桥梁,这些组件处理URL请求。在运行时,容器将加载并初始化servlet,管理其生命周期。

3. 一个简单的servlet

声明类

Servlet是一个类。

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class HelloWorldServlet extends HttpServlet {
    public void service(HttpServletRequest request, HttpServletResponse response)
              throws ServletException, IOException {
         PrintWriter writer = response.getWriter();
         writer.println("Hello, World!");
         writer.close();
    }
}

其中javax.servlet.*是存放与HTTP协议无关的一般性Servlet类;javax.servlet.http.*增加了与HTTP协议有关的功能。

所有Servlet必须实现javax.servlet.Servlet接口,但通常选择实现javax.servlet.GenericServlet或javax.servlet.http.HttpServlet,如果写的Servlet代码与HTTP协议无关,必须继承GenericServlet类;若有关,必须继承HttpServlet类。

javax.servlet.*里面的ServletRequest和ServletResponse接口提供存储一般的请求和响应;而javax.servlet.http.*里面的HttpServletRequest和HttpServletResponse接口提供HTTP请求及响应的存取服务。

配置web.xml

<web-app>
    <servlet>
        <servlet-name>hello</servlet-name>
        <servlet-class>servlet.HelloWorldServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>
</web-app>

Servlet的配置需要配置两个标签<servlet>和<servlet-mapping>。

对于<servlet>,配置servlet的名字,所要调用的Java类,还有Servlet初始化时传入的参数。对于<servlet-mapping>,制订了Servlet名字,然后设置url连接,这里Servlet名字必须和上面的<servlet>标签中的<servlet-mapping>的值一致。

当在页面中设定的连接和<url-pattern>中设定的值一致时,则会通过<servlet-name>找到对应的Servlet类来运行。

4. Servlet体系结构

Servlet容器将Servlet动态加载到服务器,HTTP Servlet使用HTTP请求和HTTP响应与客户端进行交互。因此Servlet容器支持请求和响应的HTTP协议。

客户端对Servlet的请求首先会被HTTP服务器接收,HTTP服务器将客户的HTTP请求提交Servlet容器,Servlet容器调用响应的Servlet,Servlet做出响应传递到Servlet容器,并进而有HTTP服务器将响应传给客户端。

Tomcat容器模型

Tomcat是一个小型的轻量级应用服务器,具有处理HTML的功能,同时它是一个Servlet和JSP容器,Tomcat就是HTTP服务器和Servlet容器的两个部分。

5. Servlet层次结构

Servlet是实现javax.servlet.Servlet接口的对象,大多数Servlet通过从GenericServlet或HttpServlet类来进行扩展实现,Servlet API包含两个包:javax.servlet和javax.servlet.http。

6. Servlet生命周期

Servlet运行在Servlet容器中,其生命周期由容器管理。Servlet的生命周期通过javax.servlet.Servlet接口的init()、service()和destroy()方法来表示。

Servlet生命周期包含4个阶段:

加载和实例化

Servlet容器负责加载和实例化Servlet。容器通过Java反射API来创建Servlet实例。

初始化

在Servlet实例化后,容器调用Servlet的init()方法初始化这个对象,初始化的目的是为了让Servlet对象在处理客户端请求前完成一些初始化工作。对于每一个Servlet实例,init()方法只被调用一次。

处理请求

Servlet容器调用Servlet的service()方法对请求进行处理。在service()方法中,通过ServletRequest对象得到客户端的相关信息和请求信息,在对请求进行处理后,调用ServletResponse对象的方法设置响应信息。对于HttpServlet类,该方法作为HTTP请求的分发器,这个方法在任何时候都不能被重载。在请求到来时,service()方法决定请求的类型(GET、POST,并发请求分发给相应的处理方法(doGet()、doPost())。

服务停止

当容器检测到一个Servlet实例应该从服务器中移除的时候,容器会调用实例的destroy()方法,以便让实力可以释放它所使用的资源。让需要释放容器或者容器被关闭时,容器就会调用Servlet实例的destroy()方法。在调用destroy()方法后,容器会释放这个Servlet实例,该实例随后被Java的垃圾收集器回收。


转载请并标注: “本文转载自 linkedkeeper.com ”  ©著作权归作者所有