一、servlet生命周期和API
① 容器要加载类、调用servlet的无参构造函数,并调用servlet的init()方法,从而初始化servlet。② init()方法在servlet一生中只调用一次,往往在servlet为客户请求提供服务之前调用。
③ init()方法使用可以访问ServletConfig和ServletContext对象,servlet需要从这些对象得 到有关servlet配置和Web应用的信息。
④ 容器通过调用servlet的destroy()方法来结束servlet的生命。
⑤ servlet一生的大多数时间都是在为某个客户请求运行service()方法。
⑥ 对service() 方法的每个请求都是在一个单独的线程中运行!任何特定servlet类都只有一个实例。
⑦ 自定义servlet一般都会继承javax.servlet.http.HeepServlet,并由此继承service()方法的一个实现,它取出一个 HttpServletRequest和一个HttpServletResponse作为参数。
⑧ HttpServlet扩展了javax.servlet.GenericServlet,这是一个抽象类,实现了大多数基本servlet方法。
⑨ GenericServlet实现了Servlet接口。
⑩ Servlet相关的类(除了与JSP有关的类)都在以下两个包中:
> javax.servlet
> javax.servlet.http
⑪ 可以覆盖init()方法,而且必须覆盖一个服务方法(doGet()、doPost()等)。
二、HTTP和HttpServletRequest
① HttpServlet的doGet()和doPost()方法取一个HttpServletRequest和一个HttpServletResponse作为参数。② service()方法根据HTTP请求的HTTP方法(GET、POST等)来确定运行doGet()还是doPost()。
③ POST请求有一个请求体,GET请求则没有,不过GET请求可以把参数追加到请求URL的后面。
④ GET请求本质上讲是幂等的。他们应当能多次运行而不会对服务器产生任何副作用。GET请求不应该修改服务器上的任何东西。但是可以写一个非幂等的doGet()方法(不建议)。
⑤ POST本质上讲不是幂等的,所以当一个客户错误的将一个请求提交多次时,应该适当的设计代码处理这种情况。
⑥ 如果HTML表单没有明确地指出"method=POST"的话,请求就会作为一个GET请求发送,若servlet中无doGet(),这个请求就会失败。
⑦ 可以用getParameter(String paramname)方法从请求得到参数,返回值为String类型。
⑧ 如果对应一个给定的参数名有多个参数值,要使用getParameterValues(String paramname)方法来返回一个String数组。
⑨ 从请求对象还可以得到其他东西,包括首部、cookie、会话、查询串和输入流。
三、HttpSevletResponse
① 使用相应向客户发回数据。② 对相应对象(HttpServletResponse)调用的最常用的方法是setContentType()和getPrintWriter()
③ 实际上得到书写器的方法是getWriter()。
④ 利用getWriter()方法可以完成字符I/O,向流写入HTML或其他内容。
⑤ 还可以使用相应来设置首部、发送错误、以及增加cookie。
⑥ 在实际中,可能会使用JSP发送大多数HTML相应,但仍有可能使用一个响应流向客户发送二进制数据。
⑦ 要得到二进制流,需要在响应上调用getOutputStream()方法。
⑧ setContentType()方法告诉浏览器如何处理响应数据。如“text/html”、"application/pdf"、"image/jpeg"等。
⑨ 可以使用addHeader()或setHeader()设置相应首部。
⑩ 可以使用sendRedirect(String url)重定向访问。
⑪ 重定向需发生在写入流之前。
⑫ 请求分派在服务器端发生,重定向在客户端运行。请求分派把请求传递给服务器上的另一个组件,而重定向则是让浏览器去访问另一个URL。