转自:http://www.360doc.com/content/10/0713/20/495229_38798294.shtml
Web服务器与Web应用层属于不容两个范畴,为了让他们两写作,首先应用中介方当制定Web应用与Web服务器进行协作的标准接口,Servlet就是其中一个主要的协议、接口

 

Web应用与Web服务器进行协作的一系列标准Java接口,统称Java Servlet API。另外还有一些Servlet规范。Servlet规范把能够与发布和运行Java Web应用容器的Web服务器称为Servlet容器

Servlet容器

Servlet规定的,相应客户请求访问特定Servlet流程如下:

1.客户端发出请求。

2.Servlet容器接收客户请求解析。

3.Servlet容器创建一个ServletRequest对象。

其中包含客户请求信息及其他关于客户的信息如请求头,请求正文,客户机的IP等。

4.容器创建一个ServletResponse对象。

5.容器调用客户请求的Servlet的service方法,并且把ServletRequest和ServletResponse作为参数传入。

6.Servlet从客户参数中获得客户请求信息。

7.Servlet利用ServletResponse对象来生产相应结果。

8.Servlet容器把Servlet生成的结果发给客户。

Tomcat工作模式

① 独立的Servlet容器

Tomcat作为独立的Web服务器来单独运行。

② 其他Web服务器进程内的Servlet容器

这种模式下,Tomcat与Web服务器插件和Servlet容器组件两部分。Web服务器插件在其他Web服务器进程的内部地址空间启动一个Java虚拟机,Servlet容器组件在此Java虚拟机中运行。如有Servlet请求,Web服务器插件获得此请求并转发给Servlet容器(JNI通信,Java本地调用接口)。

3 其他Web服务器进程外的Servlet容器

与上面类似,只是在Web服务器外部地址,启动一个Java虚拟机进程,转发用IPC通信机制,两个进程之间通信的一种机制。

Servlet容器

Servlet是Java WEB应用中最核心的组件,最常用:

1.请求对象ServletRequest和HttpServletResponse

2.响应对象ServletResponse、HttpServletResponse

3.Servlet配置对象,ServletConfig,容器初始化一个Servlet时,会向他提供一个ServletConfig对象,Servlet通过该对象来获取初始化参数信息以及ServletContext对象。

4.ServletContext对象:通过它来访问容器为当前Web应用提供的各种资源

主要由两个Java包组成,javax.servlet和javax.servlet.http前者定义了Servlet接口以及相关的通用接口和相关类,后者定义了与HTTP协议相关的。

Servlet接口

Servlet API的核心,所有的Servlet都必须实现这一接口,定义了5个方法,其中3个方法由容器来调用,容器会在Servlet生命周期的不同阶段调用特定方法。

1.Init

2.Service(ServletRequest req,ServletResponse res),响应客户请求,访问特定servlet对象时,调用service方法

3.destory():负责释放Servlet对象占用的资源,当Servlet对象结束生命周期时,容器会调用此方法

4.getServletConfig:返回一个ServletConfig对象。所有的servlet

5.getServletInfo:返回一个字符串,返回Servlet创建者,版本,版权信息等。

 
 
 

GenericServlet

抽象类,实现了Servlet接口,ServletConfig接口,Serializable接口。

这样所有的Servlet就通过SerletConfig接口,拥有了获得自己相关属性的方法:getInitParameter,getInitParameterNames。另外,还有getServletContext,也是实现Config接口需要实现的。

 

ServletConfig

<servlet>

<servlet-name>....</servlet-name>

<servlet-class>.....</servlet-class>

<init-param>

<param-name>....<param-name>

<param-value>....<param-value>

</init-param>

</servlet>

<servlet-mapping>

</servlet-mapping>

Servlet的init(ServletConfig config)方法有一个这个参数,它初始化一个servlet对象时,创建一个ServletConfig对象,包含了这个Servlet的初始化参数信息。

ServiceConfig还有一个当前的ServletContext对象关联的API.

从一个servlet被实例化后,对任何客户端在任何时候访问有效,但仅对本servlet有效,一个servlet的ServletConfig对象不能被另一个servlet访问

getInitParameter()/getInitParameter(String name),用来获得初始化参数,getServletContext

getServletName:返回SERVLET的名字即web xml中相应servlet元素<servlet-name>元素的值:

 

HttpServlet抽象类

GenericServlet的子类,虽然自定义,Servlet类可以GenericServlet,但一把都扩展HttpServlet类。它为HTTP的请求方式,分别实现相应的方法,doGet、doPost、doDelete,从源码上看,它实现了SERVLET接口的service(ServletRequest req,ServletResponse res)方法,并且重载了方法,service(HttpServiceRequest req,HttpServletResponse rep)。

 
 
private static final String METHOD_DELETE = "DELETE";
    private static final String METHOD_HEAD = "HEAD";
    private static final String METHOD_GET = "GET";
    private static final String METHOD_OPTIONS = "OPTIONS";
    private static final String METHOD_POST = "POST";
    private static final String METHOD_PUT = "PUT";
    private static final String METHOD_TRACE = "TRACE";
 

protected void service(HttpServletRequest req, HttpServletResponse resp)

throws ServletException, IOException

{

String method = req.getMethod();

if (method.equals(METHOD_GET)) {

long lastModified = getLastModified(req);

if (lastModified == -1) {

// servlet doesn't support if-modified-since, no reason

// to go through further expensive logic

doGet(req, resp);

else {

long ifModifiedSince = req.getDateHeader(HEADER_IFMODSINCE);

if (ifModifiedSince < (lastModified / 1000 * 1000)) {

// If the servlet mod time is later, call doGet()

// Round down to the nearest second for a proper compare

// A ifModifiedSince of -1 will always be less

maybeSetLastModified(resp, lastModified);

doGet(req, resp);

else {

resp.setStatus(HttpServletResponse.SC_NOT_MODIFIED);

}

}

else if (method.equals(METHOD_HEAD)) {

long lastModified = getLastModified(req);

maybeSetLastModified(resp, lastModified);

doHead(req, resp);

else if (method.equals(METHOD_POST)) {

doPost(req, resp);

else if (method.equals(METHOD_PUT)) {

doPut(req, resp);

else if (method.equals(METHOD_DELETE)) {

doDelete(req, resp);

else if (method.equals(METHOD_OPTIONS)) {

doOptions(req,resp);

else if (method.equals(METHOD_TRACE)) {

doTrace(req,resp);

else {

//

// Note that this means NO servlet supports whatever

// method was requested, anywhere on this server.

//

String errMsg = lStrings.getString("http.method_not_implemented");

Object[] errArgs = new Object[1];

errArgs[0] = method;

errMsg = MessageFormat.format(errMsg, errArgs);

resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED, errMsg);

}

}

 

ServletRequest HttpServletRequest

前者表示客户端请求参数,用它可以读取客户端请求数据的方法,比如getContentType、getLocalPort等。

后者是前者的子接口,它提供了读取HTTP请求中相关信息的方法,比如getMethod,getQueryString,HTTP请求中的查询字符串,?后面的内容。

本来,我们得自己去解析HTTP请求,然后做出回应,现在根据sun的servlet API来构建Servlet,则无需实现费力地解析如HTTP请求,这都有Servlet代劳,并封转为HttpServletRequest对象,Servlet只需要调用getXXX方法

ServletResponseHttpServletResponse

前者用来生产相应结果,它有一系列设置响应信息的setXXX方法,默认为text/plain,存文本,servlet通过servletResponse产生HTTP相应的正文部分。二进制用Servlet的getOutPutStream方法返回一个ServletOutputStream对象来输出二进制数据,getWrte方法返回一个PrintWrite对象,用来返回字符串形式的正为。

后者是前者的子接口,通过它来设置HTTP响应头,向客户端写cookie等,addHeader。addCookie。

另外,它还有一个静态的状态常量。

ServletContext

是Servlet与Servlet容器的接口,容器启动一个Web应用时,都为之创建一个唯一ServletContext对象,管理访问容器的各种资源,6个方法:

1.在web应用范围内共享数据的方法,setAttribute,getAttribute

2.访问当前Web应用的资源

3.访问Servlet容器中的其他Web应用。ServletContext      getContext(java.lang.String uripath)

4.访问服务器端的文件系统资源,getRealPath,getResource

5.输出日志

6.访问容器相关信息

ServletContext:对任何servlet,任何人在任何时间都有效,这才是真正全局的对象。

<web-app>
         .................
         <init-param>
             <param-name>charset</param-name> 
             <param-value>GB2312</param-value> 
         </init-param>
         .................
     </web-app>

 

Java Web的生命周期与Servlet生命周期

1.Web应用:3阶段,启动阶段、运行阶段、终止阶段

a)         启动:加载web.xml--------为web应用创建一个ServletContext对象-----初始化所有Filter-----对需要启动时就要初始化的Servlet初始化

b)        运行:最重要阶段,这时,所有Servlet处于待命阶段,随时响应请求,如果servlet未初始化,则先初始化,再调用servlet方法

c)         终止:销毁处于运行状态的servlet---销毁运行阶段的Filter-----销毁所有WEB应用相关的对象,如ServletCCotext,并且释放web应用占用的资源

2.Servlet生命周期:3个状态,初始化、运行、销毁

A初始化 claa文件读入内存------Servlet容器创建ServletConfig------包含了特别Servlet的初始化配置信息--------容器创建Servlet对象----调用Servlet对象的init(ServletConfig fig)

如果servlet被首次访问,会初始化,如果servlet设置了<load-on-startup>元素,则容器启动servlet应用时,就会初始化

B.运行阶段 响应请求

C 销毁:web应用终止时,Servlet容器会调用所有servlet的destory方法,然后再销毁这些servlet对象,另外,还销毁与servlet关联的ServletConfig。

3.ServletContext与Web应用范围

ServletContext与Web应用有同样的生命周期,Web应用范围表示,由WEB应用的生命周期构成的时间段,WEB应用的生命周期内所有的Web组件集合,共享数据,可以在Wwb应用范围内存取共享,这可以通过ServletContext对象来实现,这就是setAttribute和removeAttrinut、getAttribute等。

4.ServletContextListener监听器

监听ServletContext的生命周期,实际上就是监听Web应用的生命周期

contextInitialized、contextDestoryed事件,这可以用来实现初始化、销毁的时候,一些持久化存储(下载/上传/图像/。。。。)

过滤器

在一些web组件响应客户请求过程中,可能都会完成一些相同的操作,比如,先检查IP,可以使用过滤器:在wen组件被调用前,检查serviceRequest对象,修改请求头,和请求正文的内容,或者对请求进行预处理操作;过滤器,能在wen组件被调用后检查ServletResponse对象,修改响应头和响应正文。

HTTP会话

会话管理:有些情况下,容器会把httpsession对象从内存中转移到持久设备中,这可以确保重启web应用后,能恢复重启前的会话。

Tomcat目前包括两种方式:

标准会话管理器:org.apache.catalina.session.StandardManager

持久会话管理器:org.......................................PresistentManager

前者:当Tomcat服务器终止或者web应用终止时,会对被终止的web应用的httpsession对象进行持久化,保存在文件中。Home/WORK/CATALINA/HOSTNAME/APPLICATIONNAME/sessions.ser。重启时,激活

后者:提供了更灵活的功能,它把存放httpsession对象的永久性存储设备称为会话store:

ü         当tomcat关闭时或重启(或单个web),会对httpsession持久化store中

ü         具有容错功能,这时备份到会话store中,防止意外关闭

ü         灵活控制内存中的httpsession的数目

两种实现:

FileStore,文件中

JDBCStore:数据库中

 

会话的监听

HttpSessionListener:监听会话的创建以及销毁事件,如下两个方法,

sessionCreated(HttpSessionEvent event),SessionDestoryed(HttpSessionEvent event)

HttpSessionAttributeListener:监听会话中添加,替换,删除属性事件

HttpSessionBindingListener:监听会话与一个属性绑定或解除绑定的事件

HttpSessionActivctionListener:监听会话被激活或被搁置的事件。

前两个必须在web.xml文件中通报各国<listener>元素向容器注册,后两个由会话的属性来实现,假如MyData类,的对象会作为会话的属性与会话绑定,如果希望监听对象与会话绑定的解除绑定,以及会话被激活或搁置的事件,那么可以让MyData类实现后两个接口。

Web容器与Servlet的更多相关文章

  1. Java ,单实例 多线程 ,web容器,servlet与struts1-2.x系列,线程安全的解决

    1.Servlet是如何处理多个请求同时访问呢? 回答:servlet是默认采用单实例,多线程的方式进行.只要webapp被发布到web容器中的时候,servlet只会在发布的时候实例化一次,serv ...

  2. Web容器、Servlet容器、Spring容器、SpringMVC容器之间的关系

    以下内容为个人理解,如有误还请留言指出,不胜感激! Web容器 web容器(web服务器)主要有:Apache.IIS.Tomcat.Jetty.JBoss.webLogic等,而Tomcat.Jet ...

  3. Java Servlet与Web容器之间的关系

    自从计算机软件开发进入网络时代,就开始涉及到通讯问题.在客户/服务器(也叫C/S应用)时期,每个软件都有自己的客户端和服务器端软件.并且客户端和服务器端之间的通讯协议差别也很大.后来随着互联网的发展, ...

  4. servlet和web容器之间的关系

    Java是一种动态加载和运行的语言.也就是说当应用程序持有一个类的地址(CLASSPATH)和名称(包名和类名)的情况下,可以在程序运行期 间任何时候加载这个类,并创建和使用该类的对象.Servlet ...

  5. 各种容器与服务器的区别与联系:Servlet容器、WEB容器、Java EE容器、应用服务器、WEB服务器、Java EE服务器

    1.容器与服务器的联系 如上图,我们先来看下容器与服务器的联系:容器是位于应用程序/组件和服务器平台之间的接口集合,使得应用程序/组件可以方便部署到服务器上运行. 2.各种容器的区别/联系 2-1.容 ...

  6. 各种容器与服务器的区别与联系 Servlet容器 WEB容器 Java EE容器 应用服务器 WEB服务器 Java EE服务器

    转自:https://blog.csdn.net/tjiyu/article/details/53148174 各种容器与服务器的区别与联系 Servlet容器 WEB容器 Java EE容器 应用服 ...

  7. servlet容器,web容器,spring容器,springmvc容器的区别(转)

    web容器中有servlet容器,spring项目部署后存在spring容器和springmvc容器.其中spring控制service层和dao层的bean对象.springmvc容器控制contr ...

  8. java web 中的servlet讲解

    首先,解释一下解释一下什么是servlet?说一说Servlet的生命周期? servlet有良好的生存期的定义,包括加载和实例化.初始化.处理请求以及服务结束.这个生存期由javax.servlet ...

  9. 【转载】web开发中 web 容器的作用(如tomcat)

    我们讲到servlet可以理解服务器端处理数据的java小程序,那么谁来负责管理servlet呢?这时候我们就要用到web容器.它帮助我们管理着servlet等,使我们只需要将重心专注于业务逻辑. 什 ...

随机推荐

  1. atitit.故障排除--- 当前命令发生了严重错误。应放弃任何可能产生的结果sql server 2008

    atitit.故障排除--- 当前命令发生了严重错误.应放弃任何可能产生的结果sql server 2008 1. 现象 1 2. 原因:::sql server的bug 或者限制,查询的时候儿使用资 ...

  2. CGameConfig类

    #ifndef __GAMECONFIG_H__ #define __GAMECONFIG_H__ #include "GameFrameHead.h" #include &quo ...

  3. CControlLayer

    #ifndef __CONTROLLAYER_H__ #define __CONTROLLAYER_H__ #include "XWidget.h" class CMapDialo ...

  4. centos 安装部署ftp服务器

    0. 安装ftp yum install vsftpd 1. 添加ftp账户 useradd -d /home/test -g ftp -s /sbin/nologin test 命令的意思: 添加t ...

  5. 再谈Nginx Rewrite, 中文URL和其它

    上次谈到过Nginx和中文URL的问题,这几天又加深了认识. 多分享几个关于Nginx Rewrite的经验. Nginx匹配指定中文URL的方法:rewrite "(*UTF8)^x{66 ...

  6. 无需看到你的脸就能认出你——实现Beyond Frontal Faces: Improving Person Recognition Using Multiple Cues

    今年年初Facebook AI Research发布了一篇名为Beyond Frontal Faces: Improving Person Recognition Using Multiple Cue ...

  7. 关于Unity中的摄像机

    摄像机是挂载Camera组件的能把3D世界物体拍摄成2D画面显示到屏幕上面的节点,角度不一样,位置不一样,拍摄出来的东西就不一样. Clear Flags:没有物体的时候,摄像机拍摄出的屏幕要绘制什么 ...

  8. 隐马尔科夫模型(hidden Markov model, HMM)

  9. Unity5.X 新版AssetBundle打包控制

    一.什么是AssetBundle 估计很多人只知道Unity的模型之类的东西可以导出成一种叫做AssetBundle的文件,然后打包后可以在Unity程序运行的时候再加载出来用.那么AssetBund ...

  10. python XlsxWriter Example: Hello World

    http://xlsxwriter.readthedocs.io/example_hello_world.html The simplest possible spreadsheet. This is ...