JSP的作用
为了简化起见,某种程度上,可以将servlet看做是含有HTML的Java程序;将JSP看作是含有Java代码的HTML页面。
JSP文档只不是编写servlet的另一种方式。JSP页面会被翻译成servlet,servlet会被编译,在请求期间运行的就是servlet。
对于面向处理(processing)的任务,servlet是最佳选择,而对于面向表示(presentation)的任务,JSP是最佳选择。
生成HTML的servlet
HTTP响应由状态行、一个或多个报头、一个空行和实际的文档以此次序构成。报头的出现次序并不重要,servlet会缓冲报头数据,将他们一次发送到客户端,因此,即使在设定报头之后,仍旧可以设置状态代码(属于返回内容的第一行)。但是,servlet不是一定要缓冲文档本身,因为对于篇幅较长的页面,用户或许只希望看到部分结果。servlet引擎可以缓冲部分输出,但并未规定缓冲区的大小。可以使用HttpServletResponse的getBufferSize方法去顶这个大小,或使用setBufferSize指定这个大小。也可以在缓冲区天慢慢,要发往客户时,对报头进行设置。如果不确定是否已经发送出去,也可以使用isCommitted方法来检查。即使如此,最佳方案还是将setContentType行放在任何使用PrintWriter的行之前。
servlet的生命周期
服务器只创建每个servlet的单一实例,每个用户请求都会引发新的线程——将用户请求交付给相应的doGet或doPost进行处理。
get请求表示要从服务器获取数据;post请求表示向服务器传递数据。
Init方法
默认情况下,servlet对象是在第一次被请求的时候创建的,之后就驻留在web服务器管理的内存中。首次创建时,它的init方法会得到调用,因此,init是放置一次性设置代码的地方。servlet一般在用户首次调用对应的servlet的URL时创建init方法,但也可以指定servlet在服务器启动后载入。
Service方法
在这之后,针对每个用户请求,都会创建一个线程,该线程调用前面创建的实例的service方法。之后,由service方法依据收到的Http请求的类型,调用doGet,doPost或其他doXXX方法。如果需要在servlet中等同地处理post和get请求,应该让doPost调用doGet即可,而不是覆盖service方法。首先,之后还可以加入doPut,doTrace等,支持其他HTTP请求方法。其次,还可以通过添加getLastModified方法,加入对修改日期的支持,由于getLastModified方法由默认的service方法调用所以覆盖service方法也就失去了这个选项。最后,service提供对HEAD、OPTION和TRACE请求的自动支持。
Destroy方法
服务器可能会因为管理员要求或者服务器长时间空闲决定移除之前载入的servlet实例。在服务器移除servlet的实例之前,它会调用servlet的destroy方法,从而使得servlet有机会关闭数据库连接,停止后台运行的线程、将cookie列表的点击计数写入到磁盘,并执行其他清理活动。要意识到Web服务器有可能崩溃,所以不要讲destroy机制作为向磁盘上保存状态的唯一机制。
ServletConfig对象
与Servlet对象一一对应,封装Servlet的初始化信息
在doPost/doGet方法中获取ServletConfig对象:this.getServletConfig()
<servlet>
<servlet-name>sdaasdada</servlet-name>
<servlet-class>ghjhgjhghg</servlet-class>
<init-param>
<param-name>username</param-name>
<param-name>password</param-name>
<param-value>123</para-value>getInitParamter("username");
</init-param>
</servlet>
获取初始化参数:this.getServletConfig().
Servlet的映射方式
Servlet的请求路径是虚拟的,与项目路径无关
扩展映射:*.do
路径映射:/test/*
http://localhost:8080/n01/test.do 会调用下面的路径(路径映射优先)
在servlet中获取表单数据
单个值的读取:调用HttpServletRequest的getParameter方法,提供大小写敏感的参数名作为方法的参数。
多个值的读取:调用getParameterValues方法返回字符串数组。
参数名的查找:调用getParameterNames以Enumeration的形式返回这种列表,其中每一项都可以转换成String,并可以用在getParameter或getParameterValues调用中。若当前请求中没有参数,getParameterNames返回空的Enumeration(不是null)。(Enumeration只是一个接口,确保实际的类实现了hasMoreElements和nextElement方法)它不会去报具体的实现采用何种次序。getParameterMap可以替代此方法。
请求转发、重定向、包含
参照