在使用JFinal3.2的时候发现,JFinal提供的Enjoy Template Engine这个模版工具挺好用,就想集成到SpringMVC中使用。首先,先按照使用文档操作一番。把jsp或freemarker等模版的bean配置替换成enjoy的配置;
JSP模版
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/view/" />
<property name="suffix" value=".jsp" />
</bean>
Freemarker模版
<!-- freemarker的配置 -->
<bean id="freemarkerConfigurer"
class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
<property name="templateLoaderPath" value="/view/" />
<property name="defaultEncoding" value="UTF-8" />
<property name="freemarkerSettings">
<props>
<prop key="template_update_delay">10</prop>
<prop key="locale">zh_CN</prop>
<prop key="datetime_format">yyyy-MM-dd HH:mm:ss</prop>
<prop key="date_format">yyyy-MM-dd</prop>
<prop key="number_format">#.##</prop>
</props>
</property>
</bean>
<!-- FreeMarker视图解析 如返回userinfo。。在这里配置后缀名ftl和视图解析器。。 -->
<bean id="viewResolver"
class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
<property name="viewClass"
value="org.springframework.web.servlet.view.freemarker.FreeMarkerView" />
<property name="suffix" value=".html" />
<property name="contentType" value="text/html;charset=UTF-8" />
<property name="exposeRequestAttributes" value="true" />
<property name="exposeSessionAttributes" value="true" />
<property name="exposeSpringMacroHelpers" value="true" />
<property name="requestContextAttribute" value="request"/>
</bean>
替换为enjoy的模版
<bean id="viewResolver" class="com.jfinal.template.ext.spring.JFinalViewResolver">
<property name="devMode" value="true" />//详情见官网
<property name="sessionInView" value="true" />//详情见官网
<property name="exposeRequestAttributes" value="true" />//开启这个属性,enjoy才能读取request.setAttribute()中的参数
<property name="prefix" value="/view/" />
<property name="suffix" value=".html" />
<property name="order" value="1" />
<property name="contentType" value="text/html;charset=utf-8" />
</bean>
此时,enjoy的基本配置已经完成,可以使用。但会突然间发现,无法像jsp或freemarker那样简单的获取到contextPath这个参数。翻看enjoy的使用手册,发现enjoy提供了一个addSharedObject方法供我们添加参数。个人觉得不应使用拦截器,毕竟只是一个固定参数。我是想在项目加载完成的时候直接加载contextPath这个参数就好。以前一直以为只用在request里面才有这个参数,现在发现容器的ServletContextListener与SpringMVC提供的ApplicationListener<ContextRefreshedEvent>都可以获取到contextPath。毕竟在springMVC中在非Controller获取到request还是比较难的,试了好久都拿不到。首先贴上ServletContextListener的代码。使用ServletContextListener首先要在web.xml中加入listener
<listener>
<listener-class>com.springmvc.handler.EnjoyCore</listener-class>
</listener>
package com.springmvc.handler;
public class EnjoyCore implements ServletContextListener{
@Override
public void contextDestroyed(ServletContextEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void contextInitialized(ServletContextEvent arg0) {
JFinalViewResolver.engine.addSharedObject("ctx",arg0.getServletContext().getContextPath());
System.out.println("JFinal-enjoy固定参数加载完成。");
}
}
若使用ApplicationListener<ContextRefreshedEvent>首先要在配置enjoy的xml的最后加多一行:
<bean id="enjoycore" class="com.springmvc.handler.EnjoyCore"></bean>
package com.springmvc.handler;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import com.jfinal.template.ext.spring.JFinalViewResolver;
public class EnjoyCore implements ApplicationListener<ContextRefreshedEvent>{
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
//if(event.getApplicationContext().getParent()==null)//网上说要这个判断不要重复执行但是我测试了一下,发现这个方法本来就不会重复执行,而且getParent也不会为空
JFinalViewResolver.engine.addSharedObject("ctx",event.getApplicationContext().getApplicationName());
}
}
最后,前端只要#(ctx)就可以获取到contextPath了。