<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-193  評論-715  文章-1  trackbacks-0
    作者:張明星? 2006.04.12.? MSN:fastzch(at)hotmail.com
    題外話:感謝開源精神,如果不是她,我今天可能就不會如此順利的找到解決問題的方法。

    Velocity主要是一個在MVC框架中解決View層問題的框架,其模版功能十分之強(qiáng)大,可以用來做很多事情,據(jù)傳曾有人用這個來生成程序,還有生成JSP文件等,不過后來也發(fā)現(xiàn)這樣做的維護(hù)開銷極大,而且畢竟沒有人那多智能。但是在View層做一些改進(jìn)還是很好的,雖然我并沒有拿她來做這樣的事,但是從我用她來實(shí)現(xiàn)其它的功能便可感受到。
    我見過的使用Velocity較好的項(xiàng)目有DLOG4J(中文官方網(wǎng)站為:http://www.javayou.com/main.jspe?cat_id=7),天乙BBS(http://www.laoer.com/)等,大家有興趣的話可以去看看。

    我用Velocity主要是在項(xiàng)目中做為生成各類系統(tǒng)MAIL的template,所以在使用的時候雖然是在WEB應(yīng)用中,但是并不是做為View層的模版,也不用在web.xml文件中加一堆配置,但是問題隨之也產(chǎn)生了。

    Velocity讀取模版文件的方式采用的是File類,每次都會自動將我們給出的模版的相對路徑解析成一個絕對路徑,然后再用File類讀入,這如果對于一個本地運(yùn)行的Application來說不會有太大的問題(存在的問題就是模版文件不能一起打包在.JAR文件中,只能放在JAR包的外面,具體位置為與JAR包同一目錄下)。這樣的方式,對于WEB應(yīng)用中的相當(dāng)于資源文件的方式來說簡直就是一種災(zāi)難,無論是將這些文件放在classes目錄下,還是放在lib目錄下,都會找不到資源文件。

    無奈之下,我只好跟進(jìn)Velocity的源碼,一看究竟。經(jīng)過一翻追蹤,發(fā)現(xiàn)模版文件的加載主要由FileResourceLoader這個類來搞定,而且加載模版文件的實(shí)現(xiàn)十分繁雜(主要是方法間的調(diào)用讓人看得極為眼花),最終使用的方法如下:
    ?1?private?InputStream?findTemplate(String?path,?String?template)
    ?2?????{
    ?3?????????try
    ?4?????????{
    ?5?????????????File?file?=?new?File(?path,?template?);
    ?6?????????????if?(?file.canRead()?)
    ?7?????????????{
    ?8?????????????????return?new?BufferedInputStream(
    ?9?????????????????????new?FileInputStream(file.getAbsolutePath()));
    10?????????????}
    11?????????????else
    12?????????????{
    13????????????????return?null;
    14???????????}
    15?????????}
    16?????????catch(?FileNotFoundException?fnfe?)
    17?????????{
    18?????????????/*
    19??????????????*??log?and?convert?to?a?general?Velocity?ResourceNotFoundException
    20??????????????*/
    21?????????????return?null;
    22?????????}
    23?????}
    在這段code中,關(guān)鍵所在即為?File?file?=?new?File(?path,?template?),所以如果在web應(yīng)用中運(yùn)行的話,非把文件放到運(yùn)行時系統(tǒng)所處的相對路徑下才能成功,這對于WEB的部署帶來的也是災(zāi)難性的后果。
    我曾試著在上面這段code的第5行下面用file.getAbsolutePath()得到其絕對路徑,作為Application運(yùn)行的時候,得到的是項(xiàng)目所在的工作目錄,而我在Web應(yīng)用環(huán)境下得到的結(jié)果卻讓我大吃一驚,結(jié)果居然是:c:\windows\system32(我采用的平臺是WinXP+Tomcat5.0.28)。各位看官,到此是不是令你咋舌了?你一定也會覺得這有些不可思議,這樣的結(jié)果弄得跟系統(tǒng)都變得相關(guān)了。

    經(jīng)過一番分析發(fā)現(xiàn)有一個極其簡單的解決辦法(或許我總是喜歡用簡單的辦法解決問題,這可能也是受XP的影響),將上面的代碼改為如下:
    ?1?????private?InputStream?findTemplate(String?path,?String?template)
    ?2?????{
    ?3?????????try
    ?4?????????{
    ?5?????????????File?file?=?new?File(?path,?template?);
    ?6?
    ?7?//????????????System.out.println(file.getAbsolutePath());//for?test
    ?8?//????????????System.out.println(template);
    ?9?????????????if?(?file.canRead()?)
    10?????????????{
    11?????????????????return?new?BufferedInputStream(
    12?????????????????????new?FileInputStream(file.getAbsolutePath()));
    13?????????????}
    14?????????????else
    15?????????????{
    16????????????????//?return?null;//before?modified.
    17?
    18????????????????????return?this.getClass().getClassLoader().getResourceAsStream(template);
    19?????????????}
    20?????????}
    21?????????catch(?FileNotFoundException?fnfe?)
    22?????????{
    23?????????????/*
    24??????????????*??log?and?convert?to?a?general?Velocity?ResourceNotFoundException
    25??????????????*/
    26?????????????return?null;
    27?????????}
    28?????}

    看看,是不是超級簡單。
    Compile,打包,搞定!

    經(jīng)過測試,現(xiàn)在無論是將模版文件一起打包到JAR包中還是放到Classes目錄下均可。

    PS:將模版文件用作View層的Web應(yīng)用沒有測試過,有興趣的朋友可以幫我測一把。謝謝! 如有錯誤,歡迎指正。
    posted on 2006-04-12 19:54 Robin's Programming World 閱讀(3154) 評論(5)  編輯  收藏 所屬分類: Java

    評論:
    # re: Velocity改造心得 2006-04-12 21:15 | BlueDavy
    嗯?Velocity本來就有一個ClasspathResourceLoader的配置的....  回復(fù)  更多評論
      
    # re: Velocity改造心得 2006-04-13 08:48 | zhyiwww
    是呀本來就是這樣的,不然的話在發(fā)布到web之后,回出現(xiàn)找不到文件的異常,
    哈哈:)  回復(fù)  更多評論
      
    # re: Velocity改造心得 2006-04-13 08:50 | zhyiwww
    其實(shí)你也可以將模版打包進(jìn)去,然后通過這種方法進(jìn)行讀取,我想應(yīng)該也是可以的,你可以試一下.
      回復(fù)  更多評論
      
    # re: Velocity改造心得 2006-04-13 09:09 | Robin's Java World
    呵呵,弄了半天看來精力是白費(fèi)了的。
    看來還是應(yīng)該去好好看看官方的文檔。

    謝謝大家的指正!  回復(fù)  更多評論
      
    # re: Velocity改造心得 2007-10-19 17:25 | 行者吳江
    public class VelocityTest {

    public static void main(String[] args) throws Exception {
    VelocityEngine ve=new VelocityEngine();
    ve.setProperty(Velocity.RESOURCE_LOADER, "class");
    ve.setProperty("class.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
    ve.init();
    Template t=ve.getTemplate("templates/test/test.vm");
    StringWriter writer = new StringWriter();
    VelocityContext context = new VelocityContext();
    t.merge(context, writer);
    System.out.println(writer.toString());
    }
    }  回復(fù)  更多評論
      
    主站蜘蛛池模板: 国产成人yy免费视频| 亚洲视频在线免费看| 亚洲精品成人av在线| 成人免费夜片在线观看| 啦啦啦中文在线观看电视剧免费版| 国产AV无码专区亚洲Av| 一区二区免费国产在线观看| 亚洲欧洲校园自拍都市| 亚洲无砖砖区免费| 777亚洲精品乱码久久久久久 | 久久国产乱子伦免费精品| 久久久久噜噜噜亚洲熟女综合| 国产精品亚洲色图| 亚洲国产精品成人| 成全动漫视频在线观看免费高清版下载 | 亚洲免费观看在线视频| 激情亚洲一区国产精品| 日韩免费视频播放| 国产亚洲精品美女2020久久| 亚洲国产成人AV在线播放| 免费观看大片毛片| 巨胸狂喷奶水视频www网站免费| 亚洲精品一级无码鲁丝片| 无码专区AAAAAA免费视频| 亚洲免费视频播放| 亚洲精品乱码久久久久久自慰| 成人女人A级毛片免费软件| 黄床大片免费30分钟国产精品| 亚洲一区免费视频| 亚洲AV电影天堂男人的天堂| 亚洲综合婷婷久久| 亚洲无码日韩精品第一页| 成人毛片18女人毛片免费视频未| 中文永久免费观看网站| 久久WWW免费人成一看片| 高清国语自产拍免费视频国产| 国产精品亚洲αv天堂无码| 日本久久久久亚洲中字幕| 亚洲人成网站999久久久综合| 久久亚洲精品成人| 亚洲国产成人久久综合碰碰动漫3d|