Servlet存在就是为客户服务。Servlet的任务是得到客户的一个请求,再发回一个响应。
Servlet的生命周期很简单,只有一个主要的状态,初始化。
Servlet service() init() destroy()
GenericServlet service() init() destroy()
HttpServet service() init() destroy()
MyServlet service() init() destroy()
init():servlet实例创建以后,并在Servlet在为客户服务之前,容器对Servlet调用init(),使你在Servlet在为客户服务之前有机会对其初始化。可能会被覆盖,譬如获得一个数据库的连接等等。
service():第一个客户请求调用到来时,容器会在一个新线程里,或者从一个线程池里分配一个线程,并调用Servlet的的service方法。这个方法查看请求,确定http方法,并在Servlet上调用对应的方法。这个方法基本上不太可能被覆盖。
doget() dopost():客户的个性化代码存在于这里,至少要覆盖其中之一。
每一个请求都在一个单独的线程里运行。
Servlet从不存在状态迁移到初始化状态,首先是从构造函数开始的,但是构造函数只是使其成为一个对象,而不是一个Servlet。想要成为一个Servlet,对象必须具备一些Servlet的特性。这些特性是在init()方法里得到明确的定义的。init()里使用ServletConfig对象来定义这些特性。
ServletConfig:每一个Servlet都有一个自己的ServletConfig,用于向Servelt传递信息,用于访问ServletContext。这个ServletConfig在部署描述文件中配置的(web.xml).
ServletContext: 每一个web应用都有一个自己的ServletContext,用于访问Web应用参数,这些参数也是在部署描述文件中配置的。ServletContext相当于一个应用的公告栏,可以在这里放置消息,应用的其他部分也可以访问这些消息。主要用于得到服务器的信息、包括容器名和容器版本,以及所支持的API的版本等等。
不管怎么样,Servlet存在的主要目的是为客户提供服务,接受和处理请求,然后发出响应。所以请求和响应是一切一切的关键。这也是service()方法的参数,同时也是都Get()和都Post()方法的参数。
HttpServletRequest ServletRequest
HttpServletResponse ServletResponse
客户的http请求总是包括一个特定的Http方法。如果这个方法是Get,service()方法就会调用doGet()。如果这个方法是Post,service()方法就是调用doPost()。
幂等即你可以一遍又一遍的做同一件事情,而不会有预料不到的副作用。Get方法只是得到东西,他不会修改服务器上的任何东西。Post方法不是幂等的,Post体中会提交不可扭转的事务。Get是http协议中默认的方法,而Post则不是。
发送和使用参数;
在html文件中用name明明一个元素名,用value或者其它元素对这个元素名来赋值。在request对象中使用getParameter(“元素名”)来获得这个值。
除了获得html文件中的参数值以外,还能从请求中获得如下的信息(主要的)
客户的平台和浏览器信息:String client = request.geHeader("User-agent");
于请求相关的cookie : Cookie cookie = request.getCookies();
与客户相关的会话:HttpSeesion session = request.getSession();
请求的Http方法: String method = request.getMethod();
请求的输入流: InputStream input = request.getInputStream(),用于Post方法中表体的数据。这些数据可能会很大。
响应要返回给客户。这是浏览器得到、解析并呈现给客户的东西。一般地,会使用响应对象得到一个输出流(通常是一个Writer),并使用这个流写出HTML。不过,响应对象除了I/O输出以外,还有其他方法。
response.setContextType()
getOutputStream()
getWriter()