servlet基础

本文深入解析Servlet的概念、生命周期及部署过程,介绍如何利用ServletAPI创建动态Web内容,并探讨Servlet与HTTP协议的关系。

什么是Servlet

是运行在Web服务器或应用服务器上的Java程序

Web上创建动态内容的有效而强大的解决方案

由容器来管理生命周期与Web服务器交互

Sun规范了其功能  

 

Servlet规范的组成

Web应用程序:Servlet被规定为一个称为Web应用程序的大型项目中的一部分。Web应用程序是一个Web站点的完整资料集合。Web应用程序可以由零个、一个或者多个Servlet组成,Servlet容器负责管理ServletWeb应用程序及其配置文件在Servlet规范中有详细说明。

ServletHTTPServletServlet规范的主要作用就是定义一个与C/S(客户端/服务器)模型类似的发送内容到客户端的健壮机制。Servlet主要用于创建动态Web内容,并且天生支持HTTP

过滤器:过滤器在Servlet2.3规范中开始引入。过滤器提供了一个抽象的方法,在客户端对的请求、响应达到请求的终点时控制它、过滤器很好地补充了Servlet,它通常用在审核、内容压缩日志等方面。

安全:Servlet已经使用了java虚拟机提供的安全功能,但是Servlet规范同时还定义了控制访问Web应用程序资源的一种机制。

国际化:Servlet最杰出的功能之一就是能够开发任何语言的内容。这种功能大部分直接来自于Java平台的国际化和本地化支持。Servlet API保持了这项功能,并且能够轻松地李颖大部分已经存在的语言创建内容。

 

Servlet API

Servlet APISUN公司定义的一套专门用于开发Servlet程序的Java类和接口。Web容器和Servlet程序之间使用Servlet API进行通信,因此,Web容器和Servlet程序都要用到Servlet API。事实上,一个Servlet程序就是一个在Web服务器端运行调用了Servlet APIJava类。这个特殊的Java类必须实现javax.servlet.Servlet接口。Servlet接口定义了Web容器和Servlet程序之间通讯的协议约定。为了简化Servlet程序的编写,Servlet API中也提供了一个闪现Servlet接口的最简单Servlet类,即javax.servlet.GenericServlet,该类实现了Servlet程序的基本特征和功能。

Servlet API还提供了一个专用于HTTP协议的Servletjavax.servlet.httpServlet,它是GenericServlet的子类,在GenericServlet类的基础上针对HTTP协议进行了扩充,如图所示。显然,一个Java类如果继承了GenericServletHttpServlet,就是一个Servlet。反过来,如果要编写一个Servlet,只要继承了GenericServletHttpServlet即可。如果要编写在WWW上运行的Java程序,充分利用HTTP协议的功能,就应该让自己编写的Servlet类继承HttpServlet,而不是继承GenericServlet类。

 

 

 

Servlet生命周期

理解Servlet底层功能的关键是理解Servlet遵循的简单的生命周期。该生命周期控制Servlet运行的多线程环境,可以帮助我们理解开发者共享服务器资源的可用机制。

如图所示Servlet生命周期是ServletJSP比传统的CGI杰出的主要原因。与单进程CGI生命周期不同的是,Servlet遵循三阶段的生命周期:初始化(initialization)、服务(service)和销毁(destruction),其中初始化和销毁通常只执行一次,而服务可以执行多次。

初始化时Servlet生命周期的第一个阶段,它代表Servlet需要为请求的服务创建和初始化的资源。所有的Servlet必须实现javax.servlet.Servlet接口,这个接口定义了一init()方法以匹配Servlet生命周期的初始阶段。当容器装载Servlet时,在为请求服务器前触发init()方法。

Servlet生命周期的服务阶段代表Servlet销毁之前的所有请求与交互。Servlet接口定义了service()方法以匹配Servlet生命周期的服务阶段。Servletservice()方法在每次请求时被触发一次,并且对该请求产生响应。Servlet规范定义的Service()方法带有两个参数:一个javax.servlet.ServletRequest对象和一个javax.Servlet.ServletResponse对象,这两个参数分别代表客户端负对动态资源的请求和Servlet对客户端的响应。Servlet默认是多线程的,这意味着在给定时间内容器只装载一个Servlet实例。初始化只执行一次,同时,之后的内个请求被Servletservice()方法执行的线程并发处理。

Servlet生命周期的销毁阶段代表Servlet被容器丢弃。Servlet接口定义了destroy()方法以匹配Servlet生命周期的销毁阶段。每次Servlet将要被停止使用时,容器就调用destroy()方法,允许Servlet优雅地停止并清理它所创建的资源。

通过恰当地使用Servlet生命周期的初始化、服务和销毁阶段,Servlet可以有效地管理应用程序资源。在初始化阶段,Servlet装载所有的需要为请求服务的资源,然后,资源可以很容易地在服务阶段被使用,最后在销毁阶段被清理。

 

 

ServletHTTP协议

 

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的配置信息可以包 含在Servletweb.xml声明中的字符串组成。该功能允许Servlet在编译的代码外 有初始化参数,当参数改变时,不需要重新编译Servlet。每个Servlet都有一个与 之相关联的对象ServletConfig(实际上在标准Servlet库中,ServletServletConfig 是相同的对象,即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-paramparam-nameparam-value元素。每个init-param元素定义一个初始化参数,并且必须通过它的子元素param-nameparam-value来分别指定参数名和值。Servlet可以有很多初始化参数,每个Servlet的初始化参数信息必须在该servletservlet元素內指定。

 

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>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值