版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/twilight_karl/article/details/70214759
RequestDispathcher
使用HttpServletRequest的getRequestDispatcher(“Servlet-URL”) 获得对象
RequestDispatcher dispatch = req.getRequestDispatcher(“/Test1”);
include()
将另一个servlet包括进进目前的操作流程中。
以下代码会输出
Dispatch
Test1
Done
/Dispatch
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
PrintWriter output = resp.getWriter();
output.println("Dispatch<br/>");
RequestDispatcher dispatch = req.getRequestDispatcher("/Test1");
dispatch.include(req, resp);;
output.println("Done<br/>");
}
/Test1
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
PrintWriter output = resp.getWriter();
output.println("Test1<br/>");
}
forward()
将请求转发给另一个servlet,只是服务器端的转发,对于客户端并无任何影响
PS:调用forWard()之前不能有任何相应确认,如果设置了相应但还未确认(例如println()后还没有flush()),则所有相应会被忽略.如果已经有相应确认,会报出java.lang.IllegalStateException异常
以下代码会转向Test1,而忽略之forward之前的println输出
PrintWriter output = resp.getWriter();
output.println("Dispatch<br/>");
RequestDispatcher dispatch = req.getRequestDispatcher("/Test1");
dispatch.forward(req, resp);;
output.println("Done<br/>");
以下代码会直接报错,因为已经有相应确认
PrintWriter output = resp.getWriter();
output.println("Dispatch<br/>");
output.flush();
RequestDispatcher dispatch = req.getRequestDispatcher("/Test1");
dispatch.forward(req, resp);;
output.println("Done<br/>");
请求范围属性
当调派请求的过程中有需要共享的属性,可以使用HttpServletRequest的方法
**setAttribute() 指定名称与对象**
**getAttribute() 指定名称获取对象**
**getAttributeNames() 获取所有属性名称**
**removeAttribute() 移除属性**
以下代码的Test1通过getAttribute(“name”)获取到name的集合,需要通过强制转换后才能使用。
/Dispatch
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
PrintWriter output = resp.getWriter();
List<String> list = new ArrayList<>();
list.add("Tom");
list.add("jerry");
req.setAttribute("name", list); // 传入字符串和对象
RequestDispatcher dispatch = req.getRequestDispatcher("/Test1");
dispatch.forward(req, resp);
output.println("Done<br/>");
}
/Test1
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
PrintWriter output = resp.getWriter();
output.println("Test1<br/>");
List name = (List)req.getAttribute("name");
output.println(name.get(1)+"</br/>");
}
sendRedirect()
要求浏览器重新请求一个URL,客户端的地址栏会改变
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String url = req.getParameter("url");
resp.sendRedirect(url);
}
在跳转之前不可以有相应被确认,否则会产生java.lang.IllegalStateException 异常
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
PrintWriter output = resp.getWriter();
output.println("2333");
output.flush();
String url = req.getParameter("url");
resp.sendRedirect(url);
}
跳转时可以附带参数,方式类比于GET方式的URL
String name = req.getParameter("name");
PrintWriter output = resp.getWriter();
resp.sendRedirect("http://localhost:8080/Test/Redirect_Para?name="+name);
PS:
只能用转向方式来访问WEB-INF目录下的JSP,不用采用重定向的方式请求该目录里面的任何资源
同一个请求周期中,HttpServletResponse的getWriter()与getOutputStream()只能择一使用,否则会丢出IllegalStateException