您的位置:首页 > 编程语言 > Java开发

Spring mvc 实例--使用velocity视图,解决中文乱码问题

2009-08-25 15:15 691 查看
上个星期读了一些spring mvc源码,现在可以将之前的写的简单的例子贴出来,为以后的开发作些准备。

这是一个非常简单的例子,就是使用SimpleFormController实现spring mvc的例子。

首先,在web.xml上配置DispatcherServlet。

<servlet>
<servlet-name>winking</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>winking</servlet-name>
<url-pattern>*.htm</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>winking</servlet-name>
<url-pattern>*.vm</url-pattern>
</servlet-mapping>
<!--
<servlet-mapping> <servlet-name>hessainTest</servlet-name>
<url-pattern>/hessainTest</url-pattern> </servlet-mapping>
-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>


上面配置了DispatcherServlet,而且所有的以htm,vm结尾的url请求都被DispatcherServlet处理。

如果还有用到spring的其他技术的话就需要上面的listener了。

接下来我们看一下控制器类。

public class HomeController extends SimpleFormController {
public HomeController() {
setCommandClass(String.class);
setCommandName("string");
}

protected Map referenceData(HttpServletRequest request) throws Exception {
Map map = new HashMap();
map.put("name", "许赟钦");
map.put("isShow", true);
return map;
}

protected ModelAndView onSubmit(HttpServletRequest request, HttpServletResponse response, Object cmd,
BindException ex) throws Exception {
System.out.println("to do:88888");
return new ModelAndView(this.getFormView(), "home", "Home haha");
}


referenceData()方法是为页面初始渲染提供必要的数据。onSubmit()方法是在处理此对应页面提交时数据,并转向另外一个页面。

这是一个简单的例子,所以我们发出一个URL请求时只用用到referenceData()的方法体。

我们发出这样的URL请求:
http://localhost:8080/winking/home.vm 或http://localhost:8080/winking/home.htm.

然后到这样一个页面v.vm:

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GBK">
<title>Insert title here</title>
</head>
<body>
werwerwerw<br>
${name}
#if(${isShow})
${name} TRUE
#else
false
#end
</body>
</html>


接下来就是核心的配置文件了,上面web.xml里的servlet名称是winking,所以DispatcerServlet会找winking-servlet.xml.

<bean id="homeController" class="com.winking.spring.mvc.test.HomeController">
<property name="sessionForm">
<value>true</value>
</property>
<property name="commandName">
<value>user</value>
</property>
<property name="commandClass">
<value>com.winking.spring.mvc.test.User</value>
</property>
<property name="formView">
<value>v</value>
</property>
<property name="successView">
<value>v</value>
</property>
</bean>
<bean id="urlMapping"
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/home.vm">homeController</prop>
<prop key="/home.htm">homeController</prop>
</props>
</property>
</bean>

<!-- velocity模板引擎 -->
<bean id="velocityConfigurer"
class="org.springframework.web.servlet.view.velocity.VelocityConfigurer">
<property name="resourceLoaderPath">
<value>WEB-INF/velocity/</value>
</property>
<property name="velocityProperties">
<props>
<prop key="input.encoding">GBK</prop>
<prop key="output.encoding">GBK</prop>
</props>
</property>
</bean>
<!-- 解析velocity -->
<bean id="viewResolver"
class="org.springframework.web.servlet.view.velocity.VelocityViewResolver">
<property name="suffix">
<value>.vm</value>
</property>
<property name="contentType">
<value>text/html;charset=GBK</value>
</property>
<property name="dateToolAttribute">
<value>dataTool</value>
</property>
<property name="numberToolAttribute">
<value>numberTool</value>
</property>
<property name="exposeRequestAttributes">
<value>true</value>
</property>
<property name="exposeSessionAttributes">
<value>true</value>
</property>
</bean>


这样子就可以了。

当然上面还是要注意的地方,就是中文问题。

1.需要在vm模板文件加上:<meta http-equiv="Content-Type" content="text/html; charset=GBK">

2.在"velocityConfigurer"加上

<property name="velocityProperties">

<props>

<prop key="input.encoding">GBK</prop>

<prop key="output.encoding">GBK</prop>

</props>

</property>

3.在"viewResolver"加上<property name="contentType">

<value>text/html;charset=GBK</value>

</property>

最主要是确保所有的字符集都是统一的。

<property name="dateToolAttribute">
<value>dataTool</value>
</property>
<property name="numberToolAttribute">
<value>numberTool</value>
</property>
<property name="exposeRequestAttributes">
<value>true</value>
</property>
<property name="exposeSessionAttributes">
<value>true</value>
</property>


上面四个property很简单,前面两个是在模板方便处理时间和数字格式显示。

后面两个是在vm模板能够访问request和session的数据。

另外还需要一般性的配置,就是在web.xml配置filter

<filter>
<filter-name>CharacterSetEncoding Filter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>GBK</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>false</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterSetEncoding Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>


这样子就完全解决了spring mvc velocity的中文问题了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: