什么是Servlet
是运行在Web服务器或应用服务器上的Java程序
在Web上创建动态内容的有效而强大的解决方案
由容器来管理生命周期与Web服务器交互
由Sun规范了其功能
Servlet规范的组成
Web应用程序:Servlet被规定为一个称为Web应用程序的大型项目中的一部分。Web应用程序是一个Web站点的完整资料集合。Web应用程序可以由零个、一个或者多个Servlet组成,Servlet容器负责管理Servlet。Web应用程序及其配置文件在Servlet规范中有详细说明。
Servlet与HTTPServlet:Servlet规范的主要作用就是定义一个与C/S(客户端/服务器)模型类似的发送内容到客户端的健壮机制。Servlet主要用于创建动态Web内容,并且天生支持HTTP。
过滤器:过滤器在Servlet2.3规范中开始引入。过滤器提供了一个抽象的方法,在客户端对的请求、响应达到请求的终点时控制它、过滤器很好地补充了Servlet,它通常用在审核、内容压缩日志等方面。
安全:Servlet已经使用了java虚拟机提供的安全功能,但是Servlet规范同时还定义了控制访问Web应用程序资源的一种机制。
国际化:Servlet最杰出的功能之一就是能够开发任何语言的内容。这种功能大部分直接来自于Java平台的国际化和本地化支持。Servlet API保持了这项功能,并且能够轻松地李颖大部分已经存在的语言创建内容。
Servlet API
Servlet API是SUN公司定义的一套专门用于开发Servlet程序的Java类和接口。Web容器和Servlet程序之间使用Servlet API进行通信,因此,Web容器和Servlet程序都要用到Servlet API。事实上,一个Servlet程序就是一个在Web服务器端运行调用了Servlet API的Java类。这个特殊的Java类必须实现javax.servlet.Servlet接口。Servlet接口定义了Web容器和Servlet程序之间通讯的协议约定。为了简化Servlet程序的编写,Servlet API中也提供了一个闪现Servlet接口的最简单Servlet类,即javax.servlet.GenericServlet,该类实现了Servlet程序的基本特征和功能。
Servlet API还提供了一个专用于HTTP协议的Servlet类javax.servlet.httpServlet,它是GenericServlet的子类,在GenericServlet类的基础上针对HTTP协议进行了扩充,如图所示。显然,一个Java类如果继承了GenericServlet或HttpServlet,就是一个Servlet。反过来,如果要编写一个Servlet,只要继承了GenericServlet和HttpServlet即可。如果要编写在WWW上运行的Java程序,充分利用HTTP协议的功能,就应该让自己编写的Servlet类继承HttpServlet,而不是继承GenericServlet类。
Servlet生命周期
理解Servlet底层功能的关键是理解Servlet遵循的简单的生命周期。该生命周期控制Servlet运行的多线程环境,可以帮助我们理解开发者共享服务器资源的可用机制。
如图所示Servlet生命周期是Servlet和JSP比传统的CGI杰出的主要原因。与单进程CGI生命周期不同的是,Servlet遵循三阶段的生命周期:初始化(initialization)、服务(service)和销毁(destruction),其中初始化和销毁通常只执行一次,而服务可以执行多次。
初始化时Servlet生命周期的第一个阶段,它代表Servlet需要为请求的服务创建和初始化的资源。所有的Servlet必须实现javax.servlet.Servlet接口,这个接口定义了一init()方法以匹配Servlet生命周期的初始阶段。当容器装载Servlet时,在为请求服务器前触发init()方法。
Servlet生命周期的服务阶段代表Servlet销毁之前的所有请求与交互。Servlet接口定义了service()方法以匹配Servlet生命周期的服务阶段。Servlet的service()方法在每次请求时被触发一次,并且对该请求产生响应。Servlet规范定义的Service()方法带有两个参数:一个javax.servlet.ServletRequest对象和一个javax.Servlet.ServletResponse对象,这两个参数分别代表客户端负对动态资源的请求和Servlet对客户端的响应。Servlet默认是多线程的,这意味着在给定时间内容器只装载一个Servlet实例。初始化只执行一次,同时,之后的内个请求被Servlet的service()方法执行的线程并发处理。
Servlet生命周期的销毁阶段代表Servlet被容器丢弃。Servlet接口定义了destroy()方法以匹配Servlet生命周期的销毁阶段。每次Servlet将要被停止使用时,容器就调用destroy()方法,允许Servlet优雅地停止并清理它所创建的资源。
通过恰当地使用Servlet生命周期的初始化、服务和销毁阶段,Servlet可以有效地管理应用程序资源。在初始化阶段,Servlet装载所有的需要为请求服务的资源,然后,资源可以很容易地在服务阶段被使用,最后在销毁阶段被清理。
Servlet与HTTP协议
Servlet编码与部署
import javax.servlet.http.*;
public class HelloWorld extends HttpServlet {
Public void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException,ServletException{
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head>");
out.println("<title>Hello World!</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>Hello World!</h1>");
out.println("</body>");
out.println("</html>");
}
}
编译Servlet代码
将Servlet类库包含进来的方法
将servlet-api.jar 放置在CLASSPATH中
将servlet-api.jar 放置在 JDK安装目录\jre\lib\ext目录下
部署Servlet
创建部署描述文件(web.xml)
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"version="2.4>
</web-app>
在容器中注册Servlet
我们将更改Web.xml内容为:
<web-app xmlns=”http://java.sen.com/xml/ns/j2ee” version=”2.4>
<servlet>
<servlet-name>HelloWorld</servlet-name>
<servlet-class>com.lovobook.HelloWorld</servlet-class>
</servlet>
映射Servlet
一个Servlet必须有三个名称:
1:是Servlet的名称,
2:是Servlet类的完整名称,
3:是映射的逻辑名称
Servlet URL映射路径
精确模式匹配。这种类型的模式用于将请求一对一映射到指定的Servlet。
扩展名匹配“*.扩展名”。在这种情况下,所有以指定扩展名结尾的URL都转向指定的Servlet。
路径映射。路径映射必须以'/'开始,以'/*'结尾,在这之间可以出现任意字符。路径匹配通常用于将对某个目录的所有请求转向一个指定的Servlet。
默认的Servlet,'/'。默认的Servlet映射用于定义一个在没有给出路径信息时请求转向的Servlet。
Servlet配置
有时我们必须为Servlet提供初始化配置信息。一个Servlet的配置信息可以包 含在Servlet的web.xml声明中的字符串组成。该功能允许Servlet在编译的代码外 有初始化参数,当参数改变时,不需要重新编译Servlet。每个Servlet都有一个与 之相关联的对象ServletConfig(实际上在标准Servlet库中,Servlet和ServletConfig 是相同的对象,即GenericServlet同时实现javax.servlet.Servlet和
javax.servlet.Servlet.Config接口),这个对象是容器创建的,以实现
javax.servlet.ServletConfig接口。ServletConfig对象就包含了初始化参数。调用
getServletConfig()方法就可以得到对ServletConfig对象的一个引用。ServletConfig对
象提供了如下的方法来访问初始化参数:
- getInitParameter(String name):这个方法返回指定的参数的值,如果该值不存在就返回null。
- getInitParameterNames();这个方法以字符串对象枚举的方式返回Servlet初始化参数的名称,如果没有初始化参数,则返回一个空的枚举。
为servlet定义初始化参数需要使用web.xml中的init-param、param-name和param-value元素。每个init-param元素定义一个初始化参数,并且必须通过它的子元素param-name和param-value来分别指定参数名和值。Servlet可以有很多初始化参数,每个Servlet的初始化参数信息必须在该servlet的servlet元素內指定。
为Servlet提供初始化配置信息
配置信息由web.xml声明中的字符串组成
<servlet>
…
<init-param>
<param-name>name</param-name>
<param-value>Tiger</param-value>
</init-param>
</servlet>
代码:
String name = getServletConfig().
getInitParameter(“name");
Servlet在编译的代码之外有初始化参数,当参数改变时,不需要重新编译
Servlet 每个servlet都有一个与之相联的对象ServletConfig
ServletContext
在Servlet编程中,容器中创建了应用程序上下文对象(ServletCotext),用于描述Servlet运行环境的信息,使得Servlet同容器进行通讯。从Servlet的角度看,ServletContext对象可以理解为所属Web应用程序的环境。通过javax.servlet.ServletContext接口,Servlet可以访问到Web应用程序资源的本地输入流、把资源的虚拟路径转换为文物理路径、记录事件日志 、绑定一个对象在整个Web应用程序中共享 。每个容器生产商都会提供对ServletContext对象的实现,但是必须按照ServletContext接口的定义提供同样的功能。
ServletContext接口方法:
方法 |
描述 |
getMajorVersion() |
返回容器支持的Servlet API的主要版本 |
getResourceAsStream() |
返回资源对象的输入流 |
getAttribute() |
获得绑定在容器中的对象 |
setAttribute() |
通过名字把一个对象绑定在容器中 |
getInitParameter() |
获得容器的初始化信息参数 |
getRealPath |
返回虚拟路径的物理路径 |
Log() |
把信息写入到Servlet日志文件中 |
配置web.xml中的ServletContext:
<context-param>
<param-name>参数名</param-name>
<param-value>值</param-value>
</context-param>