﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-nighty-随笔分类-Struts2</title><link>http://www.blogjava.net/nighty/category/46975.html</link><description>折腾的年华</description><language>zh-cn</language><lastBuildDate>Sat, 15 Jan 2011 08:38:45 GMT</lastBuildDate><pubDate>Sat, 15 Jan 2011 08:38:45 GMT</pubDate><ttl>60</ttl><item><title>struts2中重定向中文参数乱码梳理</title><link>http://www.blogjava.net/nighty/archive/2011/01/14/342991.html</link><dc:creator>寒武纪</dc:creator><author>寒武纪</author><pubDate>Fri, 14 Jan 2011 08:41:00 GMT</pubDate><guid>http://www.blogjava.net/nighty/archive/2011/01/14/342991.html</guid><wfw:comment>http://www.blogjava.net/nighty/comments/342991.html</wfw:comment><comments>http://www.blogjava.net/nighty/archive/2011/01/14/342991.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/nighty/comments/commentRss/342991.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/nighty/services/trackbacks/342991.html</trackback:ping><description><![CDATA[<span style="widows: 2; text-transform: none; text-indent: 0px; border-collapse: separate; font: medium Simsun; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="Apple-style-span">&nbsp;&nbsp;&nbsp; 在项目中刚好有一个地方需要在服务器端处理一个请求后，重定向到另一个Action，这样浏览器的url才会变成另一个url，用户重新刷新时，才不会弹出一个对话框问你是不是要重新提交form。于是就自然而然地用了redirectAction。大概如下：<br />
&nbsp;&nbsp;&nbsp;
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><span style="color: #008080">1</span><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">result&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="myInfoSuccess"</span><span style="color: #ff0000">&nbsp;type</span><span style="color: #0000ff">="redirectAction"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">2</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;myapp_myInfo.action?msg=${msg}<br />
</span><span style="color: #008080">3</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">result</span><span style="color: #0000ff">&gt;</span></div>
<br />
&nbsp;&nbsp;&nbsp; 因为重定义会丢失所有的请求参数和值栈，所以这里转向时，加了一个请求参数msg，msg在要重定向的action中设置。<br />
&nbsp;&nbsp;&nbsp; 问题来了，重定向到myapp_myInfo.action时，这个Action里面取出msg参数时变成乱码！！！ 不论中文或是英语还是数字，全是乱码，折腾了一翻，<font size="4" face="宋体">URLEncoder</font>、<font size="4" face="宋体">URLDEncoder</font>进行URL Base64编码和解码处理，包括new String(msg.getBtye("ISO-8859-1"), "UTF-8")这种处理方式仍无法奏效。google了一下并且抱起书本认真看了看struts2重定向问题后。大概有了个思路。<br />
&nbsp;&nbsp;&nbsp; 所有的重定向操作都会丢失所有的请求参数、请求属性等，当然包括Action的处理结果也会丢失。&nbsp;<br />
&nbsp;&nbsp;&nbsp; 首先搞清楚redirect、redirectAction的区别：<br />
&nbsp;&nbsp;&nbsp; 1. redirect类型struts2是调用HttpServletResponse的sendRedirect(String)方法来重定向到指定的资源，可以是一个视图结果，也可以是其它类型的Action；<br />
&nbsp;&nbsp;&nbsp; 2. redirectAction同样是重新生成一个全新的请求。但是struts2内部却是使用ActionMapperFactory提供的ActionMapper来重定向，它只能跳转到另外一个Action；</span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 由于redirectAction使用的是ActionMapper来重定向，也就同时使用ActionMapper的编码方式重新进行编码，这就导致了后面在取出参数时变成乱码，没有具体阅读它的源代码，但是多次不同的编码再想重新还原出来就有点麻烦了。而redirect是使用HttpServletResponse来重定向，就不存在上面的问题。最后改为redirect来重定向，结果如下：<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><span style="color: #008080">1</span><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">result&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="myInfoSuccess"</span><span style="color: #ff0000">&nbsp;type</span><span style="color: #0000ff">="redirect"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">2</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="location"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">myapp_myInfo.action?msg=${msg}</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">3</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="encode"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">true</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">4</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">result</span><span style="color: #0000ff">&gt;</span></div>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 注意：在myapp_myInfo.action对应的Action必须对msg参数做一次转码，因为前面的Action过来时就做了URL base64编码，如果直接发给浏览器，就会在浏览器看到一串带%的URL base64编码字符，所以要加上<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><span style="color: #008080">1</span><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><span style="color: #000000">String&nbsp;msg&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;URLDecoder.decode(getMsg(),&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">UTF-8</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
</span><span style="color: #008080">2</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />setMsg(msg);</span></div>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 把它设置回为中文，浏览器才能正常。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 还得提到另一个重定向类型chain，它是Action链，还能维持当前的值栈不变。不过用它重定向后，虽然跳到其它Action，但是在浏览器端的URL是不会变化的，这样开头提到的那个问题仍是无法解决的！ 
<img src ="http://www.blogjava.net/nighty/aggbug/342991.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nighty/" target="_blank">寒武纪</a> 2011-01-14 16:41 <a href="http://www.blogjava.net/nighty/archive/2011/01/14/342991.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts2+FreeMarker中利用plainText处理Ajax的一个技巧</title><link>http://www.blogjava.net/nighty/archive/2010/11/10/337717.html</link><dc:creator>寒武纪</dc:creator><author>寒武纪</author><pubDate>Wed, 10 Nov 2010 07:43:00 GMT</pubDate><guid>http://www.blogjava.net/nighty/archive/2010/11/10/337717.html</guid><wfw:comment>http://www.blogjava.net/nighty/comments/337717.html</wfw:comment><comments>http://www.blogjava.net/nighty/archive/2010/11/10/337717.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/nighty/comments/commentRss/337717.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/nighty/services/trackbacks/337717.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 项目中使用了FreeMarker做为视图技术，相对来说因为freemarker在视图上有一些逻辑处理功能，某些地方就显得比较方便，特别是macro的使用，当然也不是说JSP就没有这个功能，只是以前用JSP写起来没有这么顺手.......&nbsp;&nbsp;<a href='http://www.blogjava.net/nighty/archive/2010/11/10/337717.html'>阅读全文</a><img src ="http://www.blogjava.net/nighty/aggbug/337717.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/nighty/" target="_blank">寒武纪</a> 2010-11-10 15:43 <a href="http://www.blogjava.net/nighty/archive/2010/11/10/337717.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>