1. 程式人生 > >SpringMVC+Velocity整合配置

SpringMVC+Velocity整合配置

以下是本人整合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