这几天想在EclipseBirt的web发布包进行一些功能的扩展,不免就须要修改viewservlet的源码,要想改动就必须的先看懂理顺,结果花了一天的时间楞是没整明白,除了对报表简析模型有点头绪,前端的仍是一塌糊涂!哎,前端birt的技术实现无非就是jsp+javabean+servlet,另外加上一些设计模式,为了搞清请求的前因后果,没办法只好先看servlet的API。看罢才发现本身对servlet的理解是多么的浅显,若是早掌握了也不用痛苦的一步一步的跟程序,也不会整一天都没啥结果,哎,基础才是王道啊!废话很少说了,下面转一篇我的认为对servlet中API讲解比较明了的文章,稍后把birt的官方view完全搞通,再贴出来和你们交流。html
Serlvet接口只定义了一个服务方法就是service,而HttpServlet类实现了该方法而且要求调用下列的方法之一:
doGet:处理GET请求
doPost:处理POST请求
当发出客户端请求的时候,调用service 方法并传递一个请求和响应对象。Servlet首先判断该请求是GET 操做仍是POST 操做。而后它调用下面的一个方法:doGet 或 doPost。若是请求是GET就调用doGet方法,若是请求是POST就调用doPost方法。doGet和doPost都接受请求 (HttpServletRequest)和响应(HttpServletResponse)。前端
get和post这是http协议的两种方法,另外还有head, delete等
这两种方法有本质的区别,get只有一个流,参数附加在url后,大小个数有严格限制且只能是字符串。post的参数是经过另外的流传递的,不经过url,因此能够很大,也能够传递二进制数据,如文件的上传。
在servlet开发中,以doGet()和doPost()分别处理get和post方法。
另外还有一个doService(), 它是一个调度方法,当一个请求发生时,首先执行doService(),不论是get仍是post。在HttpServlet这个基类中实现了一个角度, 首先判断是请求时get仍是post,若是是get就调用doGet(), 若是是post就调用doPost()。你也能够直接过载doService()方法,这样你能够不论是get仍是post。都会执行这个方法。
service()是在javax.servlet.Servlet接口中定义的, 在 javax.servlet.GenericServlet 中实现了这个接口, 而 doGet/doPost 则是在 javax.servlet.http.HttpServlet 中实现的, javax.servlet.http.HttpServlet 是 javax.servlet.GenericServlet 的子类. 全部能够这样理解, 其实全部的请求均首先由 service() 进行处理, 而在 javax.servlet.http.HttpServlet 的 service() 方法中, 主要作的事情就是判断请求类型是 Get 仍是 Post, 而后调用对应的 doGet/doPost 执行.
doGet:处理GET请求 doPost:处理POST请求 doPut:处理PUT请求 doDelete:处理DELETE请求 doHead:处理HEAD请求 doOptions:处理OPTIONS请求 doTrace:处理TRACE请求 一般状况下,在开发基于HTTP的servlet时,开发者只须要关心doGet和doPost方法,其它的方法须要开发者很是的熟悉HTTP编程,所以 这些方法被认为是高级方法。 而一般状况下,咱们实现的servlet都是从HttpServlet扩展而来。 doPut和doDelete方法容许开发者支持HTTP/1.1的对应特性; doHead是一个已经实现的方法,它将执行doGet可是仅仅向客户端返回doGet应该向客户端返回的头部的内容; doOptions方法自动的返回servlet所直接支持的HTTP方法信息; doTrace方法返回TRACE请求中的全部头部信息。 对于那些仅仅支持HTTP/1.0的容器而言,只有doGet, doHead 和 doPost方法被使用,由于HTTP/1java
service()是在javax.servlet.Servlet接口中定义的, 在 javax.servlet.GenericServlet 中实现了这个接口, 而 doGet/doPost 则是在 javax.servlet.http.HttpServlet 中实现的, javax.servlet.http.HttpServlet 是 javax.servlet.GenericServlet 的子类. 全部能够这样理解, 其实全部的请求均首先由 service() 进行处理, 而在 javax.servlet.http.HttpServlet 的 service() 方法中, 主要作的事情就是判断请求类型是 Get 仍是 Post, 而后调用对应的 doGet/doPost 执行,doGet在地址栏中显示请求的内容,doPost隐藏.
其实说来很简单,在servlet中doPost方法里仍是调用了doGet方法,因此在建立servlet时能够不要doPost方法,但在作大型项目涉及密码的传送时doPost方法会更安全些,一般状况下两者没什么区别。web
下面主要介绍javax.servlet.http提供的HTTP Servlet应用编程接口。
HTTP Servlet 使用一个 HTML 表格来发送和接收数据。要建立一个 HTTP Servlet,请扩展 HttpServlet 类,该类是用专门的方法来处理 HTML 表格的 GenericServlet 的一个子类。 HTML 表单是由和标记定义的。表单中典型地包含输入字段(如文本输入字段、复选框、单选按钮和选择列表)和用于提交数据的按钮。当提交信息时,它们还指定服务器 应执行哪个Servlet(或其它的程序)。 HttpServlet 类包含 init()、destroy()、service() 等方法。其中 init() 和 destroy() 方法是继承的。
(1) init() 方法
在 Servlet 的生命期中,仅执行一次 init() 方法。它是在服务器装入 Servlet 时执行的。 能够配置服务器,以在启动服务器或客户机首次访问 Servlet 时装入 Servlet。 不管有多少客户机访问 Servlet,都不会重复执行 init() 。
缺省的 init() 方法一般是符合要求的,但也能够用定制 init() 方法来覆盖它,典型的是管理服务器端资源。 例如,可能编写一个定制 init() 来只用于一次装入 GIF 图像,改进 Servlet 返回 GIF 图像和含有多个客户机请求的性能。另外一个示例是初始化数据库链接。缺省的 init() 方法设置了 Servlet 的初始化参数,并用它的 ServletConfig 对象参数来启动配置, 所以全部覆盖 init() 方法的 Servlet 应调用 super.init() 以确保仍然执行这些任务。在调用 service() 方法以前,应确保已完成了 init() 方法。
(2) service() 方法
ervice() 方法是 Servlet 的核心。每当一个客户请求一个HttpServlet 对象,该对象的service() 方法就要被调用,并且传递给这个方法一个"请求"(ServletRequest)对象和一个"响应"(ServletResponse)对象做为参数。 在 HttpServlet 中已存在 service() 方法。缺省的服务功能是调用与 HTTP 请求的方法相应的 do 功能。例如, 若是 HTTP 请求方法为 GET,则缺省状况下就调用 doGet() 。Servlet 应该为 Servlet 支持的 HTTP 方法覆盖 do 功能。由于 HttpServlet.service() 方法会检查请求方法是否调用了适当的处理方法,没必要要覆盖 service() 方法。只需覆盖相应的 do 方法就能够了。
当一个客户经过HTML 表单发出一个HTTP POST请求时,doPost()方法被调用。与POST请求相关的参数做为一个单独的HTTP 请求从浏览器发送到服务器。当须要修改服务器端的数据时,应该使用doPost()方法。
当一个客户经过HTML 表单发出一个HTTP GET请求或直接请求一个URL时,doGet()方法被调用。与GET请求相关的参数添加到URL的后面,并与这个请求一块儿发送。当不会修改服务器端的数据时,应该使用doGet()方法。
Servlet的响应能够是下列几种类型:
一个输出流,浏览器根据它的内容类型(如text/HTML)进行解释。
一个HTTP错误响应, 重定向到另外一个URL、servlet、JSP。
(3) destroy() 方法
destroy() 方法仅执行一次,即在服务器中止且卸装Servlet 时执行该方法。典型的,将 Servlet 做为服务器进程的一部分来关闭。缺省的 destroy() 方法一般是符合要求的,但也能够覆盖它,典型的是管理服务器端资源。例如,若是 Servlet 在运行时会累计统计数据,则能够编写一个 destroy() 方法,该方法用于在未装入 Servlet 时将统计数字保存在文件中。另外一个示例是关闭数据库链接。
当服务器卸装 Servlet 时,将在全部 service() 方法调用完成后,或在指定的时间间隔事后调用 destroy() 方法。一个Servlet 在运行service() 方法时可能会产生其它的线程,所以请确认在调用 destroy() 方法时,这些线程已终止或完成。
(4) GetServletConfig()方法
GetServletConfig()方法返回一个 ServletConfig 对象,该对象用来返回初始化参数和ServletContext。ServletContext 接口提供有关servlet 的环境信息。
(5) GetServletInfo()方法
GetServletInfo()方法是一个可选的方法,它提供有关servlet 的信息,如做者、版本、版权。
当服务器调用sevlet 的Service()、doGet()和doPost()这三个方法时,均须要 "请求"和"响应"对象做为参数。"请求"对象提供有关请求的信息,而"响应"对象提供了一个将响应信息返回给浏览器的一个通讯途径。
javax.servlet 软件包中的相关类为ServletResponse和ServletRequest,而javax.servlet.http 软件包中的相关类为HttpServletRequest 和 HttpServletResponse。
Servlet 经过这些对象与服务器通讯并最终与客户机通讯。Servlet 能经过调用"请求"对象的方法获知客户机环境,服务器环境的信息和全部由客户机提供的信息。Servlet 能够调用"响应"对象的方法发送响应,该响应是准备发回客户机的。数据库
PS:原文见:http://hi.baidu.com/abo123456789/blog/item/f9d0721179fb9af0c2ce7936.html编程
随便传一份servlet的API文档设计模式