2011-01-25 116 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>