一、什么是模板引擎,为什么要用模板引擎
在B/S程式设计中,常常有美工和程序员二个角色,他们具有不同专业技能:美工专注于表现——创建页面、风格、布局、效果等等可视元素;而程序员则忙于创建程式的商业流程,生成设计页面要显示的数据等等。
很多时候,要显示的资料在设计的时候并不存在,它们一般是在运行时由程式产生的,比如执行“价格不高于800NT的USB Disk”查询的返回结果。这种技术需求产生了JSP等Scriptlet,JSP十分强大,但是也常常被滥用,并导致一些不良的后果
- 将逻辑和表现混合在一起。
- 破坏了美工和程序员职责的正常分解。
- 使JSP页面难以阅读和维护。
模板引擎就是为了解决上面的问题而产生的。在设计HTML的时候,我们加入一些特定指令来指定要插入哪些数据,这些加了特殊指令的HTML或者其他文本,我们称为模板(Template)。而模板引擎会在输出页面时,用适当的数据替代这些代码。
模板和嵌入JSP的HTML是不同的,模板指令只有很有限的编程能力,可以避免混入商业逻辑。
二、Java常用的模板引擎 Velocity vs FreeMarker
1.Velocity 比 FreeMarker简单好学
2.FreeMarker 比 Velocity功能强大
三、一个简单的FreeMarkerDemo
1.导入Jar包:
2.编写模板文件
<html> <head> <title>Example</title> </head> <body > <h1>大家好,我的名字叫${name},我家住在${address},我今年${age}岁了!</h1> </body> </html>
3.模板的解析
模板需要被解析之后才能生成最终的文件,FreeMarker的数据模型也是在模板中配置的。
ExampleResolution.java
publicclass ExampleResolution { publicvoid resolution(){ Writer out = null; Configuration cfg = new Configuration(); cfg.setServletContextForTemp<wbr>lateLoading(ServletActionContext.getServletContext(),"TemplateFiles"); cfg.setDefaultEncoding("UTF-8"); Map root = newHashMap(); root.put("name","李鑫龙"); root.put("address","合肥市望江西路666号"); root.put("age", 23); try { Template template = cfg.getTemplate("Example.ftl"); String path = ServletActionContext.getServletContext().getRealPath("/"); File file = new File(path +"example.html"); out = new BufferedWriter(new OutputStreamWriter(newFileOutputStream(file))); template.process(root, out); } catch (IOException e) { e.printStackTrace(); } catch (TemplateException e) { e.printStackTrace(); }finally{ try { out.flush(); out.close(); } catch (IOException e) { e.printStackTrace(); } } } }</wbr>
4.Action配置
publicclass ServiceActionimplements Action { @Override public String execute()throws Exception { ExampleResolution er = new ExampleResolution(); er.resolution(); return Action.SUCCESS; } }
5.struts.xml配置
<packagename="default" namespace="/"extends="struts-default,json-default"> <action name="example"class="com.lubby.action.ServiceAction"> <resulttype="redirect">/example.html</result> </action> </package>
6.效果显示
</html> <head> <title>Example</title> </head> <body > <h1>大家好,我的名字叫李鑫龙,我家住在合肥市望江西路666号,我今年23岁了!</h1> </body> </html>
四、FreeMarker的数据模型
(root) | +- animals | | | +- mouse | | | | | +-size = "small" | | | | | +-price = 50 | | | +- elephant | | | | | +-size = "large" | | | | | +-price = 5000 | | | +- python | | | +- size = "medium" | | | +- price = 4999 | +- test ="It is a test" | +- whatnot | +-because = "don't know"
(root) | +- animals | | | +- (1st) | | | | | +-name = "mouse" | | | | | +-size = "small" | | | | | +-price = 50 | | | +- (2nd) | | | | | +-name = "elephant" | | | | | +-size = "large" | | | | | +-price = 5000 | | | +- (3rd) | | | +- name = "python" | | | +- size = "medium" | | | +- price = 4999 | +- whatnot | +- fruits | +- (1st)= "orange" | +- (2nd)= "banana"
五、模板的常用指令
1.${…}:称为interpolations,FreeMarker会在输出时用实际值进行替代。
2.<#…>:FTL标记(FreeMarker模板语言标记):类似于HTML标记,为了与HTML标记区分
3.<@>:宏,自定义标签
4.注释:包含在<#--和-->(而不是<!--和-->)之间
六.常用的FTL标记:
1、if指令:用于判断的指令
变量为map:
七、内建函数:
八、FreeMarker macro(宏)的使用
1.example1.ftl 设置宏
2.example2.ftl 调用example1.ftl的宏
最终可以在example2.ftl模板生成的页面中得到
3.关于关于嵌套指令<#nested>
调用:<@greet>hello!</@greet>
结果:
九、利用macro简单封装的jqGrid的使用方法
<@myjqgrid url="jqgridtest.action" colNameList=["来电号码","业务类型","编号"] colModelList=[["customer","string"],["bussiness","string"],["id","int"]] caption="jqgrid测试三" width="500" height="250" divId="jqgridOne" />
url:请求的action的URL
colNameList:jqGrid表所需要显示的字段
colModelList:jqGrid中colModelList中的字段的英文名,和排序的类型
caption:表格的标题名
width:长度
height:高度
divId:div的id名
十、利用macro简单封装的highcharts的使用方法
1.macro名和参数的调用Demo
<@highcharts divId="container1" type="column" title="2012年气温变化表一" subtitle="合肥气象局提供" yTitle="温度 (°C)" function=" return'<b>'+ this.series.name +'</b><br/>'+ this.x +': '+ this.y+'°C';" width="500" height="300"/>
2.参数的含义
height:高度