velocity調(diào)用java方法
velocity調(diào)用java方法
Velocity是一個(gè)基于java的模板引擎(template engine)。它允許任何人僅僅使用簡(jiǎn)單的模板語(yǔ)言(template language)來(lái)引用由java代碼定義的對(duì)象。下面由學(xué)習(xí)啦小編整理了幾種vlookup函數(shù)的使用方法,希望對(duì)大家有所幫助。
velocity調(diào)用java方法一
項(xiàng)目結(jié)構(gòu) velocity tool java類(lèi)
public class T {
public String msg() {
return "難道必須沒(méi)有報(bào)名嘛 會(huì)瘋掉的!";
}
public String getMessage() {
return "message";
}
public String sayHello(String s) {
return "say hello by macro " + s;
}
}
以上是類(lèi) 無(wú)包名
以上是tools.xml文件內(nèi)容存放在web-inf下
input.encoding=utf-8
output.encoding=utf-8
# Filepath for error template, relative to web application root directory
tools.view.servlet.error.template = error.vm
# Directory for layout templates, relative to web application root directory
tools.view.servlet.layout.directory = /
# Filepath of the default layout template
# relative to the layout directory
# NOT relative to the root directory of the webapp!
tools.view.servlet.layout.default.template = default.vm
以上是velocity.properties 存放與web-inf下
velocity
org.apache.velocity.tools.view.VelocityViewServlet
org.apache.velocity.toolbox
/WEB-INF/tools.xml
org.apache.velocity.properties
/WEB-INF/velocity.properties
velocity
*.vm
index.vm
以上是web.xml
$screen_content
呵呵的部分
以上是default.vm
#set($page_title="Layout Test")
#set($layout="default.vm" )
$t.getMessage()
velocity調(diào)用java方法二
1, 注釋?zhuān)魏我环N語(yǔ)言中,注釋總是必不可少的。
(1) 單行注釋?zhuān)?/p>
## 這是單行注釋
(2) 多行注釋?zhuān)?/p>
#*
這是多行注釋
*#
2, 輸出,也就是數(shù)據(jù)展現(xiàn)。
$userName
這樣便可以輸出用戶(hù)名了。但是,并不是絕對(duì)的能夠輸出用戶(hù)名,因?yàn)榭赡苓@里輸出的變量并不存在。如果userName這個(gè)變量不存在,或者為空,$userName將會(huì)被當(dāng) 作字符串直接輸出,也就是當(dāng)我們期望在userName為空的時(shí)候輸出空,但是卻輸出了’$userName’。為了避免這種情況,推薦這樣的變量輸出寫(xiě)法:
$!{userName}
3, 變量聲明與賦值
一般情況下,我們不推薦在html頁(yè)面中直接聲明Velocity變量,因?yàn)檫@會(huì)增加html界面的復(fù)雜度。如果確實(shí)有必要,可以使用下面的語(yǔ)句聲明變量并賦值:
#set($userName=’hanmeimei’)
請(qǐng)注意:Velocity的變量聲明都要帶著$符號(hào)。
在LML中,我們經(jīng)常在所謂的后臺(tái),也就是Action中給變量賦值,這樣在Action對(duì)應(yīng)的html模板中也可以直接使用該變量??墒褂靡幌聝煞N方法:
(1) 傳統(tǒng)的getter/setter
(2) ViewBag.Add(key,value)
相比之下,第二種非傳統(tǒng)的方式更快速。
4, 算術(shù)運(yùn)算
Velocity支持在模板中使用(+,—,*,/),例如:
#set($a=1)
#set($b=1)
#set($c=$a + $b)
C在算對(duì)的情況下等于2,算錯(cuò)的情況下等于3.。有一個(gè)問(wèn)題大家需要注意,我在使用四則運(yùn)算的時(shí)候,發(fā)現(xiàn)’—‘不起作用,最后經(jīng)過(guò)嘗試,發(fā)現(xiàn)需要在變量和運(yùn)算符之 間留一個(gè)空格,這樣就沒(méi)問(wèn)題了。如果,你也遇到這樣的問(wèn)題,也可以這么嘗試一下。
5, 邏輯運(yùn)算
支持一下幾個(gè)運(yùn)算符,就如同java一樣:
&&:與。
||:或。
!:非。
6, 迭代
#foreach ($item in $list)
這是第 $velocityCount 個(gè)元素: $item
#end
$velocityCount,表示當(dāng)前序號(hào)。
還要說(shuō)一下我們?cè)贚ML中分頁(yè)顯示數(shù)據(jù)用到的迭代,如下:
#foreach($item in $pager.result.rows)
$item.userName
##以下兩種方式可迭代列
#set($row=$item.values().toArray())
##方式1
#foreach($a in $row) $!a #end
##方式2
#foreach($i in [0..2]) $row.item($i) #end
#end
$pager.result是在分頁(yè)Action中查詢(xún)到的一個(gè)數(shù)據(jù)集Result。
我們也可以在模板中直接聲明并賦值一個(gè)list,而后進(jìn)行迭代:
#set( $list = ["a", "b", "c"])
#foreach ($item in $list)
$velocityCount
#end
還有一種情況,我們需要迭代從1到10,所有的整數(shù):
#foreach ($item in [1..10])
$velocityCount
#end
注意中間就是兩個(gè)點(diǎn)。
查閱很多資料,都直接說(shuō)明Velocity不能迭代數(shù)組,下面說(shuō)明原因:
對(duì)數(shù)組的訪(fǎng)問(wèn)在Velocity中存在問(wèn)題,因?yàn)閂elocity只能訪(fǎng)問(wèn)對(duì)象的方法,而數(shù)組又是一個(gè)特殊的Array,所以雖然數(shù)組可以進(jìn)行循環(huán)列舉,但卻不能定位訪(fǎng)問(wèn)特定位置 的 元素,如 strs[2],數(shù)組對(duì)固定位置元素的訪(fǎng)問(wèn)調(diào)用了Array的反射方法get(Object array, int index),而Velocity沒(méi)能提供這樣的訪(fǎng)問(wèn),所以數(shù)組要么改成List等其他類(lèi)容器的方式來(lái)包裝,要么就通過(guò)公用Util類(lèi)的方式來(lái)提供,傳入數(shù)組對(duì)象和要訪(fǎng)問(wèn)的位置參數(shù),從而達(dá)到返回所需值的目的。
Velocity支持迭代的數(shù)據(jù)類(lèi)型有:Vector、Hashtable或者Array
7, 條件判斷
#if (條件1)
#elseif (條件2)
#else
#end
一直不是很理解Velocity的數(shù)據(jù)類(lèi)型,所以在項(xiàng)目中最多使用的是String,就像這里的條件表達(dá)式,我們經(jīng)常這樣寫(xiě): if(“$!{userSex}”==”0”),雖然性別使用int表示。
8, 文件引入,#include與#parse
兩者作用類(lèi)似,但是有以下不同:
(1) 與#include不同的是,#parse只能指定單個(gè)對(duì)象。而#include可以有多個(gè)
如果您需要引入多個(gè)文件,可以用逗號(hào)分隔就行:
#include ("a.gif", "b.txt", "c.htm" )
在括號(hào)內(nèi)可以是文件名,但是更多的時(shí)候是使用變量的:
#include ( “a.txt”, $photo )
(2) #include被引入文件的內(nèi)容將不會(huì)通過(guò)模板引擎解析;
而#parse引入的文件內(nèi)容Velocity將解析其中的velocity語(yǔ)法并移交給模板,意思就是說(shuō)相當(dāng)與把引入的文件copy到文件中。
以上兩點(diǎn)摘自互聯(lián)網(wǎng),到目前我基本沒(méi)有使用過(guò)#include。#parse最大的用處或許是這樣用:
#parse(“title.html”)
類(lèi)似layout。
9, 內(nèi)置對(duì)象
Velocity內(nèi)置了一些對(duì)象,在模版里可以直接調(diào)用,列舉如下:
$request、$response、$session
這些一直也沒(méi)使用過(guò),完全可以在Action頁(yè)面把各種對(duì)象處理好了。
基本上,在我們的一般開(kāi)發(fā)中,掌握以上語(yǔ)法已經(jīng)可以應(yīng)付自如了。是不是很簡(jiǎn)單呢,我們希望的不就是簡(jiǎn)單嗎,簡(jiǎn)單所以快。寫(xiě)的不好,敬請(qǐng)見(jiàn)諒。
補(bǔ)充:
LML支持在html模板中直接調(diào)用java方法,并可以向方法傳遞參數(shù)(字面值,或者Velocity變量),還可以輸出方法的返回值。當(dāng)然,為了避免模板頁(yè)面過(guò)于復(fù)雜,我們還是應(yīng)該盡量減少在模板中調(diào)用java方法。如果確實(shí)有必要調(diào)用,則需要現(xiàn)在模板頁(yè)面對(duì)應(yīng)的Action類(lèi)上先行聲明:
@Helper( { TestHelper.class })
這樣就可以在html模板中調(diào)用:
$!TestHelper.Test("$!{userName}")
JAVA語(yǔ)言特點(diǎn)
1.簡(jiǎn)單性
Java看起來(lái)設(shè)計(jì)得很像C++,但是為了使語(yǔ)言小和容易熟悉,設(shè)計(jì)者們把C++語(yǔ)言中許多可用的特征去掉了,這些特征是一般程序員很少使用的。例如,Java不支持go to語(yǔ)句,代之以提供break和continue語(yǔ)句以及異常處理。Java還剔除了C++的操作符過(guò)載(overload)和多繼承特征,并且不使用主文件,免去了預(yù)處理程序。因?yàn)镴ava沒(méi)有結(jié)構(gòu),數(shù)組和串都是對(duì)象,所以不需要指針。Java能夠自動(dòng)處理對(duì)象的引用和間接引用,實(shí)現(xiàn)自動(dòng)的無(wú)用單元收集,使用戶(hù)不必為存儲(chǔ)管理問(wèn)題煩惱,能更多的時(shí)間和精力花在研發(fā)上。
2.面向?qū)ο?/p>
Java是一個(gè)面向?qū)ο蟮恼Z(yǔ)言。對(duì)程序員來(lái)說(shuō),這意味著要注意應(yīng)中的數(shù)據(jù)和操縱數(shù)據(jù)的方法(method),而不是嚴(yán)格地用過(guò)程來(lái)思考。在一個(gè)面向?qū)ο蟮南到y(tǒng)中,類(lèi)(class)是數(shù)據(jù)和操作數(shù)據(jù)的方法的集合。數(shù)據(jù)和方法一起描述對(duì)象(object)的狀態(tài)和行為。每一對(duì)象是其狀態(tài)和行為的封裝。類(lèi)是按一定體系和層次安排的,使得子類(lèi)可以從超類(lèi)繼承行為。在這個(gè)類(lèi)層次體系中有一個(gè)根類(lèi),它是具有一般行為的類(lèi)。Java程序是用類(lèi)來(lái)組織的。
Java還包括一個(gè)類(lèi)的擴(kuò)展集合,分別組成各種程序包(Package),用戶(hù)可以在自己的程序中使用。例如,Java提供產(chǎn)生圖形用戶(hù)接口部件的類(lèi)(java.awt包),這里awt是抽象窗口工具集(abstract windowing toolkit)的縮寫(xiě),處理輸入輸出的類(lèi)(java.io包)和支持網(wǎng)絡(luò)功能的類(lèi)(java.net包)。
3.分布性
Java設(shè)計(jì)成支持在網(wǎng)絡(luò)上應(yīng)用,它是分布式語(yǔ)言。Java既支持各種層次的網(wǎng)絡(luò)連接,又以Socket類(lèi)支持可靠的流(stream)網(wǎng)絡(luò)連接,所以用戶(hù)可以產(chǎn)生分布式的客戶(hù)機(jī)和服務(wù)器。
網(wǎng)絡(luò)變成軟件應(yīng)用的分布運(yùn)載工具。Java程序只要編寫(xiě)一次,就可到處運(yùn)行。
4.編譯和解釋性
Java編譯程序生成字節(jié)碼(byte-code),而不是通常的機(jī)器碼。Java字節(jié)碼提供對(duì)體系結(jié)構(gòu)中性的目標(biāo)文件格式,代碼設(shè)計(jì)成可有效地傳送程序到多個(gè)平臺(tái)。Java程序可以在任何實(shí)現(xiàn)了Java解釋程序和運(yùn)行系統(tǒng)(run-time system)的系統(tǒng)上運(yùn)行。
在一個(gè)解釋性的環(huán)境中,程序開(kāi)發(fā)的標(biāo)準(zhǔn)“鏈接”階段大大消失了。如果說(shuō)Java還有一個(gè)鏈接階段,它只是把新類(lèi)裝進(jìn)環(huán)境的過(guò)程,它是增量式的、輕量級(jí)的過(guò)程。因此,Java支持快速原型和容易試驗(yàn),它將導(dǎo)致快速程序開(kāi)發(fā)。這是一個(gè)與傳統(tǒng)的、耗時(shí)的“編譯、鏈接和測(cè)試”形成鮮明對(duì)比的精巧的開(kāi)發(fā)過(guò)程。
猜你感興趣: