一、单一映射的解决方案。
1. 便于管理,将.vm文件格式设置为UTF-8编码;
2. 在applicationContext.xml中添加velocity引擎
<bean id="velocityConfigurer" class="org.springframework.web.servlet.view.velocity.VelocityConfigurer"> <property name="resourceLoaderPath" value="/"></property> <property name="velocityProperties"> <props> <prop key="input.encoding">UTF-8</prop> <prop key="output.encoding">UTF-8</prop> </props> </property> </bean>
3.添加视图解析器
<bean id="velocityViewResolver" class="org.springframework.web.servlet.view.velocity.VelocityViewResolver"> <property name="suffix"><value>.vm</value></property> <property name="contentType"><value>text/html;charset=UTF-8</value></property> </bean>
按上述配置后,则显示中文正常。不过具体实现是有几点需要注意:
a.
<property name="resourceLoaderPath" value="/"></property>
由于设置引擎的路径是/,所以具体的view是不能再以/开头,如WEB-INF/x,而不能为/WEB-INF/x
b.
<property name="suffix"><value>.vm</value></property>
后缀名已经申明为.vm,所以view不用再申明.vm后缀,即WEB-INF/x,而不能为WEB-INF/x.vm,不然会被用于查找WEB-INF/x.vm.vm.
二、多映射的解决方案
利用VelocityViewResolver,使得视图与url只能进行固定的单一映射,若希望使用ResourceBunlderViewResovler则又会出现中文乱码,解决这一问题则需要使用过滤器Filter。
1. 编写过滤器的代码
public class CharacterEncodeFilter implements Filter {
private String characterSetName = null;
private boolean enableEncoding = false;
/**
* @see javax.servlet.Filter#destroy()
*/
public void destroy() {
}
/**
* @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest,
* javax.servlet.ServletResponse, javax.servlet.FilterChain)
*/
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
System.out.println(this.enableEncoding);
System.out.println(this.characterSetName);
if (this.enableEncoding)
{
//request.setCharacterEncoding(characterSetName);
response.setContentType("text/html;charset=" + characterSetName);
}
chain.doFilter(request, response);
}
/**
* @see javax.servlet.Filter#init(javax.servlet.FilterConfig)
*/
public void init(FilterConfig config) throws ServletException {
loadConfigurer(config);
}
/**
* 载入配置信息
*
* @param config
*/
private void loadConfigurer(FilterConfig config) {
characterSetName = config.getInitParameter("characterSetName");
String enable = config.getInitParameter("enableEncoding");
if (enable != null && enable.equalsIgnoreCase("true"))
{
this.enableEncoding = true;
} else
{
this.enableEncoding = false;
}
}
}
2.在web应用的web.xml文件中添加过滤器设置
<filter> <filter-name>characterFilter</filter-name> <filter-class>filters.CharacterEncodeFilter</filter-class> <init-param> <param-name>characterSetName</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <param-name>enableEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>characterFilter</filter-name> <url-pattern>*.html</url-pattern> </filter-mapping>
上述过滤器当后缀名为html时才生效。其实这种利用过滤器的方法对于任何页面的乱码都同样有效,注意,当你需要过滤器其他文件访问时,请设置<filter-mapping>下的<url-pattern>为相应的文件即可。
三、使用spring内置过滤器
其实,spring自己提供一个编码过滤器,因而只需要在web.xml中将其进行设置即可。
<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> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>