现在的位置: 首页 > 综合 > 正文

servlet学习笔记

2014年02月08日 ⁄ 综合 ⁄ 共 1656字 ⁄ 字号 评论关闭

 

1 servlet的生命周期
当请求一个servlet时,如果该servlet未实例化,则容器会加载并实例化,执行init方法,创建request和response对象传给service方法。
再发生一次请求时,容器检测到servlet已经实例化,则创建request和response对象传给service方法。
当容器关闭或要移除servlet时,则调用servlet的destroy方法

2 请求转发RequestDispatcher
请求转发可以将处理交给其他资源,如servlet、html或jsp。有两种方法可以获取RequestDispatcher,从ServletContext中获取和从ServletRequest中获取。
ServletContext提供两个方法获取dispatcher,分别是getNamedDispatcher(string name)和getRequestDispatcher(string path)。
getNamedDispatcher是根据web.xml中部署的servlet的名字(<servlet-name>)来获取。
getRequestDispatcher的参数必须以“/"开头,表示以当前上下文为根的开始路径,如某个servlet的pattern配置为/servlet/test,则传进去的参数就应该是/servlet/test。
ServletRequest中也提供了一个getRequestDispatcher方法,该参数如果是以"/"开头,则和ServletContext的那个方法是一样的,如果不是以"/"开头,则表示以当前
servlet为相对路径,如当前的servlet的pattern配置为/servlet/test,要跳转的servlet配置为/servlet/sub/other,则参数可以是/servlet/sub/other或sub/other。

RequestDispatcher提供两个方法:forward,include。都表示要跳转到其他资源,不同的是,如果使用forward跳转则后面的response输出则不会执行,而用include
来跳转,则include的servlet执行完后,再返回到原来的servlet执行response的输出(如果有)。如:
servlet A
RequestDispatcher disp = request.getRequestDispatcher("B");
disp.forward(request, response);
System.out.println("servlet A completed");
PrintWriter pw = response.getWriter();
pw.println("servlet A");

servlet B
PrintWriter pw = response.getWriter();
pw.println("servlet B");

输出结果:
控制台:servlet A completed
页面:servlet B
如果将forward换成include的话,则结果为:
控制台:servlet A completed
页面:servlet B servlet A
PS:如果在servlet B里吧pw给close掉了的话,那servlet A 这里就无法输出了,则结果就和第一个一样。

3 sendRedirect和dispatcher跳转的区别
查看tomcat的Response类实现可知,他是使用setStatus(SC_FOUND);setHeader("Location", address);来实现浏览器的重定向的。通过在响应中设置Location的头
来指示浏览器重定向页面(详情查看w3c的http协议)。而dispatcher则是直接在服务器内部跳到其他页面或servlet,这对用户是透明的,用户根本不知道服务器使用
其他的页面或servlet了。但是sendRedirect相当于叫浏览器重新发送请求,所以地址栏会发生改变。

【上篇】
【下篇】

抱歉!评论已关闭.