Servlet工作原理

Posted liuys635

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Servlet工作原理相关的知识,希望对你有一定的参考价值。

  • Tomcat容器

  Tomcat容器—>Servlet容器—>Context容器

技术图片 

  所以,真正管理 Servlet 的容器是 Context 容器,一个 Context 对应一个 Web 工程(非用户),新建一个servlet的时候,就会新建一个context的,同时加载它所需要的config,容器的配置属性由应用的 web.xml 指定。tomcat是基于观察者模式设计的,
与 Servlet 主动关联的是三个类,分别是 ServletConfig、ServletContext 、ServletRequest 和 ServletResponse。这三个类都是通过容器传递给 Servlet 的。ServletConfig:获取这个 Servlet 的一些配置属性。ServletContext :交易场景就由 ServletContext 来描述,而定制的参数集合就由 ServletConfig 来描述。
启动tomcat时,Servlet容器被创建,每一个web应用都会对应于一个context容器。客户端发起了一次请求的时候,请求根据url地址指定的ip和端口号就能够找到tomcat服务器,然后根据后面工程名也能找到对应的web服务,此时创建一个线程,根据ServletRequest进行请求的发起,servlet只是作为控制器而存在,然后根据页面的请求内容,查找相应的服务,将结果通过servletResonse返回给客户端。注意这里是每个请求一个线程,不是每个用户一个线程,容器并不关心是谁发起的请求。servlet一般只会存在一个实例,是单例模式设计的,如果容器使用了群集,即将容器布置在多个JVM上,那么每个JVM也只会有一个Servlet实例。
技术图片
 
  • Servlet的生命周期

  四步:servlet类加载--->实例化--->服务--->销毁。

  技术图片

  

1、Web Client 向Servlet容器(Tomcat)发出Http请求

2、Servlet容器接收Web Client的请求

3、Servlet容器创建一个HttpRequest对象,将Web Client请求的信息封装到这个对象中

4、Servlet容器创建一个HttpResponse对象

5、Servlet容器调用HttpServlet对象的service方法,把HttpRequest对象与HttpResponse对象作为参数

     传给 HttpServlet对象

6、HttpServlet调用HttpRequest对象的有关方法,获取Http请求信息

7、HttpServlet调用HttpResponse对象的有关方法,生成响应数据

8、Servlet容器把HttpServlet的响应结果传给Web Client

 

Servlet的框架是由两个Java包组成的:javax.servlet与javax.servlet.http。在javax.servlet包中定义了所有的Servlet类都必须实现或者扩展的通用接口和类。在javax.servlet.http包中定义了采用Http协议通信的HttpServlet类。Servlet的框架的核心是javax.servlet.Servlet接口,所有的Servlet都必须实现这个接口。

在Servlet接口中定义了5个方法,

其中3个方法代表了Servlet的生命周期:

1、init方法:负责初始化Servlet对象。

2、service方法:负责响应客户的请求。

3、destroy方法:当Servlet对象退出生命周期时,负责释放占用的资源。

 
1. init方法做了什么,如果重写了servlet的init方法,怎么办?
  init方法是负责servlet的初始化的。
  其实在GenericServleta中有两个init方法。
技术图片
public void init(ServletConfig config)throws ServletException{  //第一个
  this.config = config;
  this.init(); 
}

·public void init()throws ServletException{   //第二个
}
技术图片

  当容器(tomcat)帮忙调用init(ServletConfig config)并且给传过来一个参数config,这个方法把参数对象的引用指向类的成员变量this.config,并且调用类的 this.init()方法。我们一般重写init()方法都是重写的第二个,这样当忘记写super.init()时不会导致空指针的错误。如果我们在写Servlet类时重写init(ServletConfig config),那么忘记写super.init(ServletConfig config),就容易造成出现空指针异常。所以,最好不要重写init(ServletConfig config)。

  
2. servlet的jre包在哪里?结构是怎样的?
  首先,servlet的jre包不需要我们工程中引入,它在tomcat的lib目录下有一个Servlet.jar。
  解压后我们可以看到里面有许多的class文件。包括:servletCinfig、servletContext、Resquest、Responce和input、output,和cookie、Session等。
  下载Tomcat的源代码,然后就可以看见servleT的源代码。
  下载中文Servlet的api。
  
3. servlet的httpSession中到底有什么?
  
技术图片
  public void setAttribute(String name,Object value) 
  将value对象以name名称绑定到会话 
  public object getAttribute(String name) 
  取得name的属性值,如果属性不存在则返回null 
  public void removeAttribute(String name) 
  从会话中删除name属性,如果不存在不会执行,也不会抛处错误. 
  public Enumeration getAttributeNames() 
  返回和会话有关的枚举值 
  public void invalidate() 
  使会话失效,同时删除属性对象 
  public Boolean isNew() 
  用于检测当前客户是否为新的会话 
  public long getCreationTime() 
  返回会话创建时间 
  public long getLastAccessedTime() 
  返回在会话时间内web容器接收到客户最后发出的请求的时间 
  public int getMaxInactiveInterval() 
  返回在会话期间内客户请求的最长时间.秒 
  public void setMasInactiveInterval(int seconds) 
  允许客户客户请求的最长时间 
  ServletContext getServletContext() 
  返回当前会话的上下文环境,ServletContext对象可以使Servlet与web容器进行通信 
  public String getId() 
  返回会话期间的识别号
技术图片

 4. servlet中的cookie到底有什么?

  
技术图片
构造cookie 的方法 :  new Cookie(键,值)
构造函数如下:
Cookie(java.lang.String name, java.lang.String value)

把cookie发送给客户端
HttpServletResponse.addCookie(javax.servlet.http.Cookie)

取得客户浏览器的cookie,返回的是数组
HttpServletRequest.getCookies()

getComment/setComment 
      获取/设置Cookie的注释。

getDomain/setDomain
  获取/设置Cookie适用的域。一般地,Cookie只返回给与发送它的服务器名字完全相同的服务器。使用这里的方法可以指示浏览器把Cookie返回给同一域内的其他服务器。注意域必须以点开始(例如.sitename.com),非国家类的域(如.com,.edu,.gov)必须包含两个点,国家类的域(如.com.cn,.edu.uk)必须包含三个点。

getMaxAge/setMaxAge
  获取/设置Cookie过期之前的时间,以秒计。如果不设置该值,则Cookie只在当前会话内有效,即在用户关闭浏览器之前有效,而且这些Cookie不会保存到磁盘上。
若生存时间为负值,代表浏览器关闭Cookie即消失。生存时间为0,代表删除Cookie,生存时间为正数,代表Cookie存在多少秒。

getName/setName
  获取/设置Cookie的名字。本质上,名字和值是我们始终关心的两个部分。由于HttpServletRequest的getCookies方法返回的是一个Cookie对象的数组,因此通常要用循环来访问这个数组查找特定名字,然后用getValue检查它的值。

getPath/setPath
  获取/设置Cookie适用的路径。如果不指定路径,Cookie将返回给当前页面所在目录及其子目录下的所有页面。这里的方法可以用来设定一些更一般的条件。例如,someCookie.setPath("/"),此时服务器上的所有页面都可以接收到该Cookie。

getSecure/setSecure
  获取/设置一个boolean值,该值表示是否Cookie只能通过加密的连接(即SSL)发送。

getValue/setValue
  获取/设置Cookie的值。如前所述,名字和值实际上是我们始终关心的两个方面。不过也有一些例外情况,比如把名字作为逻辑标记(也就是说,如果名字存在,则表示true)。

getVersion/setVersion
  获取/设置Cookie所遵从的协议版本。默认版本0(遵从原先的Netscape规范);版本1遵从RFC 2109 , 但尚未得到广泛的支持。
几个Cookie工具函数,获取指定名字的Cookie值
   该函数是ServletUtilities.java的一部分。getCookieValue通过循环依次访问Cookie对象数组的各个元素,寻找是否有指定名字的Cookie,如找到,则返回该Cookie的值;否则,返回参数中给出的默认值。getCookieValue能够在一定程度上简化Cookie值的提取。
技术图片

 

以上是关于Servlet工作原理的主要内容,如果未能解决你的问题,请参考以下文章

Servlet 工作原理解析

Servlet工作原理分析

servlet工作原理

JSP/Servlet 工作原理

Servlet的生命周期及工作原理

Servlet生命周期工作原理配置