我们知道,在servlet中实现页面的跳转有好几种方式
现在从以下几个方面来探究一下比较常用的 请求转发 和 重定向 有什么区别!!!
1. 跳转方式
2. 能否跳转外网
3. 能否访问安全目录中页面
4. 能否获取setAttribute中的值
首先配置好相关资源
新建一个web项目,在WebContent目录下新建 index.jsp , login.jsp ,在WEB-INF目录下新建safe.jsp,为了区分这些页面,文件里面写的内容是本文件的名字。之后在src中创建一个servlet包,包里新建一个servlet,命名为TestServlet,作为实验使用。
将index.jsp作为发送请求的页面,写入下面代码:
<a href="./TestServlet">跳转</a>
意思是点击这个链接,将会向服务器发送TestServlet请求,因此我们在TestServlet中分别写两种不同的方式。
下面开始探究每个方面的区别!!!
1.跳转方式
package servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class TestServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
这是没有写处理方式的TestServlet代码,我们将在doGet方法中写两种不同的处理方式。
重定向
response.sendRedirect("login.jsp");
这是重定向方式的处理代码,大致处理方式就是服务器向客户端做出响应,响应需要客户端再向服务器发送另一个请求,也就是括号中的请求,最终服务器响应给你login.jsp中的内容。
这是准备发送请求的页面,点击跳转
这是响应结果,我们发现现在上面地址变成了:http://127.0.0.1:8080//blog_jsp_请求转发/login.jsp,说明确实是直接跳转到了这个页面。
请求转发
request.getRequestDispatcher("login.jsp").forward(request, response);
这是重定向方式的处理代码,大致处理方式就是服务器将发来的请求转发给了指定的地址,最终在这个请求中显示出来。
这是准备发送请求的页面,点击跳转
这是响应结果,我们发现现在上面地址为:http://127.0.0.1:8080//blog_jsp_请求转发/TestServlet,说明客户端只发了一个请求,仅仅是将其它页面的内容显示了出来。
2. 能否跳转外网
将跳转的地址改为外网地址,例如百度:http://www.baidu.com.
重定向
response.sendRedirect("http://www.baidu.com");
可以跳转到外网。
请求转发
request.getRequestDispatcher("http://www.baidu.com").forward(request, response);
不能跳转到外网。
3. 能否访问安全目录中页面
在项目中,WEB-INF文件夹存储的文件安全性是比较高的,我们通过地址无法直接访问,那么,这两种跳转方式哪个可以访问到呢?
重定向
response.sendRedirect("/WEB-INF/safe.jsp");
不能访问safe.jsp。
请求转发
request.getRequestDispatcher("/WEB-INF/safe.jsp").forward(request, response);
可以访问safe.jsp。
结合上面的跳转方式也不难理解:
重定向其实就相当于客户端又重新向服务器发送了一个请求,请求safe.jsp页面的内容,与我们直接通过地址访问没有什么区别,当然无法访问安全目录了。
请求转发则是自己转发请求,将请求来的内容显示在自己页面上,可以访问安全目录也是可以理解的。
4. 能否获取setAttribute中的值
如果在TestServlet新建了一个setAttribute,那么在请求之后的内容是否能够获取得到呢?
我们在login.jsp页面新增一行代码:(这样可以知道请求后的内容是否获取了setAttribute的内容)
${yes }
重定向
request.getSession().setAttribute("yes", "yes");
response.sendRedirect("login.jsp");
并没有显示"yes",说明没有获取setAttribute中的内容。
请求转发
request.getSession().setAttribute("yes", "yes");
request.getRequestDispatcher("login.jsp").forward(request, response);
显示"yes",说明获取到了setAttribute中的内容。
同样结合上面的跳转方式理解:
重定向 :服务器在看到 response.sendRedirect(“login.jsp”); 这行代码时先执行,立刻给客户端返回响应,使其发送另一个请求,而这时候setAttribute还没有建立起来,因此没有获取到setAttribute中的内容。
请求转发:服务器依此执行代码,先建立setAttribute,执行到最后请求转发代码,才开始转发请求,显示内容,这个时候setAttribute已经执行,因此可以获取到setAttribute中的内容。
总结
最后来总结一下两种方式各自的作用:
重定向:跳转外网
请求转发:访问WEB-INF安全目录内容,获取servlet中setAttribute内容