本文共 3534 字,大约阅读时间需要 11 分钟。
使用HttpServletRequest的getRequestDispatcher(“Servlet-URL”) 获得对象
RequestDispatcher dispatch = req.getRequestDispatcher(“/Test1”);
将另一个servlet包括进进目前的操作流程中。
以下代码会输出 Dispatch Test1 Done/Dispatch protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { PrintWriter output = resp.getWriter(); output.println("Dispatch"); RequestDispatcher dispatch = req.getRequestDispatcher("/Test1"); dispatch.include(req, resp);; output.println("Done"); }
/Test1 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { PrintWriter output = resp.getWriter(); output.println("Test1"); }
将请求转发给另一个servlet,只是服务器端的转发,对于客户端并无任何影响
PS:调用forWard()之前不能有任何相应确认,如果设置了相应但还未确认(例如println()后还没有flush()),则所有相应会被忽略.如果已经有相应确认,会报出java.lang.IllegalStateException异常
以下代码会转向Test1,而忽略之forward之前的println输出
PrintWriter output = resp.getWriter(); output.println("Dispatch"); RequestDispatcher dispatch = req.getRequestDispatcher("/Test1"); dispatch.forward(req, resp);; output.println("Done");
以下代码会直接报错,因为已经有相应确认
PrintWriter output = resp.getWriter(); output.println("Dispatch"); output.flush(); RequestDispatcher dispatch = req.getRequestDispatcher("/Test1"); dispatch.forward(req, resp);; output.println("Done");
当调派请求的过程中有需要共享的属性,可以使用HttpServletRequest的方法
**setAttribute() 指定名称与对象** **getAttribute() 指定名称获取对象** **getAttributeNames() 获取所有属性名称** **removeAttribute() 移除属性**以下代码的Test1通过getAttribute(“name”)获取到name的集合,需要通过强制转换后才能使用。
/Dispatch protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { PrintWriter output = resp.getWriter(); Listlist = new ArrayList<>(); list.add("Tom"); list.add("jerry"); req.setAttribute("name", list); // 传入字符串和对象 RequestDispatcher dispatch = req.getRequestDispatcher("/Test1"); dispatch.forward(req, resp); output.println("Done "); }
/Test1 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { PrintWriter output = resp.getWriter(); output.println("Test1"); List name = (List)req.getAttribute("name"); output.println(name.get(1)+""); }
要求浏览器重新请求一个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