第7章 Struts 2中应用模板语言_第1页
第7章 Struts 2中应用模板语言_第2页
第7章 Struts 2中应用模板语言_第3页
第7章 Struts 2中应用模板语言_第4页
第7章 Struts 2中应用模板语言_第5页
已阅读5页,还剩55页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第7章Struts2中应用模板语言7.1

Web模板简介

7.2Velocity模板7.3FreeMarker模板7.4Velocity与FreeMarker的比较7.1

Web模板简介

很多情况下,大量的开发成本都花费在后期维护上,因此开发人员希望应用程序能够实现易维护性。模板技术提供了一种简洁的方式来生成动态的页面,并将业务逻辑和视图进行分离,从而使程序开发人员只专注于编写底层代码,页面设计人员只专注于视图方面的设计。这种方式不仅提高了开发效率,还使得应用程序在长时间运行后依然具有很好的维护性。那么,模板引擎是如何工作的呢?它的工作原理:

返回7.2Velocity模板Velocity模板语言简称VTL,是一个基于Java的模板引擎。在一个应用程序中,可以预先使用Velocity模板语言设计好模板,开发人员将页面显示的数据放入上下文中,Velocity引擎将模板和上下文结合起来,然后就可生成动态的网页。使用Velocity具有以下几个优点:

Velocity是Apache软件组织提供的一项开源项目,可以免费下载。Velocity简单,掌握Velocity是一件容易的事情。Velocity模版中不包含任何Java代码,它将HTML技术和复杂的业务逻辑划分出来,能简化Web开发。Velocity不仅可以生成Web页面,还可以从模板中生成SQL、PostScript和XML,功能强大。Velocity支持模版的国际化编码转换。

返回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的下载网站是“/”,在此网站上下载完Velocity以后将其解压缩,会得到两个jar文件:velocity-1.5.jar和velocity-dep-1.5.jar,其中velocity-1.5.jar包含了Velocity的核心类,但是它没有Velocity必需的库文件,velocity-dep-1.5.jar不仅包含了构建完整的Velocity库文件,还有Velocity所有依赖的库文件。将这两个jar文件放入应用程序的classpath下,就完成了Velocity的安装。

返回初识Velocity(1)下面通过一个简单实例来初步认识Velocity。(1)在ecplise中新建一个Java工程,在工程的根目录下建立Velocity模板文件,Velocity的模板文件以.vm结尾,在这里建立的模板文件的名称为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"); //把数据填入上下文

StringWriterwriter=newStringWriter(); try{ //把模板和上下文结合起来

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

e.printStackTrace(); }

System.out.println(writer.toString()); //控制台上输出 }}运行类HelloVelocity,程序的运行结果如图所示:

返回Velocity的注释

在Velocity模板中包括以下两种注释:

单行注释:以##开头。多行注释:以#*开始,以*#结束。

例如:##这是单行注释#*这是多行注释这是多行注释*#返回Velocity的引用(1)

Velocity引用的作用是为了在模板中显示动态的内容。在Velocity中,引用分为变量引用、属性引用和方法引用。

1.变量引用

变量引用由$和VTL标识符组成,VTL标识符必须以字母开头,其余字符可以是字母(a…z、A…Z)、数字(0…9)、连字符(-)或下划线(_)。例如:$username$user-name$user_name$number1变量引用有两种赋值方式:一种是在Java程序中赋值:context.put("name","Velocity");另一种是使用set指令赋值:#set($username="sunyang")hello,$usernameVelocity的引用(2)

2.属性引用

属性引用是由$、点号(.)和VTL标识符组成的,例如:$country.china$user.age属性引用也有两种赋值方式:一种是使用Hashtable对象赋值;另一种是使用方法赋值。有如下模板文件:

bookname:$book.booknamebookauthor:$book.bookauthor

使用Hashtable对象在程序中赋值:

使用方法赋值,创建Book类,有对应属性的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标识符和方法体组成,下面是使用方法引用的例子:

$book.getBookid()$book.setBookname("JSP教程")$book.getBookid()这种形式和属性引用中的方法赋值是一样的,而“$book.setBookname("JSP教程")”这种形式则是给属性bookname赋值。返回Velocity的指令(1)

在Velocity中,引用用来输出动态内容,指令则是用来控制页面的外观和内容。1.给引用赋值的set指令

set指令用于给变量引用或属性引用赋值,语法格式如下:

#set(name=value)name参数:该参数必须是变量引用或属性引用value参数:该参数可以是变量可以是变量引用、属性引用、方法引用、字符串、数字、ArrayList或算术表达式。

参数说明:例如:#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) ##算术表达式加法

Velocity的指令(2)

当value值为字符串时,须用单引号或双引号包围起来。用单引号和双引号之间有所不同,用双引号的引用会替换成相应的值,而用单引号的引用则输出原代码。例如:

#set($directoryRoot="www")#set($domain="")#set($mydomain1="$directoryRoot.$domain")#set($mydomain2='$directoryRoot.$domain')$mydomain1$mydomain2程序的输出结果如下图所示:

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.进行遍历循环的foreach指令

foreach指令可用于进行遍历循环,格式如下:

#foreach(Loop)...#end

foreach指令可进行循环的对象有Vector、Hashtale或Array,例如:#foreach($bookin$booklist)$book#endVelocity的指令(5)

4.可包含文件的include指令

使用include指令可将一个本地文件导入到模板中指定的位置,可一次导入一个本地文件,也可一次导入多个本地文件,导入多个时文件之间用逗号分开,文件名可用引用变量代替。include指令的语法格式如下:

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

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

5.可包含文件的parse指令

使用parse指令可导入一个包含VTL的本地文件,和使用include不同,使用parse指令导入的文件会被Velocity解析,而且它只能一次导入一个文件,该指令的语法格式如下:

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

6.停止执行的stop指令

stop指令经常被使用在调试过程中,它可停止模板引擎的执行并返回,语法格式如下:

#stop7.定义宏的macro指令

宏是一段可重复使用的VTL片段,它使用macro指令定义,语法格式如下:

#macro(macronameparam1param2...paramN)…#endmacroname是定义的宏的名字,param1到paramN是宏的参数。使用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.数学运算

Velocity的数学运算功能是通过set指令来实现的。例如:#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必须是整数。范围操作通常与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提供了很好的支持,只需要经过简单的配置,就可以在程序中使用Velocity了,根本无须与Velocity的API打交道。下面将通过一个问候程序来演示如何使用Velocity作为Struts2的视图。(1)创建一个Web工程,并将Velocity模板中所涉及到的类包导入到该工程下:

(2)创建名称为“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)创建名称为“HelloAction.java”类文件,类HelloAction用于接受用户请求并将响应结果返回给客户端,它的详细代码如下:

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”,该文件用于实现应用程序中各Action的具体业务逻辑,它的关键代码如下:

<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的核心拦截器,它的关键代码如下::

<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)程序运行后的结果如图所示:7.3FreeMarker模板

FreeMarker是一个基于Java的模板引擎,它被用来设计生成Web静态页面,对采用MVC模式设计的应用程序尤为适用。FreeMarker简化了Web应用的开发,使Java代码从Web页面中分离出来,增强了系统的可维护性。FreeMarker同时是一个轻量级的组件,与容器无关,它能够生成各种文本如HTML、XML、RTF甚至于Java源代码。此外,FreeMarker还具有以下的几个优点:

强大的模板语言:囊括所有常有的指令,使用复杂的表达式以及宏等。通用的数据模型:使用抽象(接口)方式表示对象。智能的国际化和本地化:多种不同语言的相同模板。强大的XML处理能力:可访问XML对象模型。友好的报错信息:报错信息准确、详细。返回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的下载网站是“http://www.FreeM/index.html”。可选择下载FreeMarker的完整开发包,它里面包含了FreeMarker的示例应用、帮助文档、源代码和所有类库。开发一个基于FreeMarker的应用程序所依赖的jar文件为freemarker.jar,因此,只需将freemarker.jar放入应用程序的classpath下,就完成了FreeMarker的安装。

返回初识FreeMarker(1)

FreeMarker本身是使用纯Java语言编写的一个模板引擎,它采用MVC模式设计,允许JavaServlet保持图形设计同应用程序逻辑的分离。FreeMarker的工作原理是模板+数据模型=输出,以此将数据模型中的数据合并到模板并将其输出。下面通过一个简单实例来初步认识FreeMarker。

(1)在ecplise中新建一个Java工程,在工程的根目录下新建一个文件夹freemarker,freemarker文件夹中创建FreeMarker的模板文件,FreeMarker的模板文件以.ftl结尾,名称为hello.ftl,代码如下:

hello,${user}(2)建立完模板文件后,创建给模板提供值的数据模型,创建数据模型的Java程序主要代码如下:

初识FreeMarker(2)publicclass

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

HashMap<String,Object>();data.put(“user”,“FreeMarker”);//将数据放入Map中Templatetemplate=null;try{template=configuration.getTemplate(“freemarker/hello.ftl”);//加载模板}

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

OutputStreamWriter(System.out));//输出数据}catch(TemplateExceptione){e.printStackTrace()}catch(IOExceptione){e.printStackTrace();}}}运行类HelloFreeMarker,程序的输出结果如图所示:

返回FreeMarker的注释

FreeMarker的注释以<#--开始,以-->结束。例如:

<#--这是注释部分-->FreeMarker的注释还可用在FreeMarker的指令和Interpolation内部,例如:

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

1.进行条件判断的if/elseif/else指令

FreeMarker的if/elseif/else指令用来进行对数据的分支控制,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指令则用于终止循环。list、break指令的语法格式如下:

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

hash_or_seq可以是集合对象或者hash表,甚至还可以是一个返回值为集合对象的表达式,item是被迭代输出的集合元素。在list指令中有两个隐含的特殊变量:item_index:该变量将返回元素在hash_or_seq里的索引值。item_has_next:该变量类型为boolean型,当值为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结构,可用来进行分支控制,它的语法格式如下:

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

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

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

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

encoding:包含页面时所用的编码格式。parse:指定包含文件是否用FTL语法解析,默认值是true。

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

5.导入文件的import指令

<#importpathashash>import指令用于导入指定的模板文件,类似于Java中的import,它的语法格式如下:

例如:<#import"/tree.ftl"astree>6.不处理内容的noparse指令

noparse指令可指定FreeMarker不处理被指令包含的内容,语法:<#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定义的变量之前已经存在,使用assign定义后之前变量的值会被当前变量隐藏。assign指令的语法格式如下:

<#assignname=value>assign指令还可一次定义多个变量,定义多个变量的语法格式如下:

<#assignname1=value1name2=N=valueN>FreeMarker允许assign指令用in子句将定义的变量放入namespace(命名空间)中,语法如下:

<#assignnameinnamespace>assign指令允许将一段输出的文本赋值给定义的变量,语法格式如下:

<#assignname>循环部分输出部分</#assign>assign指令还允许将变量的名称定义为中文。

FreeMarker的指令(8)

10.定义全局变量的global指令

使用global指令定义的变量为全局变量,global指令的语法格式如下:

<#globalname>11.设置运行环境的setting指令

setting指令可用来设置系统的运行环境,它的语法格式如下:

<#settingname=value>若global指令和assign指令一起使用,global指令定义的变量会被assign指令所隐藏。

name可以是以下几个值:

locale:设置模板所用的国家/语言选项。number_format:设置格式化输出数字的格式。

FreeMarker的指令(9)

boolean_format:设置两个boolean值的语法格式,默认值是“true,false”。date_format,time_format,datetime_format:设置格式化输出日期的格式。url_escaping_charset:设置URL传递参数的字符集编码格式。time_zone:设置格式化输出日期所使用的时区。

例如,使用setting指令格式数字:

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

宏是一个用户自定义指令,定义完宏后就可以在模板中用@来使用宏。在FreeMarker中,宏是使用macro指令来定义的,定义宏的语法格式如下:

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

name是定义的宏的名字,paramN是宏的参数,该参数可包含多个。nested指令用于输出宏的开始和结束标签之间的部分,loopvarN是nested指令中的循环变量,这些变量由macro定义部分指定后传给使用的模板。return指令用于结束宏。返回FreeMarker的Interpolation(1)

在FreeMarker中,Interpolation包括两种:通用Interpolation和数字专用Interpolation

1.通用Interpolation的语法如下:

${expre}当expre的值是字符串时,会直接在模板中输出表达式结果。当expre的值是数字时,其输出格式由setting指令指定或通过内建的字符串函数指定。

当expre的值是日期时,其输出格式由setting指令指定或通过内建的字符串函数指定。

当expre值为boolean时,不能直接输出,可以使用内建的字符串函数格式化后再输出。FreeMarker的Interpolation(2)

2.数字专用Interpolation

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

字符串:字符串用单引号或双引号限定,包含特殊字符的字符串需要转义。转义序列如表所示。

转义序列含义\"双引号(u0022)\'单引号(u0027)\\反斜杠(u005C)\n换行(u000A)\rReturn(u000D)\tTab(u0009)\bBackspace(u0008)\fFormfeed(u000C)\l<\g>\a&\{{\xCode4位16进制Unicode代码FreeMarker的表达式(2)1.直接指定值

数字:数字可直接输入,不需要引号。精度数字使用“.”分割。集合:集合包括由逗号分割的子变量列表(如[“男”,“女”])和数字序列(如0..3,相当于[0,1,2,3])布尔值:布尔值包括true和false,不需要引号。散列(hash):散列是由逗号分隔的键/值列表,由大括号限定,键和值之间用冒号分隔,如:{"username":"sunyang","age":30}。FreeMarker的表达式(3)2.获取变量

获取变量的途径如下:从顶层变量中获取:顶层变量其实就是存放在数据模型中的值,在模板中使用${var}直接输出,变量名由字母、数字、下划线、$、@和#的组合而成,且不能以数字开头。从散列(hash)中获取:从散列(hash)中获取的变量,使用点号(“.”)或方括号(“[]”)来输出。从集合中获取:获取方式和散列中用方括号获取相同,但是要求方括号中的表达式值必须是数字。特殊变量的获取:对于一些特殊的变量,比如FreeMarker的提供的内建变量等,使用.variableName访问。FreeMarker的表达式(4)3.字符串操作

连接字符串:使用${var}(或#{num})在文本部分插入表达式的值或者直接用加号来连接。截取子串:截取子串是根据字符串的索引来完成的,如:${username[3]}表示将索引值位置为3的字串截取掉。4.集合操作

集合的连接使用加号(+)连接。

5.散列(hash)操作

散列(hash)的连接和集合一样,也是使用加号(+)来连接的。

6.算术运算操作

算术运算操作有+、-、×、%。当进行加加法运算时,如果一边是数字,另一边是字符串,FreeMarker会自动将数字转换为字符串。

FreeMarker的表达式(5)7.比较运算操作,规则如下:

使用=(或==)测试两个值是否相等,使用!=测试两个值是否不相等,=和!=两边要求相同类型的值。FreeMarker是精确比较,所以"x"、"x"和"X"是不相等的。对数字和日期比较可以使用<、<=、>和>=,但字符串不能。由于FreeMarker会将>解释成FTL标签的结束字符,所以对于>和>=可以使用括号来避免这种情况,例如<#if(x>y)>。可以使用lt、lte、gt和gte来替代<、<=、>和>=。8.逻辑运算操作

逻辑运算操作的运算符有逻辑与(&&)、逻辑或(||)和逻辑非(!),逻辑运算符只能作用于布尔值。

FreeMarker的表达式(6)9.内建函数

内建函数的用法类似访问散列的子变量,只是使用“?”替代“.”,FreeMarker提供的内建函数如下:字符串函数:字符串函数的名称及其描述如表所示。函数名称描述html对字符串进行HTML编码cap_first使字符串第一个字母大写lower_case将字符串转换成小写upper_case将字符串转换成大写trim去掉字符串前后的空白字符集合函数:集合函数只有一个:size,用于获取集合中元素中的数目。数字函数:数字函数也只有一个:int,用于获取数字的整数部分。FreeMarker的表达式(7)10.空值处理

在FreeMarker

模板中,若变量未被赋值或者未定义,程序将会抛出异常,为了避免这种情况,FreeMarker提供了两个运算符:

!:指定变量的默认值,如:var!或var!defaultValue,当使用

var!这种形式时表明默认值是空字符串、size为零的集合或size为零的散列(hash),当使用var!defaultValue这种形式时,不要求defaultValue(默认值)和变量类型相同。??:使用??时返回值是布尔值,如:var??,若var存在,返回值为true,否则为false。

FreeMarker的表达式(8)11.运算符优先级

FreeMarker中运算符优先级(从高到低)的顺序如表所示:

名称运算符后缀[subvarName][subStringRange].(methodParams)一元+expr、-expr、!内建函数?乘、除、取余*、/、%加、减+、-比较<、>、<=、>=(lt、lte、gt、gte)相等、不等==(=)、!=逻辑与&&逻辑或||数字范围..返回Struts2整合FreeMarker(1)Struts2提供了对FreeMarker模板引擎的支持,这在一定程度上方便了FreeMarker的开发者,从而也更有效的推动了模板技术的发展:

(1)创建一个Web工程,该工程的目录结构如图所示。

Struts2整合FreeMarker(2)(2)建立FreeMarker的模板文件login.ftl、success.ftl和error.ftl,其中login.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. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论