欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Struts中的URL传递的问题(forward标签的redirect属性)

程序员文章站 2022-10-31 18:34:27
  在一个struts项目中,碰到这么一个问题: 用户的登录页面地址是: https://localhost:8080/sduprs/user/user_login. 登录后显示的地址为:...
 

在一个struts项目中,碰到这么一个问题:

用户的登录页面地址是:

https://localhost:8080/sduprs/user/user_login.

登录后显示的地址为:

https://localhost:8080/sduprs/userlogin.do

更悲剧的是我们在后台使用了frame框架。这样登录后所有的操作地址都显示为上面的那个地址。大师兄不满意,要求修改为实际地址。在网上查了半天资料,发现是url转发问题,具体点就是actionforward的问题。下面是关于actionforward的资料:

(1)actionforward是struts的核心类之一,其基类仅有4个属性:name / path / redirect / classname。在基于struts的web应用过程中,action操作完毕后程序会通过struts的配置文件struts- config.xml链接到指定的actionforward,传到struts的核心类actionservlet,actionservlet使用 actionforward提供的路径,将控制传递给下一个步骤。actionforward控制接下来程序的走向。actionforward代表一个 应用的uri,它包括路径和参数。
(2)actionforward的参数除了在struts-config.xml和页面中设置外,还可以通过在action类中添加参数,或重新在 action中创建一个actionforward。
(3)在actionforward中有一个重要的属性redirect,当redirect=false时,将保存存储在http请求和请求上下文中 的所有内容,仅在同一个应用中可用。当redirect=true时,web客户端进行一次新的http请求,请求的资源可以在同一个应用中,也可以不 在,原来的请求参数不再保存,原来的请求上下文也被清除,新的http请求仅包含actionforward的path属性里所包含的参数。如果在同一个 应用中,用户会话的上下文会被维护。
(4)actionforward分为全局转发和局部转发,action的mapping对象的findforward方法首先会检查局部转发列表,查 找失败就会到全局转发列表中查找。书写格式中,我们一般将全局变量定义为string常数,避免误解,使得转发列表结构清晰易读。

实际上,struts有两种定向方式:转发和重定向(redirect)。当我们用了重定向的时候,是把页面完全转向到请求的视图去了。同时,上边的url也更新了。这样的优点是请求完全转移,缺点是无法用request.setattribute传递参数值;当我们使用转发的时候,是将本次请求的request传递给了要定向的jsp或者servlet。同时执行被请求的jsp或 servlet,结果显示出来。但是,浏览器上看到的依然是发出请求的url,而不是结果的url,这种方式的优点:可以向被请求的jsp或 servlet传递值request.setattribute,缺点是url依然是请求的url,不是结果的url,刷新的话,将再次执行该请求。

根据上面的介绍我发现使用redirect必须谨慎。仔细排查了下处理登录页面的action,发现只是向session写入了user变量,并没有使用request.setattribute传参。因此就把struts-config.xml里actionforward的redirect属性设置为了true:

这样我遇到的问题就解决了