JSP+Servlet之間亂碼的解決僅僅只需一個Filter過濾器即可,為什么在Struts2.x+Hibernate3.0+Spring2.0(以下簡稱S2SH)中亂碼卻解決不了呢?因為在S2SH的整合中,Struts2.x的監(jiān)聽監(jiān)管了JSP頁面與Java代碼的咬合,這個監(jiān)管也包括編碼的處理,所以當我們編寫了認為萬無一失的過濾器之后卻失效的原因,我的解決方案如下,在此拋磚引玉,如果有更好的辦法和建議,望大家提出來。
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import
org.apache.struts2.dispatcher.FilterDispatcher;
public class MyFilter extends FilterDispatcher implements Filter {
private FilterConfig config = null;
private String encoding = null;
@Override
public void init(FilterConfig config) throws ServletException {
this.config = config;
}
@Override
public void doFilter(ServletRequest request, ServletResponse
response,
FilterChain chain) throws IOException, ServletException
{
if (encoding == null) {
encoding = config.getInitParameter("encoding");
}
request.setCharacterEncoding(encoding);
chain.doFilter(request, response);
}
@Override
public void destroy() {
config = null;
encoding = null;
}
}
這個過濾器和平時所編寫不同的是它集成自Struts2.x的FilterDispatcher,另外Web.xml的配置如下:
注意此處的順序,自己編寫的過濾器需要配置在首行
<!-- 解決中文亂碼問題 -->
<filter>
<filter-name>encodeFilter</filter-name>
<filter-class>com.custservice.util.MyFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>gb2312</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodeFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>myfilter</filter-name>
<filter-class>
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>myfilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- Struts2的配置 -->
<filter>
<filter-name>struts2.x</filter-name>
<filter-class>
org.apache.struts2.dispatcher.FilterDispatcher
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2.x</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Web.xml配置好后,還需要配置Struts2.x的屬性文件,在Struts2.x的資源文件夾中找到Struts.properties修改如下:
### This can be used to set
your default locale and encoding scheme
struts.locale=en_US
struts.i18n.encoding=iso-8859-1
改成
### This can be used to set
your default locale and encoding scheme
struts.locale=zh_US
struts.i18n.encoding=gb2312