您的位置:首页 > 编程语言 > Java开发

struts2 action 跳action 传递中文乱码问题解决

2013-01-13 21:19 561 查看
前不久在做项目的时候遇到个乱码问题、

心想这乱码跟其他乱码肯定一样好解决、

可是半天过去了、那乱码还是一样屹立在那、

使用浑身解数都没有好的方法解决、

最后看到了一个帖子、

才有了解决办法、

如果使用的是rediect这样解决:

[html]
view plaincopyprint?

<action
name="remove"
class="cn.Xxooacion"
method="remove">

<result
name="success"
type="redirect">

<param
name="location">list.action?msg=${msg}</param>

<param
name="encode">true</param>

</result>

</action>

<action name="remove" class="cn.Xxooacion" method="remove">
<result name="success" type="redirect">
<param name="location">list.action?msg=${msg}</param>
<param name="encode">true</param>
</result>
</action>


或者是:

[html]
view plaincopyprint?

<result
name="remove"
type="redirect">

<param
name="location">list.action</param>

<param
name="parameter">${parameter}</param>

</result>

<result name="remove" type="redirect">
<param name="location">list.action</param>
<param name="parameter">${parameter}</param>
</result>


都可以、

或者是使用chain:

[html]
view plaincopyprint?

<action
name="remove"
class="cn.Xxooaction"
method="remove">

<action name="remove" class="cn.Xxooaction" method="remove">


[html]
view plaincopyprint?

<param
name="actionName">list.action</param>

<param name="actionName">list.action</param>


[html]
view plaincopyprint?

<param
name="msg">${msg}</param>

<param name="msg">${msg}</param>


[html]
view plaincopyprint?

</action>

</action>


或者:

[html]
view plaincopyprint?

<result
type="chain">

<param
name="actionName">list.action?msg=${msg}</param>

</result>

<result type="chain">
<param name="actionName">list.action?msg=${msg}</param>
</result>


引用:http://topic.csdn.net/u/20100617/14/bcf61d50-2bc9-4b39-a3d1-f6bf6b8dc2f8.html?seed=577600062&r=79360905#r_79360905

里楼主说的总结:

[plain]
view plaincopyprint?

我觉得问题的关键在于不恰当的使用了redirect!
原因如下:
redirect就是资源重定向,一般用于跳转到其它网站访问所用。如果访问的是内部网站资源,使用redirect就是一种下策,因为redirect无法将前一个请求的参数共享给下一个网站使用,比如request中的参数。当然可以用地址参数来传递,那么问题就来了,也是本贴的主题,就是中文参数乱码问题。因为资源重定向跳转要经过客户端浏览器的重新发送(可以试验一下,重定向发送的请求在浏览器地址栏里最终显示的是重定向后的请求地址,而chain则是第一个action的请求地址),其实这也就是servlet中sendRedirect和forward(include)的区别。中文乱码的原因也就在这里,因为经过浏览器跳转后编码就不受struts2管理了。

注:为什么经过浏览器跳转编码就变了原因很复杂,因为本贴的跳转实际还是受原网站控制的,浏览器输出时不论本地默认编码为何已经强制被改为UTF-8,按理说跳转后浏览器重新申请时应该还是UTF-8编码,但不知为什么却变成了ISO-8859-1,这里期待高人给解释一下。

多说一点,返回类型中还有一个redirectAction,书上的解释是重定向到一个新的action,请求参数全部丢失,action处理结果也全部丢失。按这个解释,redirectAction和chain的区别就是一个跳转时丢失参数,一个不丢失。这里就让人费解了,因为chain完全可以替代redirectAction嘛。我觉得这个redirectAction的作用是不是适用于不用传参或传递简单参数的情况,这样便于系统将前面action的资源尽快释放,做到资源充分利用?这里高手给解释一下。redirectAction会不会产生中文传参乱码我没有试验,不过楼上有朋友说没有问题,那就算可以吧。

最后总结一下:
1、凡是网站内部资源访问的就尽量不要用redirect,而是用chain和redirectAction,至少这样可以避免中文传参乱码。

2、chain传参方法我就不说了,就是request、parameters,但能不用session就不要用session了。

3、使用redirect传参时,如果带中文目前好像就只有用本贴开始所说的解决方案了。有些朋友所说的过滤器并不是和本贴说的一个问题,而是指struts2框架以前浏览器提交乱码问题。

上面有些结论只是根据别人的说法下的定义,有误之处请朋友们指正。

我觉得问题的关键在于不恰当的使用了redirect!
原因如下:
redirect就是资源重定向,一般用于跳转到其它网站访问所用。如果访问的是内部网站资源,使用redirect就是一种下策,因为redirect无法将前一个请求的参数共享给下一个网站使用,比如request中的参数。当然可以用地址参数来传递,那么问题就来了,也是本贴的主题,就是中文参数乱码问题。因为资源重定向跳转要经过客户端浏览器的重新发送(可以试验一下,重定向发送的请求在浏览器地址栏里最终显示的是重定向后的请求地址,而chain则是第一个action的请求地址),其实这也就是servlet中sendRedirect和forward(include)的区别。中文乱码的原因也就在这里,因为经过浏览器跳转后编码就不受struts2管理了。
注:为什么经过浏览器跳转编码就变了原因很复杂,因为本贴的跳转实际还是受原网站控制的,浏览器输出时不论本地默认编码为何已经强制被改为UTF-8,按理说跳转后浏览器重新申请时应该还是UTF-8编码,但不知为什么却变成了ISO-8859-1,这里期待高人给解释一下。
多说一点,返回类型中还有一个redirectAction,书上的解释是重定向到一个新的action,请求参数全部丢失,action处理结果也全部丢失。按这个解释,redirectAction和chain的区别就是一个跳转时丢失参数,一个不丢失。这里就让人费解了,因为chain完全可以替代redirectAction嘛。我觉得这个redirectAction的作用是不是适用于不用传参或传递简单参数的情况,这样便于系统将前面action的资源尽快释放,做到资源充分利用?这里高手给解释一下。redirectAction会不会产生中文传参乱码我没有试验,不过楼上有朋友说没有问题,那就算可以吧。
最后总结一下:
1、凡是网站内部资源访问的就尽量不要用redirect,而是用chain和redirectAction,至少这样可以避免中文传参乱码。
2、chain传参方法我就不说了,就是request、parameters,但能不用session就不要用session了。
3、使用redirect传参时,如果带中文目前好像就只有用本贴开始所说的解决方案了。有些朋友所说的过滤器并不是和本贴说的一个问题,而是指struts2框架以前浏览器提交乱码问题。
上面有些结论只是根据别人的说法下的定义,有误之处请朋友们指正。


也查了查chain的作用:

[plain]
view plaincopyprint?

Chain:基本用途是构造成一条动作链。前一个动作将控制权转交给后一个动作,而前一个动作的状态在后一 个动作里仍然保持着。动作链由Chaining拦截器负责处理,因为这个拦截器是defaultStack拦截器栈的一份子,多以你随时都可以使用动作链。

Chain:基本用途是构造成一条动作链。前一个动作将控制权转交给后一个动作,而前一个动作的状态在后一 个动作里仍然保持着。动作链由Chaining拦截器负责处理,因为这个拦截器是defaultStack拦截器栈的一份子,多以你随时都可以使用动作链。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: