籤:
FreeMarker概述
- FreeMarker是一個模板引擎,一個基於模板生成文本輸出的通用工具,使用純Java編寫
- Template + data model = output
< result >/ page.jsp </ result >
</ action >
< result type =”freemarker” >/ fm.ftl </ result >
</ action >
< servlet-name > JspSupportServlet </ servlet-name >
< servlet-class >
org.apache.struts2.views.JspSupportServlet
</ servlet-class >
< load-on-startup > 1 </ load-on-startup >
</ servlet >
< html >
< head >
< meta http - equiv = “ Content-Type “ content = “ text/html; charset=GB2312 “ >
< title > Insert title here </ title >
</ head >
< body >
< @s.form action = “Action1 .action “ >
< @s.textfield name = “ username “ ></ @s.textfield >
< @s.textfield name = “ password “ ></ @s.textfield >
< @s.submit value = “ 提交 “ />
</ @s.form >
< br /> 登錄用戶名:${username}
</ body >
</ html >
<package name="loginPackage" extends="jason-default">
<action name="jLogin" class="JLogin">
<result name="success" >/WEB-INF/jason/index.jsp</result>
<result name="error">/WEB-INF/jason/login.jsp</result>
<result name="input">/WEB-INF/jason/login.jsp</result>
<result name="search" type="freemarker">/ WEB-INF/templates/jsearch.ftl</result>
<interceptor-ref name="jLoginStack"/>
</action>
</package>
在ACTION中,進行設置:
..........
Hits hits = JLuceneUtils.luceneSearch(indexPath, searchMess);
System.out.println("----------hits.length():" + hits.length());
for (int a = 0; a < hits.length(); a++) {
Document doc2 = (Document) hits.doc(a);
System.out.println(searchMess + "的值是:"+ doc2.get("confContext"));
ActionContext.getContext().getSession().put("jsearch_value",
}
ActionContext.getContext().getSession().put ("jsearch_cout", hits.length());
ActionContext.getContext().getSession().put("jsearch_name", searchMess);
設置模板文件:jsearch.ftl:
<#assign s=JspTaglibs["/WEB-INF/struts-tags.tld"] />
<html xmlns="http://www.w3.org/1999/xhtml ">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>jason search result</title>
</head>
<table width="98%" border="0" align="center" cellpadding="5" cellspacing="0">
<tr>
<td><strong>以面是jason用lucene查詢的結果,共有${jsearch_cout}條符合:</strong></td>
</tr>
<tr>
<#-- freemarker插值(如下,是利用EL語言,即將ACTION中的值先放入session/request/application) -->
<td>查詢內容:${jsearch_name} --- 查詢值:${jsearch_value}</td>
</tr>
<tr>
<td>
<@s.url action="jLogin!login" id="login" />
<a href="${login}">返回登錄主頁</a>
</td>
</tr>
</table>
</body>
</html>
如果要使用STRUTS2.0的標籤,如上面.就要添加STRUTS2.0的標籤庫:
web.xml添加:
<servlet>
<servlet-name>JspSupportServlet</servlet-name>
<servlet-class>
org.apache.struts2.views.JspSupportServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
在jsearch.ftl最前面添加:
<#assign s=JspTaglibs["/WEB-INF/struts-tags.tld"] />
${name},你好!${msg}
這裏類似於${}的就是動態的內容,稱作"插值".
1,創建Configuration實例,該實例負責管理FreeMarker的模板加載路徑,負責生成模板實例
2,使用Configuration實例來生成Template實例,同進需要指定使用的模板文件
3,填充數據模型,數據模型就是一個Map對象
4,調用Template實例的process方法完成合並.
package lee;
import java.util.*;
import java.io.*;
import freemarker.template.*;
{
private Configuration cfg;
public void init() throws Exception
{
//初始化FreeMarker配置
//創建一個Configuration實例
cfg = new Configuration();
//設置FreeMarker的模版文件位置
cfg.setDirectoryForTemplateLoading(new File("templates"));
}
public void process()throws Exception
{
Map root = new HashMap();
root.put("name", "FreeMarker!");
root.put("msg" , "您已經完成了第一個FreeMarker的示例");
Template t = cfg.getTemplate("test.ftl");
t.process(root, new OutputStreamWriter(System.out));
{
HelloFreeMarker hf = new HelloFreeMarker();
hf.init();
hf.process();
}
}
上面的代碼創建了一個Map實例,這個Map將作爲模板文件的數據模型,我們要使用FreeMarker必須導入freemarker.jar文件,FreeMarker的官網是 http://freemarker.sourceforge.net/ ,雖然FreeMarker可以在Java程序中使用,但大部分時候還是用來生成HTML頁面.
<html>
<head>
<title>FreeMarker的HelloWorld</title>
</head>
<body>
${message}
</body>
</html>
我們在Web應用中使用FreeMarker時,應該讓Servlet來合併模板和數據,因此,Servlet負責創建Configuration實例,並負責合併模板和數據,下面是Servlet源代碼:
package lee;
import java.util.*;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import freemarker.template.*;
{
private Configuration cfg;
public void init()
{
//初始化FreeMarker配置
//創建一個Configuration實例
cfg = new Configuration();
//設置FreeMarker的模版文件位置
cfg.setServletContextForTemplateLoading(getServletContext(), "WEB-INF/templates");
}
public void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
//建立數據模型
Map root = new HashMap();
root.put("message", "Hello FreeMarker!");
//取得模版文件
Template t = cfg.getTemplate("test.ftl");
// 開始準備生成輸出
// - 使用模版文件的charset作爲本頁面的charset
// - 使用text/html MIME-type
response.setContentType("text/html; charset=" + t.getEncoding());
Writer out = response.getWriter();
//合併數據模型和模版,並將結果輸出到out中
try
{
t.process(root, out);
}
catch (TemplateException e)
{
throw new ServletException("處理Template模版中出現錯誤", e);
}
}
}
可 以看到這個Servlet類的代碼與普通的Java程序中使用FreeMarker大致一樣,區別有兩個:1,設置FreeMarker加載模板的方法不 一樣,在Servlet中設置加載的方法是setServletContextForTemplateLoading,第一個參數是本web應用的 ServletContext,第二個參數是模板文件的路徑.;2,結果必須輸出到HttpServletResponse中,才能被瀏覽器加載.
配置Servlet的web.xml文件中的代碼如下:
<web-app>
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>lee.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
1,文本:直接輸出的部分
2,註釋:<#-- ... -->格式部分,不會輸出
3,插值:即${...}或#{...}格式的部分,將使用數據模型中的部分替代輸出
4,FTL指令:FreeMarker指定,和HTML標記類似,名字前加#予以區分,不會輸出
<html><br>
<head><br>
<title>Welcome!</title><br>
</head><br>
<body><br>
<#-- 註釋部分 --><br>
<#-- 下面使用插值 -->
<h1>Welcome ${user} !</h1><br>
<p>We have these animals:<br>
<u1><br>
<#-- 使用FTL指令 -->
<#list animals as being><br>
<li>${being.name} for ${being.price} Euros<br>
<#list><br>
<u1><br>
</body><br>
</html>