论坛首页 Java企业应用论坛

jsp页面跳转方法及区别

浏览 6957 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (6) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-05-10  
当前项目需求:需要在SSH项目中使用Spring Security作为用户权限管理,在客户端使用ExtJS实现。需要在用户登陆一段时间没有操作时,提示登陆超时,回到登陆页面。

这里首先介绍一下jsp中实现页面跳转的两种常用方法,及与普通http跳转请求(如直接输入网址)之前的区别。

在项目的web.xml中加入自己实现Filter接口的过滤器,实现对指定的请求进行转发。

1、 通过dispatcher的forward方法实现转发,如
request.getRequestDispatcher("/login.jsp").forward(request, response);


2、 通过HttpServletResponse的sendRedirect方法实现跳转,如
responseHttp.sendRedirect(requestHttp.getContextPath()+"/login.jsp")


上面这两种方法在请求响应之前,都能实现转发,但是又有不同。
forward方法只是在后台进行转发,客户端并不知道它发出的请求发生了转换,如客户端需要向后台请求A资源,但后台发现A资源不是A所有,这时后台使用forward转发请求到拥有A资源的B这里,之后由B返回给客户端,所以客户端这时并不知道A资源不是它所以的A所提供的!
sendRedirect方法,后台并不像上者那样作为一个中介方,后台若发现客户端请求的A资源不在A这里,则返回客户端A资源的正确路径,这时客户端再次发送请求。

但需要注意的是,上面提到的两种方法,并不是每种请求都有效的。这里就是它们和直接输入网址的区别。当客户端发出的请求时Ajax异步请求时,该请求本身并没有跳转页面的请求,只是获取后台数据,这时上面的两种方法都是不能实现跳转的,因为后台是没有权利要求客户端实现页面刷新的,这也是说请求必须是在响应请求之前转发。
   发表时间:2011-05-10  
楼主幸苦啦
0 请登录后投票
   发表时间:2011-05-10  
后者本质上是返回一个302的response,header部分声明location为临时的转发地址
0 请登录后投票
   发表时间:2011-05-11  
yangyi 写道
后者本质上是返回一个302的response,header部分声明location为临时的转发地址

这次我并没有详细去观察forward和sendRedirect这两种方法header部分的区别。但是我遇到的问题是:当我需要转发一个action请求时,如"test_test"(在Struts.xml声明_的后面为action,前面为方法),这时sendRedirect可以达到预计的效果,但是forward并不能实现转发!
0 请登录后投票
   发表时间:2011-05-13  
forward 在同一个request 里,redirect 不在同一个request 里。 所以,当您使用redirect时: 浏览器的地址栏会发生改变,forward则不会改变! 
0 请登录后投票
   发表时间:2011-05-13  
楼上说的一样
request.getRequestDispatcher("/login.jsp").forward(request, response);   此时相当于一中间过程,并带有请求前的信息,与请求后的信息

responseHttp.sendRedirect(requestHttp.getContextPath()+"/login.jsp")   是一定要转发的,且不带原始页面参数,
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics