`
houlinyan
  • 浏览: 147744 次
  • 性别: 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的自定义标签的开发,你可以根据自己的页面变更你的实现逻辑即可。

  

 

分享到:
评论

相关推荐

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

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

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

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

    java jsp spring框架开发的cms

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

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

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

    jeecms-3.1.1 源码版

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

    JEECMS3.0.4使用教程

    基于java技术开发,继承其强大、稳定、安全、高效、跨平台等多方面的优点采用hibernate3+struts2+spring2+freemarker主流技术架构 懂html就能建站,提供最便利、合理的使用方式 强大、灵活的标签,用户自定义显示...

    jetsum_cms.zip

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

    JEEcms目前国内的cms领跑者

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

    JEECMS v2.3.2 正式版用源码

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

    jeecms3.0.4

    基于java技术开发,继承其强大、稳定、安全、高效、跨平台等多方面的优点,采用hibernate3+struts2+spring2+freemarker主流技术架构,懂html就能建站,提供最便利、合理的使用方式 ,强大、灵活的标签,用户自定义...

    jeecms-2.4.2(源码+安装包)

    · 采用hibernate3+struts2+spring2+freemarker技术架构 · 基于java技术开发,继承其强大、稳定、安全、高效、跨平台等多方面的优点,支持mysql、oracle、sqlserver等数据库 · 懂html就能建站,提供最便利、合理的...

    基于HSS的网站管理系统和新闻发布系统

    (支持自定义标签) 作者管理 来源管理 友情连接 顶部菜单管理 系统管理等等 联系业务和反馈问题请通过以下途径: QQ:401192126,373206284,107623331,420846205 MSN:wangxiaokuang@hotmail.com,simon_...

    JEECMS v2012sp1源码工程包(已经导入源码的工程)

    · SpringMVC3+Spring3+Hibernate3+Freemarker技术架构 · 基于java技术开发,继承其强大、稳定、安全、高效、跨平台等多方面的优点,支持mysql、oracle、sqlserver等数据库 · 懂html就能建站,提供最便利、合理的...

    jee cms学习文档

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

    网站内容管理系统jeecms3

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

    JEECMS v3.1.0 beta

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

    jeecms 网站开发源码

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

    JEECMS v2.2 beta 贺岁版

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

    Spring 2.0 开发参考手册

    14.2.3. 帮助简化开发的额外的标签 14.3. Tiles 14.3.1. 需要的资源 14.3.2. 如何集成Tiles 14.4. Velocity和FreeMarker 14.4.1. 需要的资源 14.4.2. Context 配置 14.4.3. 创建模板 14.4.4. 高级配置 ...

    MS-MCMS内容管理系统 v4.5.2

    铭飞MCMS(铭飞内容管理系统)是一款支持不同平台、不同终端并且支持多站点的内容管理系统,SpringMVC4+Spring4+MyBatis3+Freemarker技术架构基于java技术开发,继承其强大、稳定、安全、高效、跨平台等多方面的优点;...

Global site tag (gtag.js) - Google Analytics