gdufo

           

          Struts2與Velocity模板

          Velocity是一種基于JAVA的模板引擎,開(kāi)發(fā)人員使用簡(jiǎn)單的模板語(yǔ)言就可以快速開(kāi)發(fā)顯示層,它使得顯示層與程序代碼分離,在早期的Webwork版本中,所有UI標(biāo)簽均使用Velocity模板引擎生成,可以在Struts-core-2.0.8.jar中找到template文件夾,其中的archive文件夾下存放著原有的vl文件!

          Struts2中查找vm文件的順序先查找Web應(yīng)用程序,再查找類(lèi)路徑。如果你需要使用vm作為顯示層,只需要在配置文件中指定resulttype屬性為velocity,然后將<param>location屬性指定到一個(gè)以vm結(jié)尾的資源上就可以了!

          1.Struts2中的Velocity中文亂碼的處理方式:

          因?yàn)樵?/span>Velocity-1.4.jar中的org.apache.velocity.runtime.defaults中定義的velocity.properties中定義的input.encoding=ISO8859-1output.encoding=ISO8859-1,通常最好在VM文件中使用%{getText(‘’)}調(diào)用國(guó)際化資源文件的內(nèi)容就不會(huì)產(chǎn)生亂碼。

          2.Velocityvm文件必須要經(jīng)過(guò)Action才可以訪(fǎng)問(wèn),以便被程序解析,不可以直接訪(fǎng)問(wèn)vm文件。

          3.vm文件中使用Struts2的標(biāo)簽只需要在原有標(biāo)簽前加#s就可以了,參數(shù)之間使用””分隔!

          (1.)例如下面是一個(gè)表單的定義:

          #sform(“action=Student” namespace=”/ilkj/student”)

                 #stextfield(“label=%{getText(‘student.label.name’)}” “name=student.name”)

                 #spassword(“label=%{getText(‘student.label.password’)} ” name=student.age”)

                 #ssubmit(“value=getText(‘globale.label.submit’)”)

          #end

          (2.)下面是取出session中的一個(gè)參數(shù)的值

          #sproperty(“value=#session.information” “default=noValue”)

          (3.)下面是訪(fǎng)問(wèn)Action中的屬性

          ${student.name},當(dāng)然你也可以簡(jiǎn)單寫(xiě)成$student.name的形式。

          4.Velocity的內(nèi)建變量:

          stack---ValueStack,可以使用${stack.findString(‘OGNL表達(dá)式’)}取值

          action---最近執(zhí)行的Action,例如${action.getStudent().getName()}或者也可以直接寫(xiě)${action.student.name}

          response---HttpServletRequest

          request---HttpServletResponse

          session---HttpSession

          application---ServletContext

          base---生成應(yīng)用的上下文,相當(dāng)與request.getContextPath()

          5.注釋語(yǔ)法

          (1.)單行注釋?zhuān)?/span>##

          (2.)多行注釋?zhuān)?/span>#* ... ... *#

          6.暫停執(zhí)行

          #stop---停止執(zhí)行后面的模板內(nèi)容

          7.轉(zhuǎn)義字符

          Velocity使用 \ 轉(zhuǎn)義字符,例如email被定義為andrew830314@163.com#set($email=’andrew830314@163.com’)),你還想輸出$email而不被Velocity解析,那么你可以使用 \$email

          8.引入其他文件

          #include(“”),如果是JSP或者vm文件將會(huì)顯示內(nèi)容,其他文本文件顯示文本,二進(jìn)制會(huì)顯示亂碼,引入多個(gè)文件使用 , 間隔,#parse(“”)引入一個(gè)本地的vm文件,與#include(“”)不同,#parse(“”)只能引入一個(gè)文件,并且#parse(“”)可以訪(fǎng)問(wèn)父模板里的變量。

          9.模板代碼復(fù)用

          #macro(代碼段名稱(chēng) $參數(shù)1 ... ...)

                 ... ...

          #end

          只要使用#代碼段名稱(chēng)($參數(shù)1 ... ...)就可以使用這段代碼,當(dāng)然你也可以不使用任何參數(shù)

          10.判斷語(yǔ)句

          #if(邏輯表達(dá)式)

          注意:在Velocity中使用==判斷兩個(gè)變量是否相等,而不是使用equals(“”)方法。

          #else

          #end

          從上面我們還可以總結(jié)出,Velocity模板引擎使用#表示一種命令,例如#set是給某個(gè)變量設(shè)置值,使用$引用變量,使用()表示參數(shù),使用{}表示作用范圍。

          另外需要注意的時(shí)候,Velocity只會(huì)按照gettXXX()解析變臉變量,例如student.name實(shí)際上找到的student.getName()方法,你可以試著在Action寫(xiě)一個(gè)變量而不使用getXXX()方法,看看會(huì)不會(huì)在vm中取到值,答案是變量會(huì)被原樣輸出。

          Velocity使用的都是對(duì)象,即使你定義#set ($count=1)也會(huì)被包裝成Integer使用。

          另外,修改vm文件需要重新啟動(dòng)服務(wù)器,如果在開(kāi)發(fā)階段,我們可以設(shè)置struts.properties中的struts.devMode=true避免每次重新啟動(dòng)服務(wù)器。

          最后我們思考一下,如果貨幣$2.95會(huì)被Velocity引擎直接輸出,還是去查找2.95這個(gè)變量?如果你在思考這個(gè)問(wèn)題,說(shuō)明你的JAVA基礎(chǔ)不過(guò)關(guān)哦!因?yàn)?/span>JAVA中的變量不能以數(shù)字開(kāi)頭的哦!因此你不必?fù)?dān)心貨幣$2.95會(huì)被當(dāng)作變量解析!另外,如果Velocity引擎未找到變量也會(huì)原樣輸出,例如${student.name}如果未找到會(huì)直接原樣輸出,這也是為什么我們直接訪(fǎng)問(wèn)JSP的時(shí)候會(huì)看到大量的${}被原樣輸出。如果變量不存在,你想讓它不輸出,可以這樣寫(xiě)$!{}

          posted on 2008-06-29 19:34 gdufo 閱讀(7386) 評(píng)論(1)  編輯  收藏 所屬分類(lèi): Struts2

          評(píng)論

          # re: Struts2與Velocity模板 2009-11-24 14:38 joken

          我有一個(gè)form,要用到struts2的form.
          #macro(dispModyForm $actionname $formname $validatebool $update)
          #sform("action=$actionname" "name=$formname" "validate=$validatebool")
          sssssssss
          #end
          #end

          這樣可以調(diào)用,但如果我只想對(duì)<form>定義模板,不想</form>也在模板里,如何定義?  回復(fù)  更多評(píng)論   

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(6)

          隨筆分類(lèi)

          隨筆檔案

          文章分類(lèi)

          文章檔案

          收藏夾

          Hibernate

          友情鏈接

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 临清市| 锦州市| 岑巩县| 新竹市| 光泽县| 和平县| 海南省| 临高县| 曲麻莱县| 合水县| 眉山市| 册亨县| 临海市| 阿合奇县| 大渡口区| 错那县| 门源| 会泽县| 彩票| 新蔡县| 体育| 延津县| 武定县| 喀喇沁旗| 阿坝县| 绥江县| 旅游| 马公市| 奈曼旗| 阜宁县| 富锦市| 通城县| 平远县| 岳阳县| 福建省| 抚远县| 赤城县| 沙坪坝区| 郸城县| 沈阳市| 云浮市|