`
rocye
  • 浏览: 119793 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Struts2+Spring+Freemarker自定义权限标签

阅读更多

·         一、概述

 

·         二、框架

 

·         三、详细配置

 

·         四、用法

 

·         五、总结

 

一、概述

 

似乎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 主流技术架构 实例

    • 采用hibernate3+struts2+spring2+freemarker主流技术架构 • 懂html就能建站,提供最便利、合理的使用方式 • 强大、灵活的标签,用户自定义显示内容和显示方式 • 在设计上自身预先做了搜索引擎优化,增强对...

    jeecmsv2.3.2 内容管理系统 (hibernate3+struts2+spring2+freemarker)

    · 采用hibernate3+struts2+spring2+freemarker主流技术架构 · 懂html就能建站,提供最便利、合理的使用方式 · 强大、灵活的标签,用户自定义显示内容和显示方式 · 在设计上自身预先做了搜索引擎优化,增强对...

    Struts2、Spring、Freemarker自定义标签

    Struts2、Spring和Freemarker是Java Web开发中的三个重要框架,它们分别在MVC模式的不同层面提供了功能支持。Struts2是一个基于MVC设计模式的Web应用框架,Spring是一个全面的后端应用程序框架,而Freemarker则是一...

    Struts2+Spring3+Hibernate4零配置所需全部jar包

    Struts2、Spring3和Hibernate4是Java Web开发中的三大框架,它们的组合使用能够构建出功能强大且灵活的企业级应用程序。在这个“Struts2+Spring3+Hibernate4零配置所需全部jar包”中,包含了这三个框架运行所必需的...

    轻量级Java+EE企业应用实战——Struts+2+Spring+Hibernate整合开发电子书3.pdf

    5. 视图展示:探讨如何使用JSP、FreeMarker或其他模板技术来渲染页面,以及如何利用Struts 2的标签库简化视图开发。 6. 拦截器和过滤器:讲解如何自定义Struts 2的拦截器来实现权限控制、日志记录等功能,以及如何...

    网上投票系统(struts2+spring2+hibernarte3)

    Struts2提供拦截器机制,允许开发者在请求处理过程中添加自定义逻辑,如权限验证、日志记录等。此外,Struts2还支持多种视图技术,如JSP、FreeMarker,使得视图层的展示更加灵活。 Spring框架则是一个全面的企业级...

    Struts2+Spring+Hibernate In Action

    Struts2、Spring和Hibernate是Java开发中三大主流框架,它们各自负责Web应用程序的不同层面,协同工作能够构建出高效、可维护的系统。本篇文章将深入探讨这三个框架的核心概念、功能以及它们之间的集成。 **Struts2...

    Struts2+hibernate+spring的常见面试题

    4. 标签支持:Struts1使用JSTL和自定义标签,而Struts2使用OGNL表达式语言和丰富的内置标签。 5. 验证:Struts1的验证通常是手动实现,而Struts2支持手动和验证框架的集成,提供更灵活的验证机制。 在Web项目开发...

    struts2+spring+hibernate

    Struts2、Spring和Hibernate是Java Web开发中的三大主流框架,它们组合在一起可以构建出高效、灵活的企业级应用程序。这个“struts2+spring+hibernate”项目整合了这三个框架,采用注解式开发模式,提高了开发效率并...

    struts2+spring+ibatis

    Struts2、Spring和iBatis是Java Web开发中的三个重要框架,它们组合起来可以构建出高效、可维护的企业级应用程序。Struts2是一个MVC(Model-View-Controller)框架,Spring则是一个全面的后端框架,包含了依赖注入、...

    struts2+spring+hibernate新闻发布系统

    此外,Struts2的拦截器机制允许我们添加自定义的行为,如日志记录、权限检查等。 **Spring** 是一个全面的Java应用框架,它提供了依赖注入(DI)和面向切面编程(AOP)等核心功能。在这个新闻发布系统中,Spring...

    Struts2 0+Spring3+Hibernate3 SSH Demo

    Struts2还支持拦截器,允许添加自定义的行为,如日志、权限验证等。 **Spring3** 是一个全面的企业级应用开发框架,不仅包含IOC(Inversion of Control,控制反转)和AOP(Aspect Oriented Programming,面向切面...

    struts2+spring3+mybatis3框架实例代码

    Struts2的拦截器机制使得我们可以方便地添加自定义的行为,如权限验证、日志记录等。此外,Struts2支持多种视图技术,如JSP、FreeMarker等,提供灵活的视图展示。 Spring3是Java应用的核心容器,通过依赖注入(DI)...

    struts2+Hibernate+Spring整合开发代码

    Struts2、Hibernate和Spring是Java企业级应用开发中的三个重要框架,它们分别负责MVC模式中的控制层、数据持久化层和应用上下文管理。本整合开发代码旨在提供一个全面的示例,帮助开发者理解如何将这三个框架无缝...

    Struts2+Spring2+Hibernate3整合方案

    Struts2通过拦截器实现了请求的处理,允许开发者定义自定义拦截器来实现特定功能,如日志记录、权限验证等。它还支持多种视图技术,如JSP、FreeMarker等,使视图层更易定制。 **Spring** 框架的核心特性是依赖注入...

    论坛系统(Struts 2+Hibernate+Spring实现)

    Struts 2 提供了强大的拦截器机制,允许开发者自定义请求处理流程,还支持多种结果类型,如JSP、FreeMarker或Velocity模板。此外,Struts 2与Spring的集成使得依赖注入变得简单,提高了代码的可测试性。 **...

    开发者突击 struts2+Spring+Hibernate 整合开发 投票管理系统

    Struts2、Spring和Hibernate是Java Web开发中的三大框架,它们各自在应用程序的不同层面发挥着重要作用。Struts2是一个强大的MVC(Model-View-Controller)框架,负责处理请求和控制应用程序流程;Spring则是一个...

    Struts2+Spring整合所需完整稳定可用jar包

    1. **拦截器(Interceptors)**:这是Struts2的一大亮点,允许开发者自定义行为,如日志记录、权限验证等,这些行为可以被插入到请求处理链中。 2. **插件体系**:Struts2支持丰富的插件,例如JSON支持、文件上传...

    Struts2+Spring2+Hibernate3 web应用示例

    2. **拦截器**:允许开发者定义自定义的拦截器来处理特定的业务逻辑,如日志记录、权限验证等。 3. **配置灵活**:Struts2支持XML和注解两种配置方式,使得配置更加简洁和直观。 4. **视图层支持**:Struts2支持JSP...

Global site tag (gtag.js) - Google Analytics