在之前學習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>