由於Struts框架直接把表單數據發送給了ActionForm,所以這裏面沒有對HttpRequestServlet進行SetCharacterEncoding,所以默認是按照ISO-8859-1(參見Tomcat 源代碼中的org.apache.catalina.connector.HttpRequestBase中的protected void parseParameters()方法),
解決的方法,就是在表單提交到ActionForm之前對request進行編碼。
第一種方法,就是寫一個過濾器,對所有請求進行過濾
過濾器代碼:
package jp.co.ricoh.gtis.others.profile.filters;
import javax.servlet.Filter;
public class SetCharacterEncodingFilter implements Filter {
public void doFilter(ServletRequest request, ServletResponse response,
public void destroy() { } } |
配置文件web.xml
<filter> <filter-name>SetCharacterEncodingFilter</filter-name> <filter-class>jp.co.ricoh.gtis.others.profile.filters.SetCharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>utf-8</param-value> </init-param> </filter>
<filter-mapping> |
第二種方法是替換默認的控制器org.apache.struts.action.ActionServlet
子類代碼:
package jp.co.ricoh.gtis.others.profile.controllers; import java.io.IOException;
import javax.servlet.ServletException; import org.apache.struts.action.ActionServlet; public class SetEncodingActionServlet extends ActionServlet {
protected void process(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { } |
配置文件web.xml
<servlet> <servlet-name>testAction</servlet-name> <servlet-class>jp.co.ricoh.gtis.others.profile.controllers.SetEncodingActionServlet</servlet-class> <init-param> <param-name>config</param-name> <param-value>/WEB-INF/struts-config.xml</param-value> </init-param> <init-param> <param-name>encoding</param-name> <param-value>utf-8</param-value> </init-param> <load-on-startup>2</load-on-startup> </servlet>
<servlet-mapping> |
此例,凡是通過*.testdo來請求的數據,都會經過參數encoding設定的值來編碼。