Freemarker自定义标签

来源:互联网 发布:投资返利网站源码 编辑:程序博客网 时间:2024/06/05 18:53

为什么采用freemarker?
1、模板技术,不依附于语言和框架,前端和后端解耦,便于分工协作,更好的协同。
2、页面相应速度快
3、前端非常的灵活,采用自定义标签可以在不更改后端的基础上很容易的构造前端逻辑,可适应多变的网站。
为什么要自定义标签?
答案在第一个问题的第三点,我们需要一个前端灵活的架构,在不更改后端逻辑的基础上,很容易的改造前端逻辑。
在SSH的架构中,自定义标签已经可以方便的实现(struts2的标签也是基于freemarker的自定义标签),但是用起来还是不够爽,需要大量的配置,繁琐的依赖注入等。用了jfinal以后,发现自定义freemarker标签在该框架中用起来极爽,寥寥几个类,几行代码就能将自定义标签应用起来。我们使用自定义标签的目的是灵活,就是要将action中要做到事情,能直接通过标签在页面上使用。
在不改变业务逻辑和结构的基础上,前端逻辑和展示需要调整,以后就只是前端开发人员或者网站美工的工作了,再辅以freemarker的macro宏定义,再前段封装出更加方便使用的界面,那就更加的灵活和高效。所以在以内容为主的网站上,极力推荐采用这种方式来设计你的前端。为啥?波波说了: 为您节约更多时间,去陪恋人、家人和朋友 ;)

1.自定义标签需要实现TemplateDirectiveModel这个接口中的execute方法

public   class    UserListDirective implements TemplateDirectiveModel{    @Autowired    private UserDAO  userDao;    @Override    public void execute(Environment env, Map params, TemplateModel[] loopVars,            TemplateDirectiveBody body)                      throws TemplateException, IOException {        String name = params.get("name").toString();        List<User> userlist = userDao.findByProperty("name", name);        env.setVariable("userList", getBeansWrapper().wrap(userlist));        body.render(env.getOut());    }    public static BeansWrapper getBeansWrapper(){        BeansWrapper beansWrapper =                         new BeansWrapperBuilder(Configuration.VERSION_2_3_21).build();        return beansWrapper;    }}

2 配置 UserListDirective 到spring bean xml中

<bean id="userListDirective" class="com.action.directive.UserListDirective"></bean>

3 将spring bean 设置到freemarkerConfig全局变量中去。

<!-- freemarker的配置 --><bean id="freemarkerConfig2"        class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">        <property name="templateLoaderPath" value="/" />        <property name="freemarkerVariables">            <map >                <entry key="userListDirective" value="userListTag" />            </map>        </property>        <property name="freemarkerSettings">            <props>                <prop key="template_update_delay">0</prop>                <prop key="defaultEncoding">UTF-8</prop>                <prop key="url_escaping_charset">UTF-8</prop>                <prop key="locale">zh_CN</prop>                <prop key="boolean_format">true,false</prop>                <prop key="datetime_format">yyyy-MM-dd HH:mm:ss</prop>                <prop key="date_format">yyyy-MM-dd</prop>                <prop key="time_format">HH:mm:ss</prop>                <prop key="number_format">0.######</prop>                <prop key="whitespace_stripping">true</prop>            </props>        </property>    </bean>

4 ftl文件中的访问方式

<@userListTag name="zhangsan">    <#if userList?? && userList?size gt 0>        <#list userList as user>            <a href="">${user.name}</a>        </#list>    </#if></@userListTag>

TemplateDirectiveModel接口是freemarker自定标签或者自定义指令的核心处理接口。通过实现该接口,用户可以自定义标签(指令)进行任意操作,、 任意文本写入模板的输出。
该接口中只定义了如下方法,当模板页面遇到用户自定义的标签指令时,该方法会被执行。
public void execute(Environment env, Map params, TemplateModel[] loopVars,
TemplateDirectiveBody body) throws TemplateException, IOException;

@param env:系统环境变量,通常用它来输出相关内容,如Writer out = env.getOut();

@param params:自定义标签传过来的对象,其key=自定义标签的参数名,value值是TemplateModel类型,而TemplateModel是一个接口类型,通常我们都使用TemplateScalarModel接口来替代它获取一个String 值,如TemplateScalarModel.getAsString();当然还有其它常用的替代接口,如TemplateNumberModel获取number,TemplateHashModel等

@param loopVars 循环替代变量

@param body 用于处理自定义标签中的内容,如<@myDirective>将要被处理的内容

0 0
原创粉丝点击