第7章 Struts 2中應(yīng)用模板語言_第1頁
第7章 Struts 2中應(yīng)用模板語言_第2頁
第7章 Struts 2中應(yīng)用模板語言_第3頁
第7章 Struts 2中應(yīng)用模板語言_第4頁
第7章 Struts 2中應(yīng)用模板語言_第5頁
已閱讀5頁,還剩55頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

第7章Struts2中應(yīng)用模板語言7.1

Web模板簡介

7.2Velocity模板7.3FreeMarker模板7.4Velocity與FreeMarker的比較7.1

Web模板簡介

很多情況下,大量的開發(fā)成本都花費在后期維護上,因此開發(fā)人員希望應(yīng)用程序能夠?qū)崿F(xiàn)易維護性。模板技術(shù)提供了一種簡潔的方式來生成動態(tài)的頁面,并將業(yè)務(wù)邏輯和視圖進行分離,從而使程序開發(fā)人員只專注于編寫底層代碼,頁面設(shè)計人員只專注于視圖方面的設(shè)計。這種方式不僅提高了開發(fā)效率,還使得應(yīng)用程序在長時間運行后依然具有很好的維護性。那么,模板引擎是如何工作的呢?它的工作原理:

返回7.2Velocity模板Velocity模板語言簡稱VTL,是一個基于Java的模板引擎。在一個應(yīng)用程序中,可以預(yù)先使用Velocity模板語言設(shè)計好模板,開發(fā)人員將頁面顯示的數(shù)據(jù)放入上下文中,Velocity引擎將模板和上下文結(jié)合起來,然后就可生成動態(tài)的網(wǎng)頁。使用Velocity具有以下幾個優(yōu)點:

Velocity是Apache軟件組織提供的一項開源項目,可以免費下載。Velocity簡單,掌握Velocity是一件容易的事情。Velocity模版中不包含任何Java代碼,它將HTML技術(shù)和復(fù)雜的業(yè)務(wù)邏輯劃分出來,能簡化Web開發(fā)。Velocity不僅可以生成Web頁面,還可以從模板中生成SQL、PostScript和XML,功能強大。Velocity支持模版的國際化編碼轉(zhuǎn)換。

返回7.2Velocity模板7.2.1Velocity下載與安裝

7.2.3Velocity的注釋

7.2.5Velocity的指令

7.2.2

初識Velocity7.2.4Velocity的引用

7.2.6Velocity的其它特性

7.2.7Struts2對Velocity的支持Velocity下載與安裝

Velocity的下載網(wǎng)站是“/”,在此網(wǎng)站上下載完Velocity以后將其解壓縮,會得到兩個jar文件:velocity-1.5.jar和velocity-dep-1.5.jar,其中velocity-1.5.jar包含了Velocity的核心類,但是它沒有Velocity必需的庫文件,velocity-dep-1.5.jar不僅包含了構(gòu)建完整的Velocity庫文件,還有Velocity所有依賴的庫文件。將這兩個jar文件放入應(yīng)用程序的classpath下,就完成了Velocity的安裝。

返回初識Velocity(1)下面通過一個簡單實例來初步認(rèn)識Velocity。(1)在ecplise中新建一個Java工程,在工程的根目錄下建立Velocity模板文件,Velocity的模板文件以.vm結(jié)尾,在這里建立的模板文件的名稱為hello.vm,具體代碼如下:

hello,$name其中,$name被稱為Velocity的變量引用,它的值由Java程序來提供。

(2)建立給Velocity變量引用提供值的Java類,類名為“HelloVelocity.java”主要代碼如下:

初識Velocity(2)publicclass

HelloVelocity{ publicstaticvoidmain(String[]args){ try{ Velocity.init(); //初始化Velocity引擎 }catch(Exceptione){

e.printStackTrace(); }

VelocityContextcontext=new

VelocityContext(); //初始化Velocity上下文 context.put("name","Velocity"); //把數(shù)據(jù)填入上下文

StringWriterwriter=newStringWriter(); try{ //把模板和上下文結(jié)合起來

Velocity.mergeTemplate("hello.vm","ISO-8859-1",context,writer); }catch(Exceptione){

e.printStackTrace(); }

System.out.println(writer.toString()); //控制臺上輸出 }}運行類HelloVelocity,程序的運行結(jié)果如圖所示:

返回Velocity的注釋

在Velocity模板中包括以下兩種注釋:

單行注釋:以##開頭。多行注釋:以#*開始,以*#結(jié)束。

例如:##這是單行注釋#*這是多行注釋這是多行注釋*#返回Velocity的引用(1)

Velocity引用的作用是為了在模板中顯示動態(tài)的內(nèi)容。在Velocity中,引用分為變量引用、屬性引用和方法引用。

1.變量引用

變量引用由$和VTL標(biāo)識符組成,VTL標(biāo)識符必須以字母開頭,其余字符可以是字母(a…z、A…Z)、數(shù)字(0…9)、連字符(-)或下劃線(_)。例如:$username$user-name$user_name$number1變量引用有兩種賦值方式:一種是在Java程序中賦值:context.put("name","Velocity");另一種是使用set指令賦值:#set($username="sunyang")hello,$usernameVelocity的引用(2)

2.屬性引用

屬性引用是由$、點號(.)和VTL標(biāo)識符組成的,例如:$country.china$user.age屬性引用也有兩種賦值方式:一種是使用Hashtable對象賦值;另一種是使用方法賦值。有如下模板文件:

bookname:$book.booknamebookauthor:$book.bookauthor

使用Hashtable對象在程序中賦值:

使用方法賦值,創(chuàng)建Book類,有對應(yīng)屬性的get、set方法:Hashtablebook=new

Hashtable();book.put("bookname","JSP教材");book.put("bookauthor","sunyang");context.put("book",book); Bookbook=newBook();book.setBookname("JSP教程");book.setBookauthor("sunyang");context.put("book",book);Velocity的引用(3)

3.方法引用

方法引用由$、VTL標(biāo)識符和方法體組成,下面是使用方法引用的例子:

$book.getBookid()$book.setBookname("JSP教程")$book.getBookid()這種形式和屬性引用中的方法賦值是一樣的,而“$book.setBookname("JSP教程")”這種形式則是給屬性bookname賦值。返回Velocity的指令(1)

在Velocity中,引用用來輸出動態(tài)內(nèi)容,指令則是用來控制頁面的外觀和內(nèi)容。1.給引用賦值的set指令

set指令用于給變量引用或?qū)傩砸觅x值,語法格式如下:

#set(name=value)name參數(shù):該參數(shù)必須是變量引用或?qū)傩砸胿alue參數(shù):該參數(shù)可以是變量可以是變量引用、屬性引用、方法引用、字符串、數(shù)字、ArrayList或算術(shù)表達式。

參數(shù)說明:例如:#set($monkey=$bill) ##變量引用#set($monkey.Blame=$whitehouse.Leak)##屬性引用#set($monkey.Plan=$spindoctor.weave($web))##方法引用#set($monkey.Friend="monica") ##字符串

#set($monkey.Say=["Not",$my,"fault"])##ArrayList#set($number=$foo+1) ##算術(shù)表達式加法

Velocity的指令(2)

當(dāng)value值為字符串時,須用單引號或雙引號包圍起來。用單引號和雙引號之間有所不同,用雙引號的引用會替換成相應(yīng)的值,而用單引號的引用則輸出原代碼。例如:

#set($directoryRoot="www")#set($domain="")#set($mydomain1="$directoryRoot.$domain")#set($mydomain2='$directoryRoot.$domain')$mydomain1$mydomain2程序的輸出結(jié)果如下圖所示:

Velocity的指令(3)

2.進行條件控制的if/elseif/else指令

if/elseif/else指令類似于Java語言中的if…elseif…else指令,可進行條件控制,格式如下:

#if(condition)...#elseif(condition2)...#else...#end例如:#set($type="sunyang")#if($type=="sunyang")金牌會員#elseif($type=="common")普通會員#else游客#endVelocity的指令(4)

3.進行遍歷循環(huán)的foreach指令

foreach指令可用于進行遍歷循環(huán),格式如下:

#foreach(Loop)...#end

foreach指令可進行循環(huán)的對象有Vector、Hashtale或Array,例如:#foreach($bookin$booklist)$book#endVelocity的指令(5)

4.可包含文件的include指令

使用include指令可將一個本地文件導(dǎo)入到模板中指定的位置,可一次導(dǎo)入一個本地文件,也可一次導(dǎo)入多個本地文件,導(dǎo)入多個時文件之間用逗號分開,文件名可用引用變量代替。include指令的語法格式如下:

#include("file")##包含一個文件#include("file1","file2",…,"fileN") ##包含多個文件

例如:#include("main.html")#include("top.html",$main,$footer)Velocity的指令(6)

5.可包含文件的parse指令

使用parse指令可導(dǎo)入一個包含VTL的本地文件,和使用include不同,使用parse指令導(dǎo)入的文件會被Velocity解析,而且它只能一次導(dǎo)入一個文件,該指令的語法格式如下:

#parse("file")例如:#parse("index.vm")#parse($main)說明:使用parse指令包含的文件必須放在TEMPLATE_ROOT目錄下。Velocity的指令(7)

6.停止執(zhí)行的stop指令

stop指令經(jīng)常被使用在調(diào)試過程中,它可停止模板引擎的執(zhí)行并返回,語法格式如下:

#stop7.定義宏的macro指令

宏是一段可重復(fù)使用的VTL片段,它使用macro指令定義,語法格式如下:

#macro(macronameparam1param2...paramN)…#endmacroname是定義的宏的名字,param1到paramN是宏的參數(shù)。使用macroname宏的語法格式如下:#macroname(param1,param1param2...paramN)

Velocity的指令(8)

例如,定義宏:#macro(tablerows$color$somelist)#foreach($somethingin$somelist)<tr><tdbgcolor=$color>$something</td></tr>#end#end#set($greatlakes=["Superior","Michigan","Huron","Erie","Ontario"]#set($color="blue")<table>#tablerows($color$greatlakes)</table>使用宏返回Velocity的其它特性(1)

1.?dāng)?shù)學(xué)運算

Velocity的數(shù)學(xué)運算功能是通過set指令來實現(xiàn)的。例如:#set($number=$sum+6.8)#set($number=$sum-10)#set($number=$sum*9)#set($number=$sum/13)#set($number=$sum%2)2.范圍操作

[n..m]n與和m必須是整數(shù)。范圍操作通常與et指令和foreach指令一起使用,否則會被解析成普通的字符串,例如:

#set($sum=[0..2])#foreach($numberin$sum)$number#end$sum[0..2]Velocity的其它特性(2)

3.字符串連接

Velocity的字符串連接非常簡單,只需將需要連接的字符串放在一起就可以,例如:

#set($firstname="George")#set($lastname="Bush")#set($name="$firstname$lastname") ##連接后賦給一個引用變量henameis$firstname$lastnamehenameis$name要將字符串與引用連接需要使用一種引用符:${}。該引用符在Velocity中稱為正式引用符,例如:

#set($firstname="George")henameis${firstname}Bush

返回Struts2對Velocity的支持(1)

Struts2本身對Velocity提供了很好的支持,只需要經(jīng)過簡單的配置,就可以在程序中使用Velocity了,根本無須與Velocity的API打交道。下面將通過一個問候程序來演示如何使用Velocity作為Struts2的視圖。(1)創(chuàng)建一個Web工程,并將Velocity模板中所涉及到的類包導(dǎo)入到該工程下:

(2)創(chuàng)建名稱為“hello.vm”的模板文件,在該模板文件生成的頁面文件中,允許用戶在文本框中輸入用戶名,單擊按鈕后在該頁面顯示一句問候語,它的代碼如下:

Struts2對Velocity的支持(2)<html><head><title>問候程序</title></head><body>#if($name)你好,$name#end<formaction="helloVelocity.action"method="post">輸入問候人的名字:<inputtype="text"name="username"><br><inputtype="submit"name="submit"value="提交"/></form></html>(3)創(chuàng)建名稱為“HelloAction.java”類文件,類HelloAction用于接受用戶請求并將響應(yīng)結(jié)果返回給客戶端,它的詳細(xì)代碼如下:

Struts2對Velocity的支持(3)publicclassHelloActionimplementsAction{ privateStringusername; publicStringgetUsername(){ returnusername; } publicvoidsetUsername(Stringusername){

this.username=username; } publicStringexecute()throwsException{

ActionContext

ctx=ActionContext.getContext(); if(this.getUsername().equals("")){

ctx.put("name","請輸入問候的名字"); }else{

ctx.put("name",this.getUsername()); } return"hello"; }}

Struts2對Velocity的支持(4)(4)在src目錄下新建一個XML文件,名稱為“struts.xml”,該文件用于實現(xiàn)應(yīng)用程序中各Action的具體業(yè)務(wù)邏輯,它的關(guān)鍵代碼如下:

<struts> <packagename="com"extends="struts-default"> <actionname="*"> <resulttype="velocity">/{1}.vm</result> </action> <actionname="helloVelocity" class="com.sunyang.webtier.HelloAction"> <!--指定result的type為velocity--> <resultname="hello"type="velocity"> /hello.vm </result> </action> </package> <constantname="struts.i18n.encoding"value="gb2312"></constant></struts>Struts2對Velocity的支持(5)(4)配置web.xml文件,在該文件中配置Struts2的核心攔截器,它的關(guān)鍵代碼如下::

<filter> <filter-name>struts2</filter-name> <filter-class> org.apache.struts2.dispatcher.FilterDispatcher </filter-class></filter><!--FilterDispatcher用來初始化struts2并且處理所有的Web請求。--><filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern></filter-mapping>Struts2對Velocity的支持(6)

返回(6)程序運行后的結(jié)果如圖所示:7.3FreeMarker模板

FreeMarker是一個基于Java的模板引擎,它被用來設(shè)計生成Web靜態(tài)頁面,對采用MVC模式設(shè)計的應(yīng)用程序尤為適用。FreeMarker簡化了Web應(yīng)用的開發(fā),使Java代碼從Web頁面中分離出來,增強了系統(tǒng)的可維護性。FreeMarker同時是一個輕量級的組件,與容器無關(guān),它能夠生成各種文本如HTML、XML、RTF甚至于Java源代碼。此外,F(xiàn)reeMarker還具有以下的幾個優(yōu)點:

強大的模板語言:囊括所有常有的指令,使用復(fù)雜的表達式以及宏等。通用的數(shù)據(jù)模型:使用抽象(接口)方式表示對象。智能的國際化和本地化:多種不同語言的相同模板。強大的XML處理能力:可訪問XML對象模型。友好的報錯信息:報錯信息準(zhǔn)確、詳細(xì)。返回7.3FreeMarker模板

7.3.1FreeMarker下載與安裝

7.3.3FreeMarker的注釋

7.3.5FreeMarker的Interpolation

7.3.2初識FreeMarker

7.3.4FreeMarker的指令

7.3.6FreeMarker的表達式

7.3.7Struts2整合FreeMarker

FreeMarker下載與安裝

FreeMarker的下載網(wǎng)站是“http://www.FreeM/index.html”??蛇x擇下載FreeMarker的完整開發(fā)包,它里面包含了FreeMarker的示例應(yīng)用、幫助文檔、源代碼和所有類庫。開發(fā)一個基于FreeMarker的應(yīng)用程序所依賴的jar文件為freemarker.jar,因此,只需將freemarker.jar放入應(yīng)用程序的classpath下,就完成了FreeMarker的安裝。

返回初識FreeMarker(1)

FreeMarker本身是使用純Java語言編寫的一個模板引擎,它采用MVC模式設(shè)計,允許JavaServlet保持圖形設(shè)計同應(yīng)用程序邏輯的分離。FreeMarker的工作原理是模板+數(shù)據(jù)模型=輸出,以此將數(shù)據(jù)模型中的數(shù)據(jù)合并到模板并將其輸出。下面通過一個簡單實例來初步認(rèn)識FreeMarker。

(1)在ecplise中新建一個Java工程,在工程的根目錄下新建一個文件夾freemarker,freemarker文件夾中創(chuàng)建FreeMarker的模板文件,F(xiàn)reeMarker的模板文件以.ftl結(jié)尾,名稱為hello.ftl,代碼如下:

hello,${user}(2)建立完模板文件后,創(chuàng)建給模板提供值的數(shù)據(jù)模型,創(chuàng)建數(shù)據(jù)模型的Java程序主要代碼如下:

初識FreeMarker(2)publicclass

HelloFreeMarker{publicstaticvoidmain(String[]args){Configurationconfiguration=newConfiguration();//初始化ConfigurationMap<String,Object>data=new

HashMap<String,Object>();data.put(“user”,“FreeMarker”);//將數(shù)據(jù)放入Map中Templatetemplate=null;try{template=configuration.getTemplate(“freemarker/hello.ftl”);//加載模板}

catch(IOExceptione){e.printStackTrace();}try{cess(data,new

OutputStreamWriter(System.out));//輸出數(shù)據(jù)}catch(TemplateExceptione){e.printStackTrace()}catch(IOExceptione){e.printStackTrace();}}}運行類HelloFreeMarker,程序的輸出結(jié)果如圖所示:

返回FreeMarker的注釋

FreeMarker的注釋以<#--開始,以-->結(jié)束。例如:

<#--這是注釋部分-->FreeMarker的注釋還可用在FreeMarker的指令和Interpolation內(nèi)部,例如:

<h1>歡迎你:${username<#--用戶名-->}!<#list<#--somecomment...-->sequenceas<#--again...-->item></#list>返回FreeMarker的指令(1)

1.進行條件判斷的if/elseif/else指令

FreeMarker的if/elseif/else指令用來進行對數(shù)據(jù)的分支控制,if指令可單獨使用。if/elseif/else指令的語法格式如下:

<#ifcondition>...<#elseifcondition2>...<#elseifcondition3>...<#else>...</#if>例如:

<#assignage=80><#if(age>60)>老年<#elseif(age>40)>中年<#elseif(age>20)>青年<#else>少年或兒童</#if>FreeMarker的指令(2)

2.進行迭代的list、break指令

list指令用于迭代輸出集合元素中的值,break指令則用于終止循環(huán)。list、break指令的語法格式如下:

<#listhash_or_seqasitem>...<#ifitem="itemName"><#break></#if>...</#list>

hash_or_seq可以是集合對象或者h(yuǎn)ash表,甚至還可以是一個返回值為集合對象的表達式,item是被迭代輸出的集合元素。在list指令中有兩個隱含的特殊變量:item_index:該變量將返回元素在hash_or_seq里的索引值。item_has_next:該變量類型為boolean型,當(dāng)值為false時表明該元素是hash_or_seq里的最后一個元素。

FreeMarker的指令(3)

3.進行分支控制的switch、case、default、break指令<#switchvalue><#caserefValue1>...<#break><#caserefValue2>...<#break>...<#caserefValueN>...<#break><#default>...</#switch>switch、case、default、break指令類似于Java中的switch結(jié)構(gòu),可用來進行分支控制,它的語法格式如下:

switch指令中至少需要包含一個case指令,例如:

<#assignflag=1><#switchflag><#case0>春天<#break><#case1>夏天<#break><#case2>秋天<#break><#default>冬天</#switch>FreeMarker的指令(4)

4.可包含文件的include指令<#includefilenameoptions>include指令用于包含指定的文件,語法格式如下:

filename指被包含的文件名,options可省略或者是下面兩個值:

encoding:包含頁面時所用的編碼格式。parse:指定包含文件是否用FTL語法解析,默認(rèn)值是true。

例如:<#include"/main.ftl"encoding="GBK"parse=true>FreeMarker的指令(5)

5.導(dǎo)入文件的import指令

<#importpathashash>import指令用于導(dǎo)入指定的模板文件,類似于Java中的import,它的語法格式如下:

例如:<#import"/tree.ftl"astree>6.不處理內(nèi)容的noparse指令

noparse指令可指定FreeMarker不處理被指令包含的內(nèi)容,語法:<#noparse>…<#noparse>例如:<#noparse><#assignnumber=123><#if(number>60)>${number}</#if></#noparse>FreeMarker的指令(6)

7.可壓縮空白空間和空白的行compress指令

<#compress>…</#compress>compress指令用于壓縮空白空間和空白的行。語法格式如下:

8.添加與去除表達式的escape、noescape指令

escape指令用于使被escape指令包圍的Interpolatioin自動加上escape表達式,而noescape指令則用于取消這些表達式。語法格式如下:

<#escapeidentifierasexpression>...<#noescape>...</#noescape>...</#escape><#escapeelasel?html>書名:${bookname}<#noescape>作者:${bookautor}</#noescape>價格:${bookprice}</#escape>書名:${bookname?html}作者:${bookautor}價格:${bookprice?html}等價FreeMarker的指令(7)

9.定義或隱藏變量的assign指令

assign指令的作用是定義或隱藏變量,所謂隱藏變量是指assign定義的變量之前已經(jīng)存在,使用assign定義后之前變量的值會被當(dāng)前變量隱藏。assign指令的語法格式如下:

<#assignname=value>assign指令還可一次定義多個變量,定義多個變量的語法格式如下:

<#assignname1=value1name2=N=valueN>FreeMarker允許assign指令用in子句將定義的變量放入namespace(命名空間)中,語法如下:

<#assignnameinnamespace>assign指令允許將一段輸出的文本賦值給定義的變量,語法格式如下:

<#assignname>循環(huán)部分輸出部分</#assign>assign指令還允許將變量的名稱定義為中文。

FreeMarker的指令(8)

10.定義全局變量的global指令

使用global指令定義的變量為全局變量,global指令的語法格式如下:

<#globalname>11.設(shè)置運行環(huán)境的setting指令

setting指令可用來設(shè)置系統(tǒng)的運行環(huán)境,它的語法格式如下:

<#settingname=value>若global指令和assign指令一起使用,global指令定義的變量會被assign指令所隱藏。

name可以是以下幾個值:

locale:設(shè)置模板所用的國家/語言選項。number_format:設(shè)置格式化輸出數(shù)字的格式。

FreeMarker的指令(9)

boolean_format:設(shè)置兩個boolean值的語法格式,默認(rèn)值是“true,false”。date_format,time_format,datetime_format:設(shè)置格式化輸出日期的格式。url_escaping_charset:設(shè)置URL傳遞參數(shù)的字符集編碼格式。time_zone:設(shè)置格式化輸出日期所使用的時區(qū)。

例如,使用setting指令格式數(shù)字:

<#assignnumber=33/><#settingnumber_format="percent"/>${number}<#settingnumber_format="currency"/>${number}FreeMarker的指令(10)

宏是一個用戶自定義指令,定義完宏后就可以在模板中用@來使用宏。在FreeMarker中,宏是使用macro指令來定義的,定義宏的語法格式如下:

<#macronameparam1param2...paramN>...<#nestedloopvar1,loopvar2,...,loopvarN>...<#return>...</#macro>12.可自定義指令的宏指令

name是定義的宏的名字,paramN是宏的參數(shù),該參數(shù)可包含多個。nested指令用于輸出宏的開始和結(jié)束標(biāo)簽之間的部分,loopvarN是nested指令中的循環(huán)變量,這些變量由macro定義部分指定后傳給使用的模板。return指令用于結(jié)束宏。返回FreeMarker的Interpolation(1)

在FreeMarker中,Interpolation包括兩種:通用Interpolation和數(shù)字專用Interpolation

1.通用Interpolation的語法如下:

${expre}當(dāng)expre的值是字符串時,會直接在模板中輸出表達式結(jié)果。當(dāng)expre的值是數(shù)字時,其輸出格式由setting指令指定或通過內(nèi)建的字符串函數(shù)指定。

當(dāng)expre的值是日期時,其輸出格式由setting指令指定或通過內(nèi)建的字符串函數(shù)指定。

當(dāng)expre值為boolean時,不能直接輸出,可以使用內(nèi)建的字符串函數(shù)格式化后再輸出。FreeMarker的Interpolation(2)

2.?dāng)?shù)字專用Interpolation

的語法如下:#{expre}或#{expre;format}第2種語法格式可用來格式數(shù)字,其中的format使用mN或MN表示,mN代表小數(shù)部分最小N位,MN代表小數(shù)部分最大N位。例如:<#assignx=6.2673><#assigny=3>#{x;m2}#{x;M2}#{y;m1}#{y;M1}#{x;m1M3}#{y;m1M2}返回FreeMarker的表達式(1)1.直接指定值

字符串:字符串用單引號或雙引號限定,包含特殊字符的字符串需要轉(zhuǎn)義。轉(zhuǎn)義序列如表所示。

轉(zhuǎn)義序列含義\"雙引號(u0022)\'單引號(u0027)\\反斜杠(u005C)\n換行(u000A)\rReturn(u000D)\tTab(u0009)\bBackspace(u0008)\fFormfeed(u000C)\l<\g>\a&\{{\xCode4位16進制Unicode代碼FreeMarker的表達式(2)1.直接指定值

數(shù)字:數(shù)字可直接輸入,不需要引號。精度數(shù)字使用“.”分割。集合:集合包括由逗號分割的子變量列表(如[“男”,“女”])和數(shù)字序列(如0..3,相當(dāng)于[0,1,2,3])布爾值:布爾值包括true和false,不需要引號。散列(hash):散列是由逗號分隔的鍵/值列表,由大括號限定,鍵和值之間用冒號分隔,如:{"username":"sunyang","age":30}。FreeMarker的表達式(3)2.獲取變量

獲取變量的途徑如下:從頂層變量中獲取:頂層變量其實就是存放在數(shù)據(jù)模型中的值,在模板中使用${var}直接輸出,變量名由字母、數(shù)字、下劃線、$、@和#的組合而成,且不能以數(shù)字開頭。從散列(hash)中獲?。簭纳⒘校╤ash)中獲取的變量,使用點號(“.”)或方括號(“[]”)來輸出。從集合中獲取:獲取方式和散列中用方括號獲取相同,但是要求方括號中的表達式值必須是數(shù)字。特殊變量的獲?。簩τ谝恍┨厥獾淖兞?,比如FreeMarker的提供的內(nèi)建變量等,使用.variableName訪問。FreeMarker的表達式(4)3.字符串操作

連接字符串:使用${var}(或#{num})在文本部分插入表達式的值或者直接用加號來連接。截取子串:截取子串是根據(jù)字符串的索引來完成的,如:${username[3]}表示將索引值位置為3的字串截取掉。4.集合操作

集合的連接使用加號(+)連接。

5.散列(hash)操作

散列(hash)的連接和集合一樣,也是使用加號(+)來連接的。

6.算術(shù)運算操作

算術(shù)運算操作有+、-、×、%。當(dāng)進行加加法運算時,如果一邊是數(shù)字,另一邊是字符串,F(xiàn)reeMarker會自動將數(shù)字轉(zhuǎn)換為字符串。

FreeMarker的表達式(5)7.比較運算操作,規(guī)則如下:

使用=(或==)測試兩個值是否相等,使用!=測試兩個值是否不相等,=和!=兩邊要求相同類型的值。FreeMarker是精確比較,所以"x"、"x"和"X"是不相等的。對數(shù)字和日期比較可以使用<、<=、>和>=,但字符串不能。由于FreeMarker會將>解釋成FTL標(biāo)簽的結(jié)束字符,所以對于>和>=可以使用括號來避免這種情況,例如<#if(x>y)>??梢允褂胠t、lte、gt和gte來替代<、<=、>和>=。8.邏輯運算操作

邏輯運算操作的運算符有邏輯與(&&)、邏輯或(||)和邏輯非(!),邏輯運算符只能作用于布爾值。

FreeMarker的表達式(6)9.內(nèi)建函數(shù)

內(nèi)建函數(shù)的用法類似訪問散列的子變量,只是使用“?”替代“.”,F(xiàn)reeMarker提供的內(nèi)建函數(shù)如下:字符串函數(shù):字符串函數(shù)的名稱及其描述如表所示。函數(shù)名稱描述html對字符串進行HTML編碼cap_first使字符串第一個字母大寫lower_case將字符串轉(zhuǎn)換成小寫upper_case將字符串轉(zhuǎn)換成大寫trim去掉字符串前后的空白字符集合函數(shù):集合函數(shù)只有一個:size,用于獲取集合中元素中的數(shù)目。數(shù)字函數(shù):數(shù)字函數(shù)也只有一個:int,用于獲取數(shù)字的整數(shù)部分。FreeMarker的表達式(7)10.空值處理

在FreeMarker

模板中,若變量未被賦值或者未定義,程序?qū)伋霎惓?,為了避免這種情況,F(xiàn)reeMarker提供了兩個運算符:

?。褐付ㄗ兞康哪J(rèn)值,如:var!或var!defaultValue,當(dāng)使用

var!這種形式時表明默認(rèn)值是空字符串、size為零的集合或size為零的散列(hash),當(dāng)使用var!defaultValue這種形式時,不要求defaultValue(默認(rèn)值)和變量類型相同。??:使用??時返回值是布爾值,如:var??,若var存在,返回值為true,否則為false。

FreeMarker的表達式(8)11.運算符優(yōu)先級

FreeMarker中運算符優(yōu)先級(從高到低)的順序如表所示:

名稱運算符后綴[subvarName][subStringRange].(methodParams)一元+expr、-expr、!內(nèi)建函數(shù)?乘、除、取余*、/、%加、減+、-比較<、>、<=、>=(lt、lte、gt、gte)相等、不等==(=)、!=邏輯與&&邏輯或||數(shù)字范圍..返回Struts2整合FreeMarker(1)Struts2提供了對FreeMarker模板引擎的支持,這在一定程度上方便了FreeMarker的開發(fā)者,從而也更有效的推動了模板技術(shù)的發(fā)展:

(1)創(chuàng)建一個Web工程,該工程的目錄結(jié)構(gòu)如圖所示。

Struts2整合FreeMarker(2)(2)建立FreeMarker的模板文件login.ftl、success.ftl和error.ftl,其中l(wèi)ogin.ftl用于生成用戶的登錄頁面,它的代碼如下:<html> <head> <title>用戶登錄</title> </head> <body> <@s.formaction="userlogin.action"> <tablealign="center"> <tr><td>請登錄</td><td></td></tr> <tr><td><@s.textfieldlabel="用戶名"name="username"/></td></tr> <tr><td><@s.textfieldlabel="密碼"name="password"/></td></tr> <tr><td><@s.submittype="submit"value="登錄"/></td></tr> </table> </@s.form> </body></html>

Struts2整合FreeMarker(3)success.ftl用于生成生成用戶登錄成功后的頁面,它的代碼如下:<html><head><title>登錄成功頁面</title></head><body><center>${user},${state}</center></body></html>error.ftl用用于生成用戶登錄失敗后的頁面,它的代碼如下:<html><head><title>登錄失敗頁面</title></head><body><center>$

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論