SpringMVC整合JFinal-enjoy细节及使用addSharedObject添加固定参数
2017-09-01 00:00
309 查看
在使用JFinal3.2的时候发现,JFinal提供的Enjoy Template Engine这个模版工具挺好用,就想集成到SpringMVC中使用。首先,先按照使用文档操作一番。把jsp或freemarker等模版的bean配置替换成enjoy的配置;
JSP模版
Freemarker模版
替换为enjoy的模版
此时,enjoy的基本配置已经完成,可以使用。但会突然间发现,无法像jsp或freemarker那样简单的获取到contextPath这个参数。翻看enjoy的使用手册,发现enjoy提供了一个addSharedObject方法供我们添加参数。个人觉得不应使用拦截器,毕竟只是一个固定参数。我是想在项目加载完成的时候直接加载contextPath这个参数就好。以前一直以为只用在request里面才有这个参数,现在发现容器的ServletContextListener与SpringMVC提供的ApplicationListener<ContextRefreshedEvent>都可以获取到contextPath。毕竟在springMVC中在非Controller获取到request还是比较难的,试了好久都拿不到。首先贴上ServletContextListener的代码。使用ServletContextListener首先要在web.xml中加入listener
若使用ApplicationListener<ContextRefreshedEvent>首先要在配置enjoy的xml的最后加多一行:
最后,前端只要#(ctx)就可以获取到contextPath了。
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了。
相关文章推荐
- 使用ContentDeploymentJob.AddQuickDeployObject的时候, 请注意第三个参数一定要使用Server Relative URL
- 使用action属性接收参数<a href="user/user!add?name=a&age=8">添加用户</a>
- 解决使用AJax往DropDownList中动态添加数据时发生,回发或回调参数无效 的问题
- FMS3系列(六):使用远程共享对象(SharedObject)实现多人时时在线聊天(Flex | Flash)
- 使用sp_addextendedproperty添加描述信息
- MapX系列-- 使用LayerInfo object 在map中添加已有的矢量图层
- (新招儿) 巧妙使用ComboBox.Items的Add方法添加列表项
- 使用远程共享对象(SharedObject)实现多人时时在线聊天(Flex | Flash)
- 使用SharedObject存储对象地址
- Spring MVC ModelAndView addObject 使用EL表达式失效
- jquery之管理包装元素集合(筛选元素包装集之添加更多元素到包装集,add()方法的使用)
- jquery之修改元素样式(添加和删除类名称,使用addClass(),removeClass(),toggleClass()方法)
- Flex中SharedObject对象的使用
- TStringList的AddObject的使用
- 【转】使用ComboBox.Items的Add方法添加列表项
- ADO.NET中使用SqlParameter添加参数时遇到的参数无效问题
- IE6使用add方法添加optGroup的bug
- Adobe AIR中使用Flex连接Sqlite数据库(2)(添加,删除,修改以及语句参数)
- 解决:apache 整合redmine 启动报错 mod_passenger.so: failed to map segment from shared object: Permission denied
- aix中使用xlc编译生成动态链接库(shared object)(.so)文件的方法