------------------------------------------------------------
前言:
????? 為什么要用模板?有了JSTL,還需要freemarker嗎?
????? 模板技術(shù)與容器無(wú)關(guān),同樣可以應(yīng)用于非Web應(yīng)用程序環(huán)境。ftl文件改動(dòng)之后是不需要編譯的,這點(diǎn)不同于Jsp 。JSTL只能用在jsp中,修改了jsp,需要重新編譯,從而使用模板更有效率。
一、上手實(shí)例
? 1. 在WEB-INF/lib中放置freemarker.jar,新建一個(gè)Servlet,Hello.java
- package ?com.fbysss.test.servlet;? ??
- ??
- import ?java.io.IOException;? ??
- import ?java.io.Writer;? ??
- import ?java.util.HashMap;? ??
- import ?java.util.Map;? ??
- ??
- import ?javax.servlet.ServletException;? ??
- import ?javax.servlet.http.HttpServletRequest;? ??
- import ?javax.servlet.http.HttpServletResponse;? ??
- ??
- import ?freemarker.core.Environment;? ??
- import ?freemarker.template.Configuration;? ??
- import ?freemarker.template.Template;? ??
- import ?freemarker.template.TemplateException;? ??
- ??
- /**? ?
- ?*?Servlet?implementation?class?for?Servlet:?hello? ?
- ?*? ?
- ?*/ ? ??
- ? public ? class ?Hello? extends ?javax.servlet.http.HttpServlet? implements ?javax.servlet.Servlet?{? ??
- ??? static ? final ? long ?serialVersionUID?=?1L;? ??
- ??? private ?Configuration?cfg;? ??
- ???? /*?(non-Java-doc)? ?
- ?????*?@see?javax.servlet.http.HttpServlet#HttpServlet()? ?
- ?????*/ ? ??
- ???? public ?Hello()?{? ??
- ???????? super ();? ??
- ????}???????? ??
- ????? ??
- ???? /*?(non-Java-doc)? ?
- ?????*?@see?javax.servlet.http.HttpServlet#doGet(HttpServletRequest?request,?HttpServletResponse?response)? ?
- ?????*/ ? ??
- ???? protected ? void ?doGet(HttpServletRequest?request,?HttpServletResponse?response)? throws ?ServletException,?IOException?{? ??
- ????????Map?root?=? new ?HashMap();? ??
- ????????? ??
- ????????root.put( "msg" , "你好,freemarker!" );? ??
- ????????root.put( "intValue" ,? 10 );? ??
- ????????root.put( "nullTag" ,? "n" );? ??
- ????????? ??
- ????????Template?template?=?cfg.getTemplate( "test.ftl" );? ??
- ???????? //response.setContentType("text/html;charset=gbk");//設(shè)定字符集,否則有漢字亂碼? ??
- ????????Writer?out?=?response.getWriter();? ??
- ??
- ???????? try ?{? ??
- ???????????? //1.用Enviroment? ??
- ????????????Environment?env?=?template.createProcessingEnvironment(root,?out);? ??
- ????????????env.setClassicCompatible( true );? ??
- ????????????env.process();? ??
- ???????????? //2.template.process(root,?out);//兩種方法都可以? ??
- ??
- ???????????? //out.flush();//清除緩沖區(qū)? ??
- ????????}? catch ?(TemplateException?e)?{? ??
- ???????????? //?TODO?Auto-generated?catch?block? ??
- ????????????e.printStackTrace();? ??
- ????????}? ??
- ????????? ??
- ????}???? ??
- ????? ??
- ???? /*?(non-Java-doc)? ?
- ?????*?@see?javax.servlet.http.HttpServlet#doPost(HttpServletRequest?request,?HttpServletResponse?response)? ?
- ?????*/ ? ??
- ???? protected ? void ?doPost(HttpServletRequest?request,?HttpServletResponse?response)? throws ?ServletException,?IOException?{? ??
- ???????? //?TODO?Auto-generated?method?stub? ??
- ????}???????? ??
- ????? ??
- ??
- ???? /*?(non-Javadoc)? ?
- ?????*?@see?javax.servlet.GenericServlet#init()? ?
- ?????*/ ? ??
- ???? public ? void ?init()? throws ?ServletException?{? ??
- ???????? //?TODO?Auto-generated?method?stub? ??
- ???????? super .init();? ??
- ????????cfg?=? new ?Configuration();? ??
- ????????? ??
- ????????cfg.setServletContextForTemplateLoading(getServletContext(), "WEB-INF/templates" );? ??
- ???????? //cfg.setClassicCompatible(true);//處理空值為空字符串? ??
- ????????? ??
- ????}???? ??
- }??
package com.fbysss.test.servlet;
import java.io.IOException;
import java.io.Writer;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import freemarker.core.Environment;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
/**
* Servlet implementation class for Servlet: hello
*
*/
public class Hello extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {
static final long serialVersionUID = 1L;
private Configuration cfg;
/* (non-Java-doc)
* @see javax.servlet.http.HttpServlet#HttpServlet()
*/
public Hello() {
super();
}
/* (non-Java-doc)
* @see javax.servlet.http.HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Map root = new HashMap();
root.put("msg","你好,freemarker!");
root.put("intValue", 10);
root.put("nullTag", "n");
Template template = cfg.getTemplate("test.ftl");
//response.setContentType("text/html;charset=gbk");//設(shè)定字符集,否則有漢字亂碼
Writer out = response.getWriter();
try {
//1.用Enviroment
Environment env = template.createProcessingEnvironment(root, out);
env.setClassicCompatible(true);
env.process();
//2.template.process(root, out);//兩種方法都可以
//out.flush();//清除緩沖區(qū)
} catch (TemplateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/* (non-Java-doc)
* @see javax.servlet.http.HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
}
/* (non-Javadoc)
* @see javax.servlet.GenericServlet#init()
*/
public void init() throws ServletException {
// TODO Auto-generated method stub
super.init();
cfg = new Configuration();
cfg.setServletContextForTemplateLoading(getServletContext(),"WEB-INF/templates");
//cfg.setClassicCompatible(true);//處理空值為空字符串
}
}
2.在WEB-INF/templates/下建立test.ftl文件
- <!--#escape?x?as?x! "" -->? ??
- <!--#setting?classic_compatible=true-->? ??
- <html>? ??
- <head>? ??
- ??<title>FreeMarker?Example?</title>? ??
- </head>? ??
- <body>? ??
- ??${msg}? ??
- ??${intValue}? ??
- ??${empty?default( "empty?Value" )}? ??
- ??${empty!}? ??
- ??${newTag}? ??
- ??${nullTag}? ??
- </body>? ??
- </html>? ??
- <!--/#escape-->???
<!--#escape x as x!""-->
<!--#setting classic_compatible=true-->
<html>
<head>
<title>FreeMarker Example </title>
</head>
<body>
${msg}
${intValue}
${empty?default("empty Value")}
${empty!}
${newTag}
${nullTag}
</body>
</html>
<!--/#escape-->
3.測(cè)試servlet,看到結(jié)果了,這里主要要注意亂碼和空值的處理。亂碼問(wèn)題,把//response.setContentType("text/html;charset=gbk");注釋去掉即可。下面重點(diǎn)說(shuō)說(shuō)空值的處理。
二、空值處理
${empty}
如果empty標(biāo)簽沒(méi)有在servlet中添加key或者值為null,會(huì)報(bào)錯(cuò) empty Value Expression newTag is undefined。
有人說(shuō)這是個(gè)好的控制錯(cuò)誤的機(jī)制,但本人不這么認(rèn)為,因?yàn)榭罩堤R?jiàn)了,誰(shuí)知道什么時(shí)候里面就成空值了?每個(gè)變量理論上都有可能。
難道每個(gè)變量都要加入一個(gè)判斷?就像struts中丑陋的<empty>標(biāo)簽?既然是模板引擎,就要靈活,何必來(lái)那么多限制?
還好,freemarker至少提供了解決辦法,否則我只好選擇其它引擎了。
freemarker中空值的多種處理方法:
1.按照f(shuō)reemarker的規(guī)范,老老實(shí)實(shí)的判斷是否有空值,有空值怎么處理。這在某種時(shí)候是有用的。格式:${empty!"EmptyValue of fbysss"}
比如值為空時(shí),你可以給出一個(gè)友好的說(shuō)明,但是很多的變量都要這么說(shuō)明,未免太麻煩了。
2.<#escape x as x!""></#escape>可以對(duì)所有的變量進(jìn)行空值處理,這里是全部替換為空字符串。當(dāng)然也可以替換為其它字符串。
如果其中某些變量不需要這種替換,可以加入<#noescape></#noescape>標(biāo)簽。
3.屬性配置方法:
配置classic_compatible=true可以滿足一般需要。默認(rèn)情況變量為null則替換為空字符串,如果需要自定義,寫(xiě)上${empty!"EmptyValue of fbysss"}的形式即可
a.通過(guò)Configuration設(shè)置。Configuration cfg = new Configuration(); cfg.setClassicCompatible(true);//設(shè)置屬性
b.通過(guò)Eviroment設(shè)置。
?? Environment env = template.createProcessingEnvironment(root, out);
?? env.setClassicCompatible(true);
c.通過(guò)ftl設(shè)置:在ftl前加入<!--#setting classic_compatible=true-->,
d.通過(guò)Spring配置文件設(shè)置
- < bean ? id = "freemarkerConfig" ??
- ???? class = "org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer" > ??
- ?? < property ? name = "freemarkerSettings" > ??
- ???? < props > ??
- ?????? < prop ? key = "classic_compatible" > true </ prop > ??
- ???? </ props > ??
- ?? </ property > ??
- </ bean > ??
<bean id="freemarkerConfig"
class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
<property name="freemarkerSettings">
<props>
<prop key="classic_compatible">true</prop>
</props>
</property>
</bean>
e.class目錄下添加freemarker.properties文件:加入classic_compatible=true
(需要struts2或spring)
舉一反三,其他屬性也可以用類(lèi)似方法進(jìn)行設(shè)置。
?
?
轉(zhuǎn)自: http://huxiao.iteye.com/blog/470927
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元

