`
mj4d
  • 浏览: 299850 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

springmvc 3.1整合velocity

    博客分类:
  • java
阅读更多

一直想折腾下spring mvc,今天下午的酱油时间对这个做了一些接触,主要是springMVC和velocity的配置

 

1、首先在web.xml中加入MVC的整合:

	<servlet>
		<servlet-name>springmvc</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>classpath:spring-mvc.xml</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>springmvc</servlet-name>
		<url-pattern>*.htm</url-pattern>
	</servlet-mapping>

 这里如果没有contextConfigLocation初始化参数,将会在classpath下寻找{servlet-name}-servlet.xml的配置文件:

	public String getNamespace() {
		return (this.namespace != null ? this.namespace : getServletName() + DEFAULT_NAMESPACE_SUFFIX);
	}

 

 

 

2、这里在spring-mvc.xml配置对velocity配置属性和视图解析

	<bean id="velocityConfig" class="org.springframework.web.servlet.view.velocity.VelocityConfigurer">
		<property name="resourceLoaderPath" value="/WEB-INF/vm"/>
		<property name="configLocation" value="classpath:velocity.properties"/>
        </bean>

 在velocity.properties中配置velocity的属性:

#encoding
input.encoding	=UTF-8
output.encoding=UTF-8
contentType=text/html;charset=UTF-8

#autoreload when vm changed
file.resource.loader.cache=false
file.resource.loader.modificationCheckInterval	=1
velocimacro.library.autoreload=true

#macro
velocimacro.library=macro.vm
#velocimacro.library	=/WEB-INF/vm/macro.vm

#layout
#tools.view.servlet.layout.directory	=/WEB-INF/vm/layout/
#tools.view.servlet.error.template=/WEB-INF/vm/error.vm
#tools.view.servlet.layout.default.template=default.vm

runtime.log.logsystem.class=org.springframework.ui.velocity.CommonsLoggingLogSystem
runtime.log=com.sa
runtime.log.error.stacktrace=true
runtime.log.warn.stacktrace=true
runtime.log.info.stacktrace=false
runtime.log.invalid.reference=true

上面的velocimacro.library设置macro是放在classpath,如果其他路径就会抛出异常,如velocimacro.library =/WEB-INF/vm/macro.vm。这是否我配置有问题,求路过达人求解

VelocityException: Velocimacro : Error using VM library : /WEB-INF/vm/macro.vm

 

当然,这些属性也可以在spring-mvc.xml中配置:

	<bean id="velocityConfig" class="org.springframework.web.servlet.view.velocity.VelocityConfigurer">
		<property name="resourceLoaderPath" value="/WEB-INF/vm"/>
		<property name="configLocation" value="classpath:velocity.properties"/>

		<!--
			<property name="velocityProperties">
				<props>
					<prop key="input.encoding">UTF-8</prop>
					<prop key="output.encoding">UTF-8</prop>
					<prop key="contentType">text/html;charset=UTF-8</prop>

					<prop key="file.resource.loader.cache">false</prop>
					<prop key="file.resource.loader.modificationCheckInterval">1</prop>
					<prop key="velocimacro.library.autoreload">true</prop>

					<prop key="velocimacro.library">macro.vm</prop>

					<prop key="runtime.log.logsystem.class">org.apache.velocity.runtime.log.SimpleLog4JLogSystem</prop>
					<prop key="runtime.log">com.sa</prop>
					<prop key="runtime.log.error.stacktrace">true</prop>
					<prop key="runtime.log.warn.stacktrace">true</prop>
					<prop key="runtime.log.info.stacktrace">false</prop>
					<prop key="runtime.log.invalid.reference">true</prop>
				</props>
			</property>
			-->
	</bean>

当然也支持layout:上面的解析器需要修改:

org.springframework.web.servlet.view.velocity.VelocityLayoutViewResolver

和增加属性:

<property name="layoutUrl" value="layout.vm"/>

 这里需要注意:layout.vm以及layout.vm中涉及的模板文件如head.vm、bottom.vm等需要一起放在classpath路径下。否则就会抛出找不到相应模板的异常

 

 

3、velocity的视图解析器

	<bean id="viewResolver" class="org.springframework.web.servlet.view.velocity.VelocityViewResolver">
		<property name="suffix" value=".vm"/>
		
		<!-- 使用springMacro、使用servlet的对象 -->
		<property name="exposeSpringMacroHelpers" value="true"/>
		<property name="exposeRequestAttributes" value="true"/>
		<property name="exposeSessionAttributes" value="true"/>
		
		<property name="contentType" value="text/html;charset=UTF-8" />
		
		<!-- spring的日期格式化 -->
		<property name="dateToolAttribute" value="dateTool"/>
		
		<!-- velocity toolbox -->
		<property name="toolboxConfigLocation" value="/WEB-INF/vm/toolbox.xml"/>
	</bean>

 上面的velocity toolbox配置中toolbox.xml放在其他位置为报NullPointerException,见

http://forum.springsource.org/showthread.php?30783-Exposing-Velocity-generic-tool-results-in-NullPointer

 

下面是一个自定义的toolbox.xml:

<?xml version="1.0" encoding="UTF-8"?>
<toolbox>
	<tool>
		<key>dateUtil</key>
		<scope>application</scope>
		<class>com.sa.common.util.DateUtil</class>
	</tool>
</toolbox>
 

 

4、测试:

这里主要对自定义的macro和toolbox进行了测试

macro中写了一个简单的测试:

#macro(test)
    nnnnnnnnnnnn
#end

在com.sa.common.util.DateUtil中有一个简单的测试方法:

    public static String test(String str){
        return "this is a test. hello "+str;
    }

在测试vm中:index.vm

#test()
<br>
$!dateUtil.test("velocity")

结果:

 写道
nnnnnnnnnnnn
this is a test. hello velocity

 

 

5、遇到的一些异常:

当然上面已经说了一些,下面还有:

java.lang.NoSuchMethodError: org.springframework.core.GenericTypeResolver.resolveTypeA

这个是放入了不同版本的spring jar包。见:

http://fedora-commons.1317035.n2.nabble.com/fcrepo-user-java-lang-NoSuchMethodError-org-springframework-core-GenericTypeResolver-resolveTypeArguh-td7002643.html


 

在引入toolbox时编译报错:

/java.lang.NoClassDefFoundError: org/apache/commons/digester/RuleSet

这个很简单嘛,加入digester依赖,但是开始加入的是3.2版本,老是报错,后来发现该版本包结构发生变化,还是改为

		<dependency>
			<groupId>commons-digester</groupId>
			<artifactId>commons-digester</artifactId>
			<version>2.0</version>
		</dependency>

好了,目前就这些,等进一步学习再记录吧

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics