· 一、概述
· 二、框架
· 三、详细配置
· 四、用法
· 五、总结
一、概述
似乎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就能建站,提供最便利、合理的使用方式 · 强大、灵活的标签,用户自定义显示内容和显示方式 · 在设计上自身预先做了搜索引擎优化,增强对...
Struts2、Spring和Freemarker是Java Web开发中的三个重要框架,它们分别在MVC模式的不同层面提供了功能支持。Struts2是一个基于MVC设计模式的Web应用框架,Spring是一个全面的后端应用程序框架,而Freemarker则是一...
Struts2、Spring3和Hibernate4是Java Web开发中的三大框架,它们的组合使用能够构建出功能强大且灵活的企业级应用程序。在这个“Struts2+Spring3+Hibernate4零配置所需全部jar包”中,包含了这三个框架运行所必需的...
5. 视图展示:探讨如何使用JSP、FreeMarker或其他模板技术来渲染页面,以及如何利用Struts 2的标签库简化视图开发。 6. 拦截器和过滤器:讲解如何自定义Struts 2的拦截器来实现权限控制、日志记录等功能,以及如何...
Struts2提供拦截器机制,允许开发者在请求处理过程中添加自定义逻辑,如权限验证、日志记录等。此外,Struts2还支持多种视图技术,如JSP、FreeMarker,使得视图层的展示更加灵活。 Spring框架则是一个全面的企业级...
Struts2、Spring和Hibernate是Java开发中三大主流框架,它们各自负责Web应用程序的不同层面,协同工作能够构建出高效、可维护的系统。本篇文章将深入探讨这三个框架的核心概念、功能以及它们之间的集成。 **Struts2...
4. 标签支持:Struts1使用JSTL和自定义标签,而Struts2使用OGNL表达式语言和丰富的内置标签。 5. 验证:Struts1的验证通常是手动实现,而Struts2支持手动和验证框架的集成,提供更灵活的验证机制。 在Web项目开发...
Struts2、Spring和Hibernate是Java Web开发中的三大主流框架,它们组合在一起可以构建出高效、灵活的企业级应用程序。这个“struts2+spring+hibernate”项目整合了这三个框架,采用注解式开发模式,提高了开发效率并...
Struts2、Spring和iBatis是Java Web开发中的三个重要框架,它们组合起来可以构建出高效、可维护的企业级应用程序。Struts2是一个MVC(Model-View-Controller)框架,Spring则是一个全面的后端框架,包含了依赖注入、...
此外,Struts2的拦截器机制允许我们添加自定义的行为,如日志记录、权限检查等。 **Spring** 是一个全面的Java应用框架,它提供了依赖注入(DI)和面向切面编程(AOP)等核心功能。在这个新闻发布系统中,Spring...
Struts2还支持拦截器,允许添加自定义的行为,如日志、权限验证等。 **Spring3** 是一个全面的企业级应用开发框架,不仅包含IOC(Inversion of Control,控制反转)和AOP(Aspect Oriented Programming,面向切面...
Struts2的拦截器机制使得我们可以方便地添加自定义的行为,如权限验证、日志记录等。此外,Struts2支持多种视图技术,如JSP、FreeMarker等,提供灵活的视图展示。 Spring3是Java应用的核心容器,通过依赖注入(DI)...
Struts2、Hibernate和Spring是Java企业级应用开发中的三个重要框架,它们分别负责MVC模式中的控制层、数据持久化层和应用上下文管理。本整合开发代码旨在提供一个全面的示例,帮助开发者理解如何将这三个框架无缝...
Struts2通过拦截器实现了请求的处理,允许开发者定义自定义拦截器来实现特定功能,如日志记录、权限验证等。它还支持多种视图技术,如JSP、FreeMarker等,使视图层更易定制。 **Spring** 框架的核心特性是依赖注入...
Struts 2 提供了强大的拦截器机制,允许开发者自定义请求处理流程,还支持多种结果类型,如JSP、FreeMarker或Velocity模板。此外,Struts 2与Spring的集成使得依赖注入变得简单,提高了代码的可测试性。 **...
Struts2、Spring和Hibernate是Java Web开发中的三大框架,它们各自在应用程序的不同层面发挥着重要作用。Struts2是一个强大的MVC(Model-View-Controller)框架,负责处理请求和控制应用程序流程;Spring则是一个...
1. **拦截器(Interceptors)**:这是Struts2的一大亮点,允许开发者自定义行为,如日志记录、权限验证等,这些行为可以被插入到请求处理链中。 2. **插件体系**:Struts2支持丰富的插件,例如JSON支持、文件上传...
2. **拦截器**:允许开发者定义自定义的拦截器来处理特定的业务逻辑,如日志记录、权限验证等。 3. **配置灵活**:Struts2支持XML和注解两种配置方式,使得配置更加简洁和直观。 4. **视图层支持**:Struts2支持JSP...