freeMarker自定义指令
来源:互联网 发布:python xpath解析html 编辑:程序博客网 时间:2024/05/14 03:05
FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写。FreeMarker被设计用来生成HTMLWeb页面,特别是基于MVC模式的应用程序。
所谓模板,就是一份已经写好了基本内容,有着固定格式的文档,其中空出或者用占位符标识的内容,由使用者来填充,不同的使用者给出的数据是不同的。在模板中的占位符,在模板运行时,由模板引擎来解析模板,并采用动态数据替换占位符部分的内容。 FreeMarker不是一个Web应用框架,而适合作为Web应用框架一个组件,FreeMarker与Web容器无关,即在Web运行时,它并不知道Servlet或HTTP。它不仅可以用作表现层的实现技术,而且还可以用于生成XML,JSP或Java文件等。 虽然FreeMarker具有一些编程的能力,但通常由Java程序准备要显示的数据,由FreeMarker生成页面,通过模板显示准备的数据
分离表现层和业务逻辑
使用JSP开发过程中在页面中大量的存在业务逻辑的代码,使得页面内容凌乱,在后期大量的修改维护过程中就变得非常困难。FreeMarker根本不支持Java脚本代码,而是使用el表达式来输出展示数据。FreeMarker的设计初衷就是:模板+数据模型=输出,模板只负责数据在页面中的表现,不涉及任何的逻辑代码,而所有的逻辑都是由数据模型来处理的。用户最终看到的输出是模板和数据模型合并后创建的。
提高开发效率
在我们以往的开发中,使用的都是JSP页面来展示数据的,即所谓的表现层。我们都知道,JSP在第一次执行的时候需要转换成Servlet类,开发阶段进行功能调适时,需要频繁的修改JSP,每次修改都要编译和转换,那么试想一天中我们浪费在程序编译的时间有多少。相对于JSP来说,FreeMarker模板技术不存在编译和转换的问题,所以就不会存在上述问题。而且开发过程中,我们在不必在等待界面设计开发人员完成页面原形后,我们再来开发程序。
分工明确
以往用JSP展现数据时,程序员并不熟悉界面设计技术,反之界面开发人员,也并不熟悉程序语言。协调工作很困难,使用FreeMarker后,作为界面开发人员,只专心创建HTML文件、图像以及Web页面的其他可视化方面,不用理会数据;而程序开发人员则专注于系统实现,负责为页面准备要显示的数据。
自定义指令
1、编写一个HelloDirective 实现 TemplateDirectiveModel接口
2、重写execute方法:
a).解析参数:BeansWrapper wrapper = new BeansWrapperBuilder(Configuration.VERSION_2_3_21).build(); Integer obj = (Integer)wrapper.unwrapper(Template model, Integer.class); b). 将结果存入env = request.setAbbtribute(key, obj): env.setVariable("hello_world", model); c). 返回到页面: if (body == null) { env.getOut().write(JSON.toJsonString(obj)); } else { body.render(env.getOut()); }
import com.alibaba.fastjson.JSON;import freemarker.core.Environment;import freemarker.ext.beans.BeansWrapperBuilder;import freemarker.template.*;import freemarker.ext.beans.BeansWrapper;import org.springframework.stereotype.Component;import java.io.IOException;import java.util.HashMap;import java.util.Map;/** * Created by JY on 2017/7/13. */@Componentpublic class HelloDirective implements TemplateDirectiveModel { /** * * @param env 环境 * @param params 参数 * @param loopVars 变量 * @param body 指令输出的内容 * @throws TemplateException * @throws IOException */ @Override public void execute(Environment env, Map params, TemplateModel[] loopVars, TemplateDirectiveBody body) throws TemplateException, IOException { System.out.println("参数:" + params); // 转化器 通过调用wrap方法将java对象转化为freemarker的TemplateModel // 调用unwrap方法将TemplateModel转化为Java对象 BeansWrapper beansWrapper = new BeansWrapperBuilder(Configuration.VERSION_2_3_21).build(); TemplateModel abc = (TemplateModel) params.get("abc"); Integer abcInt = (Integer) beansWrapper.unwrap(abc,Integer.class); //将参数存入result TemplateModel name = (TemplateModel) params.get("name"); String nameStr = (String) beansWrapper.unwrap(name,String.class); Map<String,String> result = new HashMap<>(); result.put("userName",nameStr); TemplateModel model = beansWrapper.wrap(result); // 设置值==request.setAttribute(key, value) env.setVariable("hello_world", model); //输出 if(body == null){ env.getOut().write(JSON.toJSONString(result)); }else{ body.render(env.getOut()); } }}
3、在spring中定义模板名称
<bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer"> <property name="templateLoaderPath" value="/WEB-INF/views/" /> <property name="defaultEncoding" value="UTF-8" /> <property name="freemarkerSettings"> <props> <prop key="number_format">0.##########</prop> </props> </property><!--定义模板名称--> <property name="freemarkerVariables"> <map> <entry key="hello_world" value-ref="helloDirective" /> </map> </property></bean>
4、页面引用
<@hello_world name=”
二、全局设置
在application.xml中的视图配置
<bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer"> <property name="templateLoaderPath" value="/WEB-INF/views/" /> <property name="defaultEncoding" value="UTF-8" /> <property name="freemarkerSettings"> <props> <prop key="number_format">0.##########</prop> <!--解决数字问题--> <prop key="boolean_format">true,false</prop> <!--解决页面布尔值的输出--> <prop key="tag_syntax">auto_detect</prop> <!-- auto_detect:自动选择(选择第一种标签语法) angle_bracket(<#if>) square_bracket[#if]--> <prop key="classic_compatible">true</prop> <!--非空不会报错--> <prop key="template_update_delay">0</prop> <!--缓存时间--> <prop key="default_encoding">UTF-8</prop> </props> </property> <property name="freemarkerVariables"> <map> <entry key="hello_world" value-ref="helloDirective" /> </map> </property> </bean>
- [Freemarker] freemarker自定义指令
- freemarker的自定义指令
- FreeMarker自定义指令
- freemarker 自定义指令
- 6、freemarker自定义指令
- Freemarker自定义指令
- freemarker自定义指令
- freeMarker自定义指令
- Freemarker自定义指令
- freemarker -自定义指令
- Freemarker自定义指令
- freemarker自定义函数、指令
- freemarker自定义指令(七)
- Freemarker自定义指令功能应用
- Freemarker自定义方法和指令
- Freemarker自定义指令之宏
- FreeMarker 自定义指令(三)
- FreeMarker自定义指令--代码实现
- 多路复用之epoll服务器应用
- 公证问答百科
- 【模拟】【贪心】POJ1877Flooded!
- A
- 605. Can Place Flowers
- freeMarker自定义指令
- iOS10.3后允许App运行中变更App图标
- 用<activity-alias/>让配置WXEntryActivity更爽
- Java反射机制之权限压制
- [题解]bzoj2957 楼房重建
- 【Matlab工具箱】线性神经网络
- stack顺序C++
- JS中如何实现数字相加
- MySQL各存储引擎简介