在之前学习PHP的时候也学习过一个模板引擎,就是smarty模板引擎,而这个freemarker和smarty做的工作是一模一样的,只不过freemarker的作用捍卫更广一些。
在学习struts的时候,有struts标签对数据分配可是可以完成任务的,但是,jsp中的数据似乎又是不那么纯粹,所以,freemarker可以以一个非常干净的方式把视图给展现出来,
在说之前,先说一个书本上出现的问题:书上甚至教程上面都会教吧struts标签用来做视图展示,我是很反对这种方式的,用struts标签把视图展现给用户看似一定程度上简化了视图的工作,但是从整个项目而言,这种方式是非常不可取的,难道struts标签要让前端开发人员去写还是让后台开发人员去接触前端,这样看似分配原则分离数据但是从开发来看则大大的加大了系统的工作复杂度,更不利于开发,我认为,所谓一切的模板引擎都应该仅仅只是分配数据的作用,绝对的保证模板引擎的纯洁性,这是非常重要的开发原则。
对于一个一般的java应用程序:
package com.xuning.test;
import java.io.File;
import java.io.OutputStreamWriter;
import java.util.HashMap;
import java.util.Map;
import freemarker.template.Configuration;
public class TestFreeMarker {
public static void main(String[] args) throws Exception {
//实例化freemarker配置
Configuration cfg=new Configuration();
//指定freemarker的模板坐在位置
cfg.setDirectoryForTemplateLoading(new File("templates"));
//实例化一个hashmap对象
Map root =new HashMap();
//放入一个key-values对
root.put("name", "First Test");
//把数据分配给指定的模板
freemarker.template.Template t=cfg.getTemplate("test.ftl");
//处理输出
t.process(root, new OutputStreamWriter(System.out));
}
}
对于一个struts应用:
1:直接在struts.xml文件中把result的类型指定为freemarker类型,如:
<action name="testlogin_fm" class="com.xuning.action.LoginAction" method="testlogin_fm">
<result type="freemarker">/WEB-INF/view/ftl/testlogin_fm.ftl</result>
</action>
2:接下来,直接在模板里面使用freemarket语法就可以了,注意,在freemarker模板里面与struts标签是互相兼容的。
如:
<html>
<head>
</head>
<body>
<h3>This is Test Freemarker</h3>
${usernamefm}<br/>
您好,我叫徐宁<br/>
Freemarker内置变量:${stack.findString('usernamefm')}<br/>
<@s.form action="">
<@s.textfield name="" lable="用户名"/>
</@s.form>
通过struts标签获取到的用户名:<@s.property value="usernamefm"/><br/>
</body>
</html>