2011-01-25 69 views
6

我尝试重定向到另一个动作并发送一个字符串参数。这工作没有问题,但如果我使用德语元音变音,我有一个编码问题。Struts 2的参数编码问题时重定向到另一个动作

这里是我的代码: 首先行动有getter和setter现场消息。在动作中,我设置了字符串。

private String message; 
public String action1() 
{ 
    message = "ö"; 
    return SUCCESS; 
} 

第二个动作也有一个带有getter和setter的字段消息。

private String message; 

struts.xml中与这两个动作

<action name="action" method="action1" class="de.samba.control.actions.Action1"> 
<result name="success" type="redirectAction"> 
<param name="actionName">action2</param> 
<param name="message">${message}</param> 

<action name="action2" class="de.samba.control.actions.Action2"> 
<result name="success">/pages/showMessage.jsp</result> 

的定义,如果我不使用重定向,并显示在一个jsp消息,一切正常。编码是正确的。 如果我重定向到另一个动作的消息字段设置者设置了错误的formattet字符串“ö”。 我找不到解决方案。有人可以帮我吗?

自己的过滤器:

<filter> 
    <filter-name>CharacterEncodingFilter</filter-name> 
    <filter-class>de.samba.control.CharacterEncodingFilter</filter-class> 
</filter> 

<filter-mapping> 
    <filter-name>CharacterEncodingFilter</filter-name> 
    <url-pattern>*.action</url-pattern> 
</filter-mapping> 

筛选级

public class CharacterEncodingFilter implements Filter { 

    @Override 
public void doFilter(ServletRequest request, ServletResponse response, 
     FilterChain next) throws IOException, ServletException 
{ 
    String encoding = request.getCharacterEncoding(); 
    if (encoding == null || encoding.length() == 0) 
    { 
     request.setCharacterEncoding("UTF-8"); 
    } 
    encoding = request.getCharacterEncoding(); 
    next.doFilter(request, response); 
} 
} 

然后我尝试这个过滤器:

<filter> 
<filter-name>encodingFilter</filter-name> 
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> 
    <init-param> 
     <param-name>encoding</param-name> 
     <param-value>UTF-8</param-value> 
    </init-param> 
    <init-param> 
     <param-name>forceEncoding</param-name> 
     <param-value>true</param-value> 
    </init-param> 
</filter> 

这并不工作过。有人知道这个问题吗?也许它是由Spring Security引起的。

回答

0

这个问题看起来是你有同样的问题:

Struts2 request character encoding

+0

嗨,谢谢你的回答。这似乎是正确的解决方案。但它不起作用。尝试这个我有一个印象,可能不是struts2是债务,但是Spring Security。因为我尝试使用自己的Charakterencoding-Filter和org.springframework.web.filter.CharacterEncodingFilter。两种解决方案都不起作用。我将过滤器代码写入我的问题。也许我犯了错误。 – Rafael 2011-01-25 16:38:40

+0

这不应该是问题。当通过redirectAction重定向一个动作时,我不认为考虑到了web.xml,或者Spring Security。我的猜测是,这与拦截器将某个动作的价值转移到下一个动作有关。也许是一个错误? – Akku 2011-01-26 12:59:27

+0

根据http://struts.apache.org/2.0.14/docs/redirect-action-result.html,redirectAction将“将浏览器重定向到调用指定操作的URL”。如果它重定向浏览器,它将创建一个全新的请求,而不仅仅是通过拦截器,它会再次通过web.xml。 – 2011-01-26 14:48:09

0

我想你可以尝试在会话中保存你的消息变量。此外,一般来说,在Web应用程序中,将信息从1动作传递到另一动作的推荐方式是使用会话。

如果有什么都失败了,我想有一个hackie方式。您可以将结果发布到普通网页(jsp)。您将该消息值放入输入元素中。然后你写一个JavaScript,它会自动提交该输入元素中的值。不过,不建议。

1

也许问题在于生成url(它使得动作调用)的方式。例如,如果url generation是类似于下面的,请注意attribute escape

<s:url namespace="/" action="recursoNuevo" var="recursoNuevo" > 
    <s:param name="contextPath"> 
     <s:property value="contextPath" escape="false"/> 
    </s:param> 
    </s:url>