Servlet理解笔记【原创】

学习步骤:1、理解servlet的使用步骤,从感性上去认识它。2、进一步了解它的机制。3、了解代码层面的实现

在看Java Servlet API过程的笔记:

javax.servlet.http.HttpServlet,这个类继承GenericServlet类,实现了java.io.Serializable的接口,它是个抽象类,给其子类创建一个Http Servlet去适应一个网站。而HttpServlet的子类必须重写至少一个方法,其中较为经常修改的方法有:

   1、如果你希望servlet支持HTTP的Get请求,重写doGet方法

  2、如果你希望servlet支持HTTP的Post请求,重写doPost方法

  3、如果你希望servlet不但可以处理数据,还可以处理文件,重写doPut方法。Put的调用和Post相似,它允许客户端把真正的文件存放在服务器上,而不仅仅是传送数据

  4、如果你希望servlet允许客户端删除服务器端的文件或者Web页面,重写doDelete方法,它与Put相似。

  5、如果你希望控制servlet生命周期所产生的资源,可以重写init和destroy方法

  6、如果你希望servlet提供关自身的相关信息,可以调用或重写javax.servlet.http.HttpServlet类继承javax.servlet.GenericServlet类的getServletInfo方法。

    一般情况下,我们不去重写javax.servlet.http.HttpServlet类中的service方法。因为service是针对标准HTTP请求的处理方法,service根据每个标准HTTP请求的类型分派给其对应的处理方法(如上所述的以do开头的方法)。同样地,我们一般也不会去重写doOptions和doTrace方法。下面顺便说说上述的三个方法:

   一、service

   protected void service(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException;

       public void service(ServletRequest request, ServletResponse response)throws ServletException, IOException;

       这是一个Servlet的HTTP-specific方案,它分配请求到这个类的支持这个请求的其他方法。

  二、doOptions

       protected void doOptions(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException;

       被javax.servlet.http.HttpServlet类这个类的service方法调用,用来处理一个HTTP OPTION操作。这个操作自动地决定支持哪一种HTTP方法。例如,一个Servlet写了一个HttpServlet的子类并重写了doGet方法,doOption会返回下面的头:Allow: GET,HEAD,TRACE,OPTIONS

   三、doTrace

       protected void doTrace(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException;

       被javax.servlet.http.HttpServlet这个类的service方法调用,用来处理一个HTTP TRACE操作。这个操作的默认执行结果是产生一个响应,这个响应包含一个反映trace请求中发送的所有头域的信息。当你开发Servlet时,在多数情况下你需要重载这个方法。

   许多servlet经常运行于多线程服务器,这就意味着一个servlet必须处理当前请求和谨慎同步访问以实现资源的共享。共享的资源包括:内存中的数据(如实例、类变量等)和外部对象(如文件、数据库连接和网络连接等)。如果想了解更多关于在一个JAVA程序中处理多线程的信息可以去查看Java Tutorial on Multithreaded Programming

   javax.servlet.http.HttpServlet这个类只有一个构造函数就是public HttpServlet()该方法不用做任何处理,因为这个类是抽象类。

/**********************************************************************************************************************/   

在深入理解javax.servlet.http.HttpServlet这个类的每个方法之前,我们先来了解一下javax.servlet.http包中的HttpServletRequest和HttpServletResponse接口。

   HttpServletRequest接口继承了ServletRequest接口。继承ServletRequest这个接口是为了提供关于HTTP Servlet的请求信息。Servlet容器创建了一个HttpServletRequest对象,并且把这个HttpServletRequest对象当做一个参数传递给servlet的服务方法(如doGet,doPost等)。

   HttpServletRequest接口的实现类有javax.servlet.http.HttpServletRequestWrapper这个类。而且javax.servlet.http.HttpServletRequestWrapper这个类也继承了javax.servlet.ServletRequestWrapper这个类。当开发者希望子类能够适配出servlet请求的时候,通过javax.servlet.http.HttpServletRequestWrapper这个类可以方便实现HttpServletRequest接口。javax.servlet.http.HttpServletRequestWrapper这个类实现了包装模式和装饰者模式。

   javax.servlet.http.HttpServletRequestWrapper与javax.servlet.ServletRequestWrapper这两个类很类似,它们实现的接口不同:前者实现HttpServletRequest接口,后者实现ServletRequest接口。

   至于javax.servlet.http.HttpServletRequestWrapper与javax.servlet.ServletRequestWrapper这两个类,HttpServletRequest接口与ServletRequest接口的深入研究,后期再续。

   上面我初步了解了HttpServletRequest接口,接下来了解一下HttpServletResponse接口。

   HttpServletResponse接口,它继承了ServletResponse接口,在发送一个响应的过程中提供HTTP特定功能。例如它有的方法访问HTTP Header和cookies。HttpServletResponse接口的实现类有HttpServletResponseWrapper待续

/********************************************************************************************************************/  

言归正传,现在马上进一步理解javax.servlet.http.HttpServlet这个类的每个方法的细节。

 

1、protected void doGet(HttpServletRequest req,HttpServletResponse resp) throws ServletException,java.io.IOException
  参数说明:
  req,是一个HttpServletRequest对象,它包含由客户请求组成的servlet。
resp,是一个HttpServletResponse对象,它包含servlet向客户发送的响应。
doGet方法通过javax.servlet.http.HttpServlet这个类的service方法被服务器调用,从而允许一个servlet处理GET请求。
  重写这个方法来支持一个GET请求,也自动地支持一个HTTP HEAD请求。HEAD请求是一个GET请求的响应,它的返回值没有body部分,只有请求的报头域
当重写这个方法的时候,读取请求数据,写入响应报头,获取响应的写入或输出流对象,最后写入响应数据。此时最好也包括处理ContentType和encoding。当使用一个
文本输出流打印对象来返回响应的时候,在访问该文本输出流打印对象的之前,先设置好ContentType的值。
  在提交响应的之前,servlet容器必需写入报头,因为所有报头必需在HTTP协议传输响应主体(body)部分之前发送。
  可能的话,使用ServletResponse.setContentLength(int)方法来设置报头的Content-Length(内容长度)的值,让servlet容器使用一个持久连接向客户返回它的响应,从而改善性能。如果整个响应放在响应缓冲区内容长度将自动被设置。
  GET方法应该是安全的,也就是说,对被控制的用户负责,而不产生任何副作用。例如,大部分形式的请求没有副作用。如果一个客户端请求的目的是改变存储数据,请求应该使用一些其他HTTP方法。
  GET方法也应该是等幂的,这意味着它可以被安全地重复。有时候使一个方法安全也使它等幂。例如,重复的查询是既安全又幂等,但购买一个产品在线或修改数据既不安全也不幂等。
  如果请求格式不正确,doGet方法会返回一个内容为“Bad Request”的HTTP消息。

posted on 2012-10-25 11:42  ellisonDon  阅读(2830)  评论(1编辑  收藏  举报

导航