我尝试重定向到另一个动作并传输字符串参数。这没有问题,但如果我使用德语变音符号,我会遇到编码问题。
这是我的代码: 第一个动作有一个带有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引起的。
答案 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)
这个问题看起来与您遇到的问题相同:
答案 3 :(得分:0)
我猜您可以尝试在会话中保存您的消息变量。此外,afaik,一般来说,在Web应用程序中,将信息从1个动作传递到另一个动作的推荐方法是使用会话。
如果其他任何事情都失败了,我猜有一种hackie方式。您可以将结果发布到普通网页(jsp)。您将该消息值放在输入元素中。然后你编写一个javascript,它自动提交输入元素中的值。不过不推荐。