· 一、概述
· 二、框架
· 三、详细配置
· 四、用法
· 五、总结
一、概述
似乎Struts2的标签库效率低下这件事已经被公认了,网上也有很多关于标签库的测试及比较,Struts2的标签库效率确实一般。就目前看来除了JSTL这个老牌的标签库外,Freemarker是另外一个不错的选择,并且它与Struts2的兼容性是很好的,大家可能注意到了Freemarker.jar包是Struts2框架的必须包,因为Struts2的标签库是基于此框架来实现的。基于Struts2+Spring框架下,前端用Freemarker模板代替jsp页面,其实改动的地方很少,这里不做详细说明,本文主要讲述用Freemarker的自定义标签替换Struts2自定义标签实现菜单权限控制的过程。中间花了大量时间去网上找资料,各式各样的代码,有与springMVC结合的,也有与struts2结合的,中间还穿插着Spring的注解配置,眼花缭乱,并且权限逻辑里面肯定会涉及到Session的读取,网上没有与Freemarker相关的比较清楚的说明,其实是自己太纠结了,以为会有相应的配置,把Struts2的特性都给忘记了,最终获取Session其实很简单。
二、框架
Struts2.3.15 + Spring3.2.13 + Freemarker2.3.23
三、详细配置
1. 第一步:继承FreemarkerManager重写createConfiguration方法
import java.util.Map; import javax.servlet.ServletContext; import org.apache.struts2.views.freemarker.FreemarkerManager; import org.springframework.context.ApplicationContext; import org.springframework.web.context.support.WebApplicationContextUtils; import freemarker.template.Configuration; import freemarker.template.TemplateDirectiveModel; import freemarker.template.TemplateException; /** * 继承FreemarkerManager重写createConfiguration方法 * @author Rocye * @createTime 2015-07-20 */ public class MyFreemarkerManager extends FreemarkerManager { @Override protected Configuration createConfiguration(ServletContext servletContext) throws TemplateException { Configuration configuration = super.createConfiguration(servletContext); // 取出上下文 ApplicationContext applicationContext = WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext); // 获取实现TemplateDirectiveModel的bean Map<String, TemplateDirectiveModel> beans = applicationContext.getBeansOfType(TemplateDirectiveModel.class); for (String key : beans.keySet()) { Object obj = beans.get(key); if (obj != null) { configuration.setSharedVariable(key, obj); } } return configuration; } }
2. 第二步:实现TemplateDirectiveModel接口定义自己的标签逻辑
import java.io.IOException; import java.util.Map; import javax.servlet.http.HttpServletRequest; import freemarker.core.Environment; import freemarker.template.TemplateDirectiveBody; import freemarker.template.TemplateDirectiveModel; import freemarker.template.TemplateException; import freemarker.template.TemplateModel; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import com.guoxin.common.base.Constants; /** * 菜单权限控制自定义标签 * @author Rocye * @createTime 2015-06-26 */ public class PermissionDirective implements TemplateDirectiveModel{ public void execute(Environment env, Map params, TemplateModel[] model, TemplateDirectiveBody body) throws TemplateException, IOException { //获取HttpSession ServletRequestAttributes attr = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes(); HttpServletRequest request = attr.getRequest(); Object roleObj = request.getSession().getAttribute(Constants.ROLES_KEY); String roleIds = (roleObj ==null ? "" : roleObj.toString()); Object menuObj = params.get("token"); String menuId = (menuObj ==null ? "" : menuObj.toString()); //是否有此菜单权限 roleIds = "," + roleIds + ","; if(roleIds.indexOf("," + menuId + ",") > -1){ if(body != null){ body.render(env.getOut()); } }else{ env.getOut().write(""); } } }
3. 在 web.xml 中还要加上一个 listener 以防 HttpServletRequest 在使用时会发生 Thread 方面的错误
<listener> <listener-class> org.springframework.web.context.request.RequestContextListener </listener-class> </listener>
4. 修改struts.properties配置第一步中的类
struts.freemarker.manager.classname=com.guoxin.common.freemarker.MyFreemarkerManager
5. 在spring配置文件中加入第二步的类
<bean id="permission" class="com.guoxin.common.freemarker.PermissionDirective" />
四、用法
<@permission token="1"> <h2 class="tit shop"> <a href="javascript:;">我的店铺</a> </h2> </@permission>
五、总结
此标签的实现完全是替换之前系统中struts2的权限自定义标签,没有做任何的优化及扩展,只是换用freemarker实现罢了,其中读取session完全是用了Struts2的特性。
相关推荐
• 采用hibernate3+struts2+spring2+freemarker主流技术架构 • 懂html就能建站,提供最便利、合理的使用方式 • 强大、灵活的标签,用户自定义显示内容和显示方式 • 在设计上自身预先做了搜索引擎优化,增强对...
· 采用hibernate3+struts2+spring2+freemarker主流技术架构 · 懂html就能建站,提供最便利、合理的使用方式 · 强大、灵活的标签,用户自定义显示内容和显示方式 · 在设计上自身预先做了搜索引擎优化,增强对...
采用hibernate3+struts2+spring2+freemarker主流技术架构 懂html就能建站,提供最便利、合理的使用方式 强大、灵活的标签,用户自定义显示内容和显示方式 在设计上自身预先做了搜索引擎优化,增强对搜索引擎的友好...
基于java技术开发,继承其强大、稳定、安全、高效、跨平台等多方面的优点采用hibernate3+struts2+spring2+freemarker主流技术架构 懂html就能建站,提供最便利、合理的使用方式 强大、灵活的标签,用户自定义显示...
采用hibernate3+struts2+spring2+freemarker主流技术架构 懂html就能建站,提供最便利、合理的使用方式 强大、灵活的标签,用户自定义显示内容和显示方式 在设计上自身预先做了搜索引擎优化,增强对搜索引擎的友好...
·采用hibernate3+struts2+spring2+freemarker主流技术架构 ·懂html就能建站,提供最便利、合理的使用方式 ·强大、灵活的标签,用户自定义显示内容和显示方式 ·在设计上自身预先做了搜索引擎优化,增强对搜索...
继承其强大、稳定、安全、高效、跨平台等多方面的优点,采用hibernate3+struts2+spring2+freemarker主流技术架构,懂html就能建站,提供最便利、合理的使用方式 ,强大、灵活的标签,用户自定义显示内容和显示方式 ...
· 采用hibernate3+struts2+spring2+freemarker技术架构 · 基于java技术开发,继承其强大、稳定、安全、高效、跨平台等多方面的优点,支持mysql、oracle、sqlserver等数据库 · 懂html就能建站,提供最便利、合理的...
· 采用hibernate3+struts2+spring2+freemarker主流技术架构 · 懂html就能建站,提供最便利、合理的使用方式 · 强大、灵活的标签,用户自定义显示内容和显示方式 · 在设计上自身预先做了搜索引擎优化,增强对搜索...
采用hibernate3+struts2+spring2+freemarker主流技术架构 懂html就能建站,提供最便利、合理的使用方式 强大、灵活的标签,用户自定义显示内容和显示方式 在设计上自身预先做了搜索引擎优化,增强对搜索引擎的友好...
采用hibernate3+struts2+spring2+freemarker主流技术架构 懂html就能建站,提供最便利、合理的使用方式 强大、灵活的标签,用户自定义显示内容和显示方式 在设计上自身预先做了搜索引擎优化,增强对搜索引擎的友好...
采用hibernate3+struts2+spring2+freemarker主流技术架构 懂html就能建站,提供最便利、合理的使用方式 强大、灵活的标签,用户自定义显示内容和显示方式 在设计上自身预先做了搜索引擎优化,增强JEECMS v2.3.2 正式...
JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...
JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...
JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...
JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...
JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...
JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...
JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...
JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...