成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Velocity官方指南-使用Velocity

移動開發
如果你使用的是VelocityViewServlet或者其他的web框架,你不會直接調用到Velocity。但是,如果在非web的應用中或者自己編寫的web框架時,你將會像上面說的基本流程一樣直接調用到Velocity 引擎。另外一個需要記住的重點是,必須在使用Velocity合并模版之前,初始化Velocity引擎。

[[143748]]

如果你使用的是VelocityViewServlet或者其他的web框架,你不會直接調用到Velocity。但是,如果在非web的應用中或者自己編寫的web框架時,你將會像上面說的基本流程一樣直接調用到Velocity 引擎。另外一個需要記住的重點是,必須在使用Velocity合并模版之前,初始化Velocity引擎。

Velocity輔助類

Velocity中包含一個叫做Velocity( org.apache.velocity.app.Velocity )的應用工具類。這個類的主要是提供一些初始化Velocity時必須的方法,以及簡化Velocity使用的一些常規方法。這個在工程的javadoc中有描述,可通過閱讀javadoc來獲取更詳細的說明。本篇文檔只是教程;所以,如果需要了解完整的API信息,javadoc是你***的選擇。

Velocity運行時引擎是為在同一個jvm中的其他使用者提供資源獲取,日志記錄等其他服務的單個實例。因此,運行時引擎只會初始化一次。你可以嘗試初始化多次,但是只有***次是有效的,后面的初始化操作都會被忽略。Velocity工具類提供了五個用來配置運行時引擎的方法。

這五個配置方法如下:

  • setProperty( String key, Object o )
    設置屬性鍵key對應屬性值為o。值通常為字符串,在特殊情況下也可以是逗號分隔的一串值(如”foo,bar,woogie”),當然也可以其他值。
  • Object getProperty( String key )
    獲取屬性鍵key對應的值。需要注意的是返回值的類型,不僅僅只是字符串類型
  • init()
    使用jar包中的默認properties文件中配置的屬性初始化運行時引擎
  • init(Properties p)
    使用類型為java.util.Properties參數出入的屬性來初始化運行時引擎
  • init( String filename )
    使用文件名為filename的properties文件中的屬性值初始化運行時引擎

需要注意的是,在上面的這五個方法中,默認的properties是基礎的配置,額外的properties是用來替換默認配置中對應的屬性。沒有被替換的默認屬性還將繼續發揮作用。這有利于你只需替換你感興趣的,而不需要整個都替換掉。

另外需要注意的是,init() 方法可以在應用中被調用多次,這并不會帶來其他影響。但是只有在***調用時的引擎配置才會生效,后面調用的init()使用的配置都會被忽略。

最常見的初始化Velocity的方式,通常如下:
1 按照org/apache/velocity/runtime/defaults/velocity.properties 文件中的格式配置你需要替換的屬性,放在文件中或者放到java.util.Properties中,然后調用init(filename) 或者 init(Properties)
2 通過setProperty() 方法設置單個的配置項,然后調用initial()。 這種方法通常在擁有自己的配置管理系統的高層應用中。例如,允許應用基于運行時產生的值來配置Velocity

一旦運行時引擎初始化完成,你就可以進行任何你想做的了。當然,主要還是圍繞著渲染模板輸出內容到輸出流中,Velocity輔助類中的一些方法可以幫你輕松搞定,下面是這些方法以及他們做的事情的簡要描述:

  • evaluate( Context context, Writer out, String logTag, String instring )
  • evaluate( Context context, Writer writer, String logTag, InputStream instream )這些方法使用傳入的contexxt對象渲染一個輸入,輸出到Writer中;輸入的內容可以是一個字符串或者一個InputStram。這個方法經常用在替換字符串中的標記、渲染模板內容保存在數據庫中或其他的非文具的存儲中,或者動態生成內容時。
  • invokeVelocimacro( String vmName, String namespace, String params[], Context context, Writer writer )
    通過這個方法可以直接調用到Velocity宏,也可以通過上面的evalutae()方法調用。你只需要給你的vm模板取一個名字,創建一個提供給vm使用的數組,一個包含數據的context,以及用于輸出內容的Writer。需要注意的是這里說的提供給vm使用的數組中的元素只能是context中有的key,而不是其他用作參數傳入vm的字符串。這點在后面的版本有可能修改。
  • mergeTemplate( String templateName, Context context, Writer writer )通過這個方法可以非常方便的調用到Velocity提供的模板出來和渲染的功能。這個方法會讀取和渲染模板。文件加載器會根據你設置的properties的設置來加載模板內容,所以可以Velocity提供的文件處理的優勢以及預解析模板緩存的優勢。
  • boolean templateExists( String name )判斷當前配置的資源加載起能否都讓渠道名為name的模板文件。

通過上面的文檔,我們已經清楚了這些基礎的輔助方法,現在就可以地編寫使用Velocity的java程序了:

  1. import java.io.StringWriter; 
  2. import org.apache.velocity.app.Velocity; 
  3. import org.apache.velocity.VelocityContext; 
  4.   
  5. public class Example2 
  6.     public static void main( String args[] ) 
  7.     { 
  8.         /* 首先,初始化運行時引擎,使用默認的配置 */ 
  9.   
  10.         Velocity.init(); 
  11.   
  12.         /* 創建Context對象,然后把數據放進去 */ 
  13.   
  14.         VelocityContext context = new VelocityContext(); 
  15.   
  16.         context.put("name""Velocity"); 
  17.         context.put("project""Jakarta"); 
  18.   
  19.         /* 渲染模板 */ 
  20.   
  21.         StringWriter w = new StringWriter(); 
  22.  
  23.         Velocity.mergeTemplate("testtemplate.vm", context, w ); 
  24.         System.out.println(" template : " + w ); 
  25.   
  26.         /* 渲染字符串 */ 
  27.   
  28.         String s = "We are using $project $name to render this."
  29.         w = new StringWriter(); 
  30.         Velocity.evaluate( context, w, "mystring", s ); 
  31.         System.out.println(" string : " + w ); 
  32.     } 

在運行程序之前,我們需要把模板文件testtemplate.vm放到與程序相同的目錄下(因為我們使用默認配置,默認配置中指定的模板加載路徑就是程序的當前目錄)。運行上面代碼后,將會輸出:

template : Hi! This Velocity from the Jakarta project.
string : We are using Jakarta Velocity to render this.

模板文件testtemplate.vm文件的內容是:

Hi! This $name from the $project project.

好了,上面就是我們使用Velocity渲染模板需要做的事情了。在代碼中沒有必要既調用mergeTemplate()又調用evaluate(),這里只是為了演示才同時使用了。你一般只需要使用其中一個方法就夠了。但是到底調用一個還是兩個,需要根據你程序的具體要求確定。

這里看起來與文章最開始描述的 基本流程 有一些差別,但實際是他們是相同的。首先,你還是需要先創建一個context,放進你需要的數據。上面描述的例子中不同的是使用了mergeTemplate()方法,mergeTemplate()方法調用了底層的Runtime類中的方法加載了模板,然后合并內容。在上面的第二個例子中,通過字符串動態創建模板,這個操作就類同于基本模式中的選擇模板的操作;后面的merge()方法就調用了底層的方法來合并模板內容。

所以上面的例子跟文章開始描述的 基本流程 是一樣,只不過這里的一些工具方法做了那些重復的苦力活;同時也演示了除了從模板文件中獲取模板內容外,你也可以動態的創建模板內容。

異常

Velocity在解析和合并模板的過程中可能會拋出異常。這些異常都繼承RuntimeException,所以沒有顯式捕獲的必要,每一種異常都包含了特定的屬性以提供給***的調用者來獲知異常的具體信息。這些異常類都放在了org.apache.velocity.exception包下,有如下幾種:

1. ResourceNotFoundException
當資源管理系統找不到請求的相應資源時拋出。
2. ParseErrorException
在解析Velocity模板語法是出現錯誤時拋出
3.TemplateInitException
在模板解析的***個階段拋出,提示Velocity宏或者指令初始化時出現的錯誤
4.MethodInvocationException
在渲染模板時調用Context中某個對象的方法是出現錯誤時拋出。該異常包裝了調用對象的方法拋出的異常并傳遞給應用,讓你能夠在運行時處理這些對象中的問題。

在每次拋出上面的這些異常時都會記入到運行日志中。可通過閱讀javadoc api 文檔了解更多詳細信息。

其他細節

雖然上面的代碼中使用的是默認屬性,但是設置自定義的屬性也是非常簡單的。你需要做的就是創建一個properties文件,在文件中添加你需要自定義的屬性,然后傳遞文件的路徑給Velocity工具類中的init(String)方法;或者創建一個java.util.Poperties 對象,往這個對象中自定義的屬性,然后傳遞給Velocity工具類的init(Properties)方法。后一種方式顯得靈活些,因為你可以通Properties的load()方法加載一個properties文件,更好的是你應用或框架中動態傳入運行時設置的屬性。你可以方便的將應用用到的所有屬性組合放到一個properties文件中。

如果你想從其他目錄而非當前目錄中加載模板文件,我們可以通過下面這種方式來完成

  1. ... 
  2.  
  3. import java.util.Properties; 
  4.  ... 
  5.  
  6. public static void main( String args[] ) 
  7.     /* 首先,我們還是初始化運行時引擎  */ 
  8.   
  9.     Properties p = new Properties(); 
  10.     p.setProperty("file.resource.loader.path", "/opt/templates"); 
  11.     Velocity.init( p ); 
  12.   
  13.  ... 

為了能順利運行上面的代碼,你需要有一個 /opt/templates 目錄,并且把文件testtemplate.vm放到該目錄下。如果你按照上面的做了,還是出現問題,可以查看velocity.log文件確定具體原因,畢竟閱讀錯誤日志是你定位問題的不二選擇。

  1. ... 
  2.   
  3.    VelocityEngine velocityEngine = new VelocityEngine(); 
  4.    ExtendedProperties eprops = null
  5.    if (props==null) { 
  6.       eprops = new ExtendedProperties(); 
  7.    } else { 
  8.       eprops = ExtendedProperties.convertProperties(props); 
  9.    } 
  10.   
  11.    // 現在,我們用一個對象實例來設置屬性 
  12.    eprops.setProperty("name", object); 
  13.   
  14.    ... 
  15.    velocityEngine.setExtendedProperties(eprops); 
  16.    velocityEngine.init(); 
  17.    ... 

你可以考慮嘗試使用下面章節描述的[應用屬性]特性。

責任編輯:倪明 來源: 并發編程網
相關推薦

2012-11-20 11:26:19

Velocity Ch

2011-11-30 10:28:43

Velocity Ch

2011-12-09 14:43:55

O'Reilly VeCompuwaredynaTrace

2014-04-30 12:04:43

Velocity.js模板引擎

2015-08-12 19:31:46

性能魔方

2012-12-13 14:39:13

Velocity

2011-10-26 10:43:19

Sencha Touc

2012-01-10 13:21:33

Sencha Touc使用data包

2011-10-26 10:21:40

Sencha Touc組件

2016-12-07 10:41:03

2015-09-18 14:07:34

O'Reilly Me

2011-10-26 10:32:05

Sencha Touc數據視圖

2012-12-24 10:42:05

IT技術周刊

2011-06-17 16:23:49

Cocoa蘋果

2014-08-17 14:36:22

基調網絡mAPM

2011-06-17 15:57:46

CocoaXcode蘋果

2017-01-09 09:51:08

微信小程序

2017-06-30 09:36:10

Android OAPI兼容

2011-06-15 17:02:02

CocoaiOS

2011-11-04 10:22:43

Java Mail
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久精品二区 | 曰韩一二三区 | 成人免费视频在线观看 | 熟女毛片| 欧美久久久久久久久 | 成人av色 | 99精品国自产在线 | 国产丝袜av| 性欧美精品一区二区三区在线播放 | 欧美一级在线观看 | 一级做a| 欧美精品日韩精品国产精品 | 一区二区三区不卡视频 | 日本小电影在线 | 99re在线视频免费观看 | 亚洲二区在线观看 | 成人午夜精品 | 在线视频一区二区 | 毛片黄片 | 97色伦网 | 成人美女免费网站视频 | 麻豆久久久9性大片 | 欧美性一区二区三区 | 国产一区二区三区 | 午夜精品一区 | 亚洲精品自拍视频 | 青青草久久 | 亚洲精品一区二区三区四区高清 | 玖玖视频国产 | 黄频视频 | 免费成人在线网站 | 久久国产区 | 欧美中文字幕一区二区 | 欧美性一区二区三区 | 一级毛片中国 | 免费高清av | 欧美精品久久久久久久久久 | 在线a视频 | 久久激情视频 | 精品乱码一区二区三四区视频 | 国产一区二区在线观看视频 |