一直想折腾下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,见
下面是一个自定义的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")
结果:
5、遇到的一些异常:
当然上面已经说了一些,下面还有:
java.lang.NoSuchMethodError: org.springframework.core.GenericTypeResolver.resolveTypeA
这个是放入了不同版本的spring jar包。见:
在引入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>
好了,目前就这些,等进一步学习再记录吧