Struts中的URL传递的问题(forward标签的redirect属性)
在一个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:
这样我遇到的问题就解决了
推荐阅读
-
Struts中的URL传递的问题(forward标签的redirect属性)
-
jquery.ajax的url中传递中文乱码问题的解决方法
-
关于查询中查询无果,也不报错,inpout标签中的value属性为‘ ’的判断问题
-
页面使用struts2标签获取List中的对象属性值,Struts2常用标签总结
-
Struts中的URL传递的问题(forward标签的redirect属性)
-
发送html邮件a标签中的url不显示的问题
-
关于PHP中URL参数的传递有关问题
-
存储过程传递参数与表中字段属性相同导致错误的问题_MySQL
-
存储过程传递参数与表中字段属性相同导致错误的问题_MySQL
-
ASP.NET中url传递中文的解决方案,传递参数为汉字时出现乱码等问题