Servlet生命周期和API
要点:
1. 容器要加载类、调用servlet的无参构造函数,并调用servlet的init()方法,从而初始化servlet。
2. init()方法(开发人员可以覆盖)在servlet一生中指调用一次,往往在servlet为客户请求提供服务之前调用。
3. Init()方法使servlet可以访问ServletConfig和ServletContext对象,servlet需要从这些对象得到有关servlet配置和Web应用的信息。
4. 容器通过调用servlet的destroy()方法来结束servlet的生命。
5. servlet一生的大多数时间都是在为某个客户请求运行service()方法。
6. 对servlet的每个请求都在一个单独的线程中运行,任何特定servlet类都只有一个实例。
7. 你的servlet一般都会扩展javax.servlet.http.HttpServlet,并由此继承service()方法的一个实现,它取一个HttpServletRequest和一个HttpServletResponse作为参数。
8. HttpServlet扩展了javax.servlet.GenericServlet,这是一个抽象类,实现了大多数基本servlet方法。
9. GenericServlet实现了Servlet接口。
10. Servlet相关的类(除了JSP有关的类)都在以下两个包中:javax.servlet或javax.servlet.http。
11. 可以覆盖init()方法,而且必须覆盖一个服务方法(doGet(),doPost()等)。
HTTP和HttpServletRequest
1. HttpServlet的doGet()和doPost()方法取一个HttpServletRequest和一个HttpServletResponse作为参数
2. service()方法根据HTTP请求的HTTP方法(GET,POST等)来确定运行doGet()还是doPost()
3. POST请求有一个体;GET请求没有,不过GET请求可以把请求参数追加到请求URL的后面(有时称为查询串)
4. GET请求本质上讲(根据HTTP规范)是幂等的。它们应当能多次运行而不会对服务器产生任何副作用。GET请求不应该修改服务器上的任何东西。但是你也可以写一个非幂等的doGet()方法(不过这是很糟糕的做法)。
5. POST本质上讲不上幂等的,所以要由你来适当地设计和编写代码,如果客户错误的把一个请求发送了两次,你也能正确的加以处理。
6. 如果HTML表单没有明确地指出mthos=POST,请求就会作为一个GET请求发送,而不是POST请求。如果你的servlet中没有doGet(),这个请求就会失败。
7. 可以用getParameter(paramname)方法从请求得到参数。返回值总是一个string。
8. 如果对应一个给定的参数名有多个参数值,要使用getParameterValues(paramname)方法来返回一个String数组。
9.从请求对象还可以得到其他东西,包括首部、cookie、会话、查询串和输入流。