一:RequestDispatcher.forward()
是在服务器端起作用,当使用forward()时,Servlet engine 传递HTTP请求从当前的Servlet or jsp 到另外一个Servlet JSP 或普通HTML文件
可以进行参数传递 如:
RequestDispatcher rd = context.getRequestDispatcher("/jsp/forward.jsp?name=zhangsan"); RequestDispatcher rd = context.getRequestDispatcher("/F?name=jingjing");
重定向后浏览器地址栏URL不变
例:在servlet中进行重定向
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); ServletContext context = getServletContext(); //forward()到jsp RequestDispatcher rd = context.getRequestDispatcher("/jsp/forward.jsp?name=zhangsan"); //forward()到令一个servlet F为servlet的url-pattern servlet也可进行参数传递 //RequestDispatcher rd = context.getRequestDispatcher("/F?name=jingjing"); request.setAttribute("info", "hello"); //参数传递 rd.forward(request, response); }
路径前必须带有”/” , “/”的含义时项目名称 否则报如下异常:
java.lang.IllegalArgumentException: Path F does not start with a "/" character com.org.MyServlet.doGet(MyServlet.java:31) javax.servlet.http.HttpServlet.service(HttpServlet.java:617) javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
在forward.jsp中取得参数为:
String name = request.getParameter("name");
在servlet中取得参数为:
String name = request.getParameter("name"); String info = (String)request.getAttribute("info");
二:response.sendRedirect()
是在用户的浏览器端工作,sendRedirect() 可以带参数传递,比如servlet?name=zhangsan
重定向后在浏览器地址栏上会出现重定向页面的URL
例:重定向jsp
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); response.sendRedirect("jsp/forward.jsp");
//可传参
//response.sendRedirect("jsp/forward.jsp?name=zhangsan"); }
重定向servlet
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); response.sendRedirect("F"); //可传递参数 //response.sendRedirect("F?name=zhagnsan"); }
比较:
a) 两个都可以实现页面的跳转 forward是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址
response.sendRedirect()则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接,这样,从浏览器的地址栏中可以看到跳转后的链接地址
b) 两者都可以跳转到jsp或者servlet 都可以传递参数
但response.sendRedirect()跳转后后面的代码将不会再执行
例:
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("hello kity"); //不会输出 response.sendRedirect("F?name=zhagnsan"); out.println("good"); //不会输出 }
前者更加高效,在前者可以满足基本需要时,尽量使用RequestDispatcher.forward()方法
三:其他跳转方式
a)修改HTTP header的Location属性来重定向
b)通过设置直接修改地址栏来实现页面的重定向
c)设置jsp若干秒后 自动重定向
response.setHeader("refresh","3;url=forward2.jsp");
注:有不完善或错误之处还请指出。
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/14271.html