Spring下velocity页面中文乱码问题

一、单一映射的解决方案。

     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>

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值