`
houlinyan
  • 浏览: 149299 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

spring+freemarker自定义标签开发

    博客分类:
  • java
阅读更多

 

手上的项目现在要支持多平台,多个平台的显示内容大部分相同,但是页面的部分存在区别,为了便于维护,自己开发了一个freemarker的自定义标签check,通过check标签,自动检查<@check></@check>之间的内容是显示。

第一步:把页面上不同的平台存在差异的区别起个名字name标识,在zk中配置,每个平台要显示的区域名称的列表,配置示例如下:

  {
    "azure": [
        "config.set" 
        ,"config.domain"
    ], 
    "cloudscape": [
        "config.set"
        ,"config.domain"
        , "config.rule"
    ]
}

 cloudscape平台显示config.set,config.domain,config.rule三个区域,azure显示config.set,config.domain两个区域

2.开发自定义标签:

    重点是: implements freemarker.template.TemplateDirectiveModel这个接口

 

import java.io.IOException;
import java.util.Map;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;

import com.sohu.sce.console.services.ZookeeperService;
import com.sohu.sce.console.utils.consts.Constants;

import freemarker.core.Environment;
import freemarker.template.TemplateDirectiveBody;
import freemarker.template.TemplateDirectiveModel;
import freemarker.template.TemplateException;
import freemarker.template.TemplateModel;
import freemarker.template.TemplateModelException;

public class MyViewDirective implements TemplateDirectiveModel{

	@Autowired
	ZookeeperService zkService;
	
	private static JSONObject viewConfig ;
	
	@Override
	public void execute(Environment env, Map params, TemplateModel[] model,
			TemplateDirectiveBody body) throws TemplateException, IOException {
		if(viewConfig== null){
			synchronized (MyViewDirective.class) {
				if(viewConfig == null){
					String config = zkService.getData("/conf/modules/console/view.config");
					viewConfig = JSONObject.fromObject(config);
				}
			}
		}
 
		
		String name = getRequiredParam(params, "name");
		String platfom = getParam(params, Constants.PLATFORM.NAME, Constants.PLATFORM.CLODUSCAPE);
		JSONArray viewList = viewConfig.getJSONArray(platfom);
		if(viewList != null && viewList.size() >0){
			if(viewList.contains(name)){
				body.render(env.getOut());
			}
		}
		
	}
	
	static String getRequiredParam(Map params,String key) throws TemplateException {
		Object value = params.get(key);
		if(value == null || StringUtils.isEmpty(value.toString())) {
			throw new TemplateModelException("not found required parameter:"+key+" for directive");
		}
		return value.toString();
	}
	
	static String getParam(Map params,String key,String defaultValue) throws TemplateException {
		Object value = params.get(key);
		return value == null ? defaultValue : value.toString();
	}

}
 3.在spring的配置文件增加配置:
  
<entry key="check">
  <bean class="com.sohu.sce.console.actions.freemarker.MyViewDirective" />
</entry>
 完成配置如下:
<bean id="freemarkerConfigurer"
     class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
		<property name="templateLoaderPath" value="/" />
		<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>
				<prop key="auto_import">/ftl/common/macros.ftl as html</prop>
				<prop key="tag_syntax">auto_detect</prop>
			</props>
		</property>
		<property name="freemarkerVariables">
  		  <map>
		    <entry key="block">
		 	<bean class="cn.org.rapid_framework.freemarker.directive.BlockDirective" />
				</entry>

				<entry key="override">
					<bean
						class="cn.org.rapid_framework.freemarker.directive.OverrideDirective" />
				</entry>

				<entry key="extends">
					<bean
						class="cn.org.rapid_framework.freemarker.directive.ExtendsDirective" />
				</entry>

				<entry key="super">
					<bean class="cn.org.rapid_framework.freemarker.directive.SuperDirective" />
				</entry>
				<entry key="super">
					<bean class="cn.org.rapid_framework.freemarker.directive.SuperDirective" />
				</entry>
				<entry key="check">
					<bean class="com.sohu.sce.console.actions.freemarker.MyViewDirective" />
				</entry>
			</map>
		</property>
</bean>
 4.在页面上把需要做检查的区域用check标签包起来:
<@check name="config.rule" paltform="azure">
               区域的原html内容
</@check>
 经过以上四步,自定义的标签就可以使用了。
由于我的每一个平台的线上内容是固定的,如果你用自定义标签来做权限控制【这个场景使用的还是比较多的】,就不能像我这样配置了,可能需要根据抽象出一个角色出来,在角色中配置权限,用户再关联到角色上,然后在自定义标签的实现里面进行动态的控制了,本文重点是介绍如何在spring+freemarker框架下做freemarker的自定义标签的开发,你可以根据自己的页面变更你的实现逻辑即可。

  

 

分享到:
评论

相关推荐

    Struts2、Spring、Freemarker自定义标签

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

    hibernate3+struts2+spring2+freemarker 主流技术架构 实例

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

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

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

    实现通过jfinal框架自动扫描freemarker的自定义标签.zip

    本资源包的核心内容是教你如何在JFinal项目中实现FreeMarker自定义标签的自动扫描和注册,从而提升模板引擎的功能和灵活性。 首先,我们需要理解自定义标签的概念。在FreeMarker中,自定义标签允许开发者扩展其内置...

    Spring3.2.1MVC+Freemarker简单示例

    除了基本配置,我们还可以进一步探索Spring MVC和Freemarker的高级特性,如模型验证、国际化支持、异常处理和自定义标签等。例如,使用Spring的`@Valid`注解进行表单验证,使用`MessageSource`实现多语言支持,以及...

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

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

    Spring 整合freemarker制作html页面简单demo(附带操作提示).rar

    **Spring 整合 ...随着你对这两个技术的深入学习,你会发现它们在实际项目中的强大功能,例如条件语句、循环结构、自定义标签等,都能极大地提升开发效率。不断实践和探索,你将在 Web 开发领域取得更大的进步。

    springboot集成freemarker和shiro框架

    1. 在FreeMarker模板中使用Shiro标签库:在.ftl文件顶部引入Shiro标签库: ```html ${'@org.apache.shiro.web.tags.ShiroTagLibHandler@getTagLibUri()'}"&gt; ${shiro}" as shiro/&gt; ``` 2. 使用Shiro标签:在模板中...

    SpringMVC+freemarker

    - **自定义标签**: Freemarker 允许创建自定义标签,实现特定功能,如表单验证、数据格式化等。这通常通过编写 Java 代码,封装成宏库,然后在模板中调用。 4. **自定义标签的创建与使用** - **创建标签库**: ...

    轻量级Java EE企业应用开发实战———Struts 2+Spring+Hibernate整合开发 课件

    Struts 2、Spring 和 Hibernate 是 Java EE 企业应用开发中的三个重要框架,它们的整合被称为 SSM(Struts 2、Spring、Hibernate)框架。SSM 框架组合在一起,可以提供一个完整的轻量级解决方案,用于构建高效、可...

    Spring配置Freemarker视图解析器,前台页面全部使用freemarker渲染

    Freemarker还支持宏、函数、自定义标签库等功能,可以极大地增强模板的灵活性和可复用性。 在实际应用中,控制器层会将模型数据传递给视图,如下所示: ```java @GetMapping("/users") public String getUsers...

    spring+struts2+mabatis JAR

    标题中的"spring+struts2+mabatis JAR"提到了三个重要的Java Web开发框架:Spring、Struts2和MyBatis。这三个框架是构建企业级应用的常用工具,它们各自有着独特的功能和优势。 Spring框架是Java领域的一个全功能...

    struts2+spring+hibernate

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

    java jsp spring框架开发的cms

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

    Spring+Struts+JFreeChart 自动生成统计图

    在IT行业中,构建一个能够自动生成统计图的系统是一项常见的需求,特别是在数据分析和报表展示的...同时,这也是对MVC模式、Spring依赖注入和Struts请求调度的一个实践案例,对于提升Java Web开发技能具有很高的价值。

    Spring 使用Freemarker发送邮件的一个简单模板(代码不完整)

    标题中的“Spring 使用Freemarker发送邮件”涉及的是在Java开发中使用Spring框架集成Freemarker模板引擎来创建和发送电子邮件。Spring框架提供了一个强大的邮件服务接口,可以方便地与各种邮件服务器进行交互,而...

    struts2+spring+ibatis

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

    在Hibernate+Spring+SpringMVC中集成JfreeChart

    在Java Web开发中,使用Hibernate作为持久层框架可以有效地管理和操作数据库,而SpringMVC则提供了强大的MVC架构支持。为了增强数据可视化能力,我们常常会集成JfreeChart库来生成各种类型的图表。本文将详细讲解...

    jeecms-src.rar_com.jeec_freemarker_freemarker struts2_单点登录

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

    Struts1+Spring+hibernate《最新三国人物分页》

    在这个项目中,分页功能可能通过Struts1的拦截器或者自定义标签来实现,允许用户按页浏览三国人物的信息,提高用户体验。 项目文件`SanGuo`可能包含以下内容: 1. **源代码**:包括Struts1的Action类、Spring的配置...

Global site tag (gtag.js) - Google Analytics