简单理解:重定向(sendRedirect)就相当于你在浏览器上重新请求一次重定向的地址,不会附带本次请求的任何参数,重定向之后,浏览器上可以看到url地址有变。而转发(forward)后的请求会附带本次请求的各个参数,并且浏览器上的url保持不变,用户几乎不会知道请求转发。
重定向的写法:response.sendRedirect(url);
转发的的写法:req.getRequestDispatcher(url).forward(request, response);或者是getServletContext().getRequestDispatcher(url).forward(request, response);
这里的url是String类型,而不是URL对象。
sendRedirect可以放完整的url,也可以放相对路径,其中,相对路径分为两种,一种是带斜杠(/)开头的,表示相对于应用本身的请求;另一种是没有斜杠开头的,表示是相对于当前请求路径开始。
例如请求为localhost:8080/myweb/ab/cd,其中myweb是项目名
sendRedirect(“/login”)表示请求的地址为:localhost:8080/myweb/login
sendRedirect(“login”)表示请求的地址为:localhost:8080/myweb/abc/login
request.getRequestDispatcher(url)中的url只能放相对路径,和sendRedirect放相对路径一样也是有两种类型,只是sendRedirect放的是请求地址,而getRequestDispatcher放的一般是该web项目中jsp路径,特别说明一点,哪怕你的路径有很多的”../../../”也无法超过web应用的根而去访问web项目之外的资源。
getServletContext().getRequestDispatcher(url)中的url只能是斜杠(/)开头
req.setAttribute("userName", "张三");
req.getRequestDispatcher("/login.jsp").forward(req, resp);
我们常用的Spring就是采用这种方式将参数转发到jsp上的。