当前位置: 首页 > 工具软件 > JFinal-event > 使用案例 >

SpringMVC整合JFinal-enjoy细节及使用addSharedObject添加固定参数

齐英韶
2023-12-01

       在使用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了。

转载于:https://my.oschina.net/u/2349928/blog/1527391

 类似资料: