SpringMVC+Velocity整合配置
阿新 • • 發佈:2018-12-23
以下是本人整合SpringMVC+Velocity的一些心得和體會
applicationcontext.xml
<bean id="velocityConfigurer" class="org.springframework.web.servlet.view.velocity.VelocityConfigurer"> <property name="resourceLoaderPath" value="WEB-INF/views/" /> <property name="velocityProperties"> <map> <entry key="input.encoding" value="${vm.file.encoding}"></entry> <entry key="output.encoding" value="${web.encoding}"></entry> <entry key="file.resource.loader.cache" value="${vm.cache}"></entry> <entry key="file.resource.loader.modificationCheckInterval" value="-1"></entry> <!-- cache directive 相關配置 --> <entry key="userdirective" value="com.eyeieye.melody.web.velocity.directive.CacheDirective"></entry> <!-- direcitive.cache.provider 配置cache的提供者 --> <entry key="direcitive.cache.provider" value-ref="velocityViewCache"></entry> <!-- direcitive.cache.close_velocity_cache 控制是否開啟cache,如果是true,則關閉 --> <entry key="direcitive.cache.dev.mode" value="close_velocity_cache"></entry> </map> </property> <property name="configLocation" value="WEB-INF/conf/velocity.properties"></property> </bean> <!-- 配置檢視的顯示 --> <bean id="ViewResolver" class="org.springframework.web.servlet.view.velocity.VelocityLayoutViewResolver"> <property name="prefix" value="/" /><!-- 檢視檔案的字首,即存放的路徑 --> <property name="suffix" value=".vm" /><!-- 檢視檔案的字尾名 --> <property name="toolboxConfigLocation" value="/WEB-INF/tools.xml" /><!--toolbox配置檔案路徑--> <property name="dateToolAttribute" value="date" /><!--日期函式名稱--> <property name="numberToolAttribute" value="number" /><!--數字函式名稱--> <property name="contentType" value="text/html;charset=UTF-8" /> <property name="exposeSpringMacroHelpers" value="true" /><!--是否使用spring對巨集定義的支援--> <property name="exposeRequestAttributes" value="true" /><!--是否開放request屬性--> <property name="requestContextAttribute" value="rc"/><!--request屬性引用名稱--> <property name="layoutUrl" value="layout/default.vm"/><!--指定layout檔案--> </bean>
舉例:
<bean id="velocityConfig" class="org.springframework.web.servlet.view.velocity.VelocityConfigurer"> <property name="resourceLoaderPath" value="/web/default/velocity/"/> <property name="velocityProperties"> <props> <prop key="directive.foreach.counter.name">loopCounter</prop> <prop key="directive.foreach.counter.initial.value">0</prop> <prop key="input.encoding">UTF-8</prop> <prop key="output.encoding">UTF-8</prop> <prop key="directive.foreach.counter.name">velocityCount</prop> <prop key="directive.foreach.counter.initial.value">1</prop> <prop key="velocimacro.library.autoreload">true</prop> </props> </property> </bean> <!-- spring 檢視解析器配置,這裡是我自己寫的解析器 --> <bean id="viewResolver" class="spring.tool.MultipleViewResolver"> <property name="resolvers"> <map> <entry key="jsp"> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/web/default/screen/"/> <property name="suffix" value=".jsp"/> </bean> </entry> <entry key="vm"> <bean class="org.springframework.web.servlet.view.velocity.VelocityViewResolver"> <property name="exposeRequestAttributes" value="true" /> <property name="contentType" value="text/html;charset=UTF-8" /> <property name="prefix" value=""/> <property name="suffix" value=".vm"/> </bean> </entry> </map> </property> </bean>
web.xml配置
<context-param> <param-name>contextConfigLocation</param-name> <param-value> classpath*:/applicationContext.xml </param-value> </context-param> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener> <servlet> <servlet-name>springdispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springdispatcher</servlet-name> <url-pattern>*.htm</url-pattern> </servlet-mapping>
exposeRequestAttributes:預設值false,設定是否所有的request屬性在與模板進行合併之前新增到model中。(可以理解為request範圍內包含的所有物件,而不是一個真正的Request物件。)
exposeSessionAttributes:預設值false,設定是否所有的session屬性在與模板進行合併之前新增到model中。
tool.xml和velocity.properties 兩個檔案,在jar包中都可以找到的
velocity.jar velocity.properties -->> org.apache.velocity.runtime.defaults.velocity.properties
velocity-tool.jar tools.xml -->> org\apache\velocity\tools\generic\tools.xml 記得改下標籤。
velocity.properties要改一下
velocimacro.library = /macros.vm
input.encoding=UTF-8
output.encoding=UTF-8
macros.vm這個隨你自己想不想要,反正預設也是會載入好多spring的巨集的。編碼是一定要設定的。
這些設定完了,還有一點非常重要,這點糾結了我很久 。
就是你明明已經都配置好了,自己都覺得沒問題了,action都進了,最後跳到模板引擎去載入模板的時候,告訴你這個模板找不到!!
經過我仔細排查,是velocity.properties多了句配置,自己需要註釋一下。
#file.resource.loader.path = .
將這句配置註釋,這是說,路徑為properties檔案路徑,但如果你的properties跟你的templates不在一個目錄,這時候就會出問題了。我調進去看過,它預設就是templates目錄,上面巨集的地址,也是相對於templates的目錄。
velocity.properties
directive.set.null.allowed = true
velocimacro.library=org/springframework/web/servlet/view/velocity/spring.vm,macro.vm
resource.loader=file,springMacro
springMacro.resource.loader.class=org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader
eventhandler.referenceinsertion.class=com.eyeieye.melody.web.locale.velocity.LocaleReferenceInsertionEventHandler,com.eyeieye.melody.web.velocity.eventhandler.XssRejectReferenceInsertionEventHandler
reference.insertion.event.handler.direct.variable.names=$!direct-output,$screen_content