在重定向到另一个动作期间Struts 2参数编码问题

时间:2011-01-25 08:05:57

标签: java struts2

我尝试重定向到另一个动作并传输字符串参数。这没有问题,但如果我使用德语变音符号,我会遇到编码问题。

这是我的代码: 第一个动作有一个带有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上显示消息,那么一切正常。编码是正确的。 如果我重定向到另一个动作,则消息字段的setter设置错误的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引起的。

4 个答案:

答案 0 :(得分:5)

问题是tomcat问题,而不是struts问题。 解决方案是在server.xml中将连接器的URIEncoding设置为“utf-8”。 见http://struts.apache.org/2.0.14/docs/how-to-support-utf-8-uriencoding-with-tomcat.html

答案 1 :(得分:1)

可能问题在于生成url(进行动作调用)的方式。例如,如果网址代数如下所示,请注意attribute escape

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

答案 2 :(得分:0)

这个问题看起来与您遇到的问题相同:

Struts2 request character encoding

答案 3 :(得分:0)

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

如果其他任何事情都失败了,我猜有一种hackie方式。您可以将结果发布到普通网页(jsp)。您将该消息值放在输入元素中。然后你编写一个javascript,它自动提交输入元素中的值。不过不推荐。