servlet中转发与重定向的区别

来源:互联网 发布:sql设置取值范围 编辑:程序博客网 时间:2024/05/21 07:14

一、遇到的问题

最近在做一个Java web项目,用Java和jsp写的网上商城。昨天在完成动态显示热门商品和最新商品时,出现了一个问题,IndexServlet可以从数据库中读到商品的数据并在控制台打印出来,但是jsp页面却显示不出来。具体情形如下:

正常情况下红色方块所在区域应该可以显示从数据库中读取的热门商品的图片,但是奇怪的是显示不出来。查看IndexServlet的代码,添加了直接print的代码,发现在控制台可以读出数据库中的数据,代码如下:
public class IndexServlet extends HttpServlet {    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {        //  展示热门商品        ProductService service = new ProductService();        List<Product> hotProductList = service.findHotProductList();        request.setAttribute("hotProductList", hotProductList);                //  展示最新商品        List<Product> newProductList = service.findNewProductList();        request.setAttribute("newProductList", newProductList);        response.sendRedirect("/index.jsp");                //  直接在控制台输出从数据库中读取的商品数据        System.out.println("newProductList" + newProductList);        System.out.println("hotProductList" + hotProductList);            }
控制台输出的数据如下:

可以看到,控制台输出了商品信息,说明从web层到dao层是没有问题的,问题肯定出现在了前端到web层的某个地方。突然看到最后用的是重定向到“/index.jsp”,而不是转发,才发现问题的所在。index.jsp页面只能读到转发的request的域,而重定向后之前setAttribute()就不是在同一个request域中了,所以根本取不到相应的商品数据。
response.sendRedirect("/index.jsp");
改成
request.getRequestDispatcher("/index.jsp").forward(request, response);
后,解决了问题,成功显示商品信息:

正巧趁此机会将转发与重定向总结一下。

二、转发

当使用request.getRequestDispacher("/index.jsp").forward(request, response)时,是是转发。

转发工作流程:

客户端向服务器发送一个request请求后,服务器端匹配合适的servlet并执行。执行完毕后通过request.getRequestDispacher("/index.jsp").forward(request, response)跳转到相应的页面“index.jsp”。整个流程都是在服务器端完成的,跟客户端没有任何关系。而且是在同一个请求中完成的,所以servlet和Jsp共享一个request的域。jsp可以把request域中的attribute读取出来。整个过程是一次请求,一次响应。

三、重定向

当使用response.sendRedirect("/index.jsp")时,是重定向、

重定向工作流程:

客户端向服务器发送一个request请求后,服务端匹配合适的servlet并执行。执行完毕后response.sendRedirect("/index.jsp"),注意这里是response不是request,response通过sendRedirect()方法向用户发送响应,告诉用户必须要再发送一个请求去访问“/index.jsp”。于是客户端重新发送请求到服务器端的“index.jsp”。这是两个过程,互不干扰,request域不能相互访问,这也是为什么之前商品信息没有显示出来的原因,因为重定向后的request的域就不是之前的request的域了,自然取不到在之前的request域中setAttribute()的商品信息。

四、地址栏变化

两种情况下都访问的地址都是http://localhost:8080/SHOP/index,既都访问index这个servlet。如果是用的转发,那么最后地址栏不会改变,始终是http://localhost:8080/SHOP/index,因为只有一次请求,请求的地址就是http://localhost:8080/SHOP/index。但如果是重定向,那么会发现输入的地址是http://localhost:8080/SHOP/index,然后地址会变成http://localhost:8080/SHOP/index.jsp。因为这是两次请求,第一次请求执行完相应的servlet后,会通过response高速客户端重新访问"/index.jsp",所以地址会发生变化。
原创粉丝点击