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

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

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

    隨筆 - 31  文章 - 2  trackbacks - 0
    Struts Recipes 的合著者 George Franciscus 帶您一步步地把 Velocity 模板引擎集成進(jìn) Struts 應(yīng)用程序。結(jié)果是一個(gè)快速、靈活的 JSP 替代物,同時(shí)帶有希望從 Struts 得到的所有方便。
      
      Java? 服務(wù)器頁(yè)面(JSP)技術(shù)是如此普及,以至于人們忘記了在創(chuàng)建 Web 頁(yè)面時(shí)還有其他選擇。但是最近,有些開發(fā)人員已經(jīng)轉(zhuǎn)向模板引擎,以獲得在 JSP 中得不到的靈活性。雖然用 JSP 和模板引擎都可以把數(shù)據(jù)嵌入 HTML,但是每種技術(shù)都有自己的處理方式。Velocity 模板是一個(gè)特別流行的 JSP 替代品。Velocity 提供了平緩的學(xué)習(xí)曲線和巨大的易用性。開發(fā)人員喜歡它簡(jiǎn)潔的語(yǔ)法,而且性能分析也證明它的性能超出 JSP。Velocity 也非常容易集成進(jìn) Struts 應(yīng)用程序。
      
      在這篇文章中,我將介紹如何在 Struts 應(yīng)用程序中集成和使用 Velocity 模板引擎。我會(huì)首先提供一個(gè)公式,然后逐步展開它。生成的應(yīng)用程序組合了 Struts 和 Velocity ?? 一個(gè)第一流的組合,可能會(huì)讓您懷疑自己對(duì) JSP 的忠誠(chéng)!
      
      在開始之前下載這篇文章的源代碼,以及 Struts、Velocity 和 Velocity 工具包。請(qǐng)注意,本文假設(shè)您熟悉使用 Struts 框架進(jìn)行 MVC 編程。
      
      關(guān)于模板引擎
      
      在開始集成 Struts 和 Velocity 的簡(jiǎn)單任務(wù)之前,讓我們先確保您理解模板引擎和它們?cè)谝晥D生成中的角色。模板引擎作為整體概念,Velocity 作為具體實(shí)現(xiàn),它們的生命在 HTML 之外。Velocity 把數(shù)據(jù)合并到文本主體中不同的點(diǎn)上。文本可以是文字、電子郵件或 HTML。由于采用這種方式,Velocity 模板引擎有點(diǎn)兒像 Microsoft Word 的“郵件合并”特性。郵件合并允許您方便地把動(dòng)態(tài)數(shù)據(jù)(例如姓名、地址和電話號(hào)碼)合并到信件中。在早期的日子里,組織用這項(xiàng)特性生成大型郵件列表并把它們送到郵局,導(dǎo)致垃圾郵件的產(chǎn)生!
      
      Velocity 是什么?
      
      Velocity 是一個(gè)基于 Java 的模板引擎,它提供了簡(jiǎn)單的基于模板的語(yǔ)言,可以用類似腳本的方式引用對(duì)象。Velocity 促進(jìn)了分離團(tuán)隊(duì)成員之間的責(zé)任:允許 Web 設(shè)計(jì)人員專注于視圖(即頁(yè)面的觀感),而 Java 程序員專注于后端代碼。把 Java 代碼從頁(yè)面布局中分離出來,會(huì)讓 Web 應(yīng)用程序未來更易維護(hù)。當(dāng) Velocity 與 Sruts 這樣的 MVC 框架結(jié)合時(shí),就成了 JSP 或 PHP 可行的替代。
      
      在 Web 應(yīng)用程序中,Velocity 實(shí)現(xiàn)的目標(biāo)與 JSP 相同:可以用它在向 HttpServletResponse 的 OutputStream 發(fā)送之前生成要發(fā)送的 HTML。在 Struts 應(yīng)用程序中使用 Velocity 的一種方式是在 Struts 的 Action 內(nèi)部寫入響應(yīng),然后返回 null 的 ActionForward。雖然這種技術(shù)可行,但卻有嚴(yán)重的缺陷:無法使用 struts-config.xml 文件把響應(yīng)抽象出來。把視圖放在 Action 內(nèi)部,意味著如果想要修改響應(yīng),就必須修改 Action。
      
      因?yàn)檫@種技術(shù)剝奪了 Struts 最好的一項(xiàng)特性(即從視圖中抽象出重點(diǎn)的能力),所以我更愿意把所有響應(yīng)指向一個(gè) servlet,由它負(fù)責(zé)訪問 Velocity 模板,合并上下文的數(shù)據(jù),生成響應(yīng),然后再送回瀏覽器。稍后就會(huì)學(xué)到,Velocity 的設(shè)計(jì)者們已經(jīng)把這些步驟全都捆綁在了一起:您需要做的只是跟著我來看如何一步步地實(shí)現(xiàn)它們。如果您還沒有訪問“下載”一節(jié),現(xiàn)在是訪問的時(shí)候了。
      
      Velocity 的五步
      
      把 Struts 與 Velocity 模板引擎組合起來很簡(jiǎn)單,也很直接;實(shí)際上,只要用五步就可以實(shí)現(xiàn):
      
      1.  把 Velocity JAR 放在類路徑中。
      
      2.  修改 web.xml 文件讓它識(shí)別 Velocity servlet。
      
      3.  把 Velocity toolbox.xml 放在應(yīng)用程序的 WEB-INF 目錄下。
      
      4.  修改 struts-config,把它的視圖指向 Velocity 模板而不是 JSP。
      
      5.  為每個(gè)需要顯示的頁(yè)面創(chuàng)建 Velocity 模板。
      
      我將用一個(gè)熟悉的搜索用例來演示 Struts 與 Velocity 的集成。在這個(gè)示例中,一個(gè)簡(jiǎn)單的應(yīng)用程序允許用戶按照?qǐng)D書的 ISBN 編號(hào)搜索圖書。應(yīng)用程序的結(jié)果頁(yè)面顯示與 ISBN 編號(hào)匹配的圖書。
      
      第 1 步:把 Velocity JAR 放在 WEB-INF/lib 下
      
      放棄 Struts 標(biāo)記 ?? 不!
      
      現(xiàn)在,您可能會(huì)想,是不是需要放棄那些過去讓您節(jié)約了許多編碼時(shí)間的很好的 Struts 標(biāo)記。如果不使用 JSP,那么肯定沒有使用 Struts 的 JSP 標(biāo)記!幸運(yùn)的是,您可以使用 Velocity 工具。Velocity 的 Struts 工具提供了所有您熟悉的 Struts 方便特性,但是添加了 Velocity 的靈活性。
      
      如果您還沒下載 Velocity,那么現(xiàn)在需要下載它。Velocity 本身是很棒的,但是它的工具包可以幫助您把工作做得更好更快。特別是 Struts 工具模擬了您以前熟悉的 Struts 標(biāo)記。請(qǐng)參閱 下載 一節(jié)下載 Velocity 模板引擎和 Velocity 工具。
      
      請(qǐng)注意不同時(shí)候,需要的 jar 也會(huì)略有不同。在這里我不想列出一個(gè) JAR 列表,只是想建議您訪問 Velocity 的主頁(yè)(請(qǐng)參閱參考資料)并閱讀那里的安裝指南。一旦得到了需要的 JAR,只需把它們放在 WEB-INF\lib 下面即可。
      
      第 2 步:修改 web.xml,讓它識(shí)別 Velocity 的 servlet
      
      下一步是修改 Struts 的 web.xml 文件,讓它識(shí)別 Velocity 的 servlet 并把所有以 .vm 結(jié)尾的資源請(qǐng)求定向到 Velocity servlet,如清單 1 所示。
      
      清單 1. 修改 web.xml,聲明 Velocity servlet
      
      <servlet>
      <servlet-name>velocity</servlet-name> |(1)
      <servlet-class> |(2)
      org.apache.velocity.tools.view.servlet.VelocityViewServlet
      </servlet-class>
      
      <init-param> |(3)
      <param-name>org.apache.velocity.toolbox</param-name>
      <param-value>/WEB-INFtoolbox.xml</param-value>
      </init-param>
      
      <load-on-startup>10</load-on-startup> |(4)
      </servlet>
      
      <!-- Map *.vm files to Velocity -->
      <servlet-mapping> |(5)
      <servlet-name>velocity</servlet-name>
      <url-pattern>*.vm</url-pattern>
      </servlet-mapping>
      
      讓我們來看看清單 1 中發(fā)生了什么:
      
      (1)聲明了 Velocity servlet 并給了它一個(gè) velocity 句柄。
      
      (2)聲明了 Velocity servlet 的類名。
      
      Velocity servlet 接受“toolbox”參數(shù)。toolbox 是聲明應(yīng)用程序的可用工具的位置。因此,在清單 1 中,我還做了以下工作:
      
      (3)告訴 VelocityServlet 在哪里可以找到 toolbox 的配置。
      
      (4)設(shè)置了 load-on-startup 標(biāo)記,確保在正確的時(shí)間裝入 Velocity servlet。任何大于或等于 0 的值都會(huì)迫使容器通過調(diào)用 servlet 的 init() 方法來裝入它。放在 load-on-startup 標(biāo)記體中的值決定了不同的 servlet 的 init 方法調(diào)用的次序。例如,0 在 1 之前調(diào)用,而 1 在 2 之前調(diào)用。缺少的標(biāo)記或負(fù)值允許 servlet 容器根據(jù)自己的選擇裝入 servlet。
      
      (5)聲明了 servlet 映射,強(qiáng)迫所有用 .vm 結(jié)尾的資源請(qǐng)求定向到 Velocity servlet。請(qǐng)注意(5)中的<servlet-name> 必須與(1)中的<servlet-name> 匹配。交錯(cuò)的聲明和映射會(huì)在日志中生成錯(cuò)誤。
      
      第 3 步:把 toolbox.xml 放在 WEB-INF 下
      
      利用 Velocity,可以使用(或創(chuàng)建)包含許多工具的工具箱。用來登記類的工具箱中包含有用的函數(shù),常常會(huì)用到。幸運(yùn)的是,Velocity 提供了許多預(yù)先構(gòu)建好的工具。還創(chuàng)建了許多 Struts 工具來模擬原始的 Struts 標(biāo)記。如果發(fā)現(xiàn)需要構(gòu)建自己的工具,也可以自由地構(gòu)建。在清單 2 中顯示的 toolbox.xml 可以在 Velocity 工具下載中找到。這個(gè)文件應(yīng)當(dāng)隨 Velocity JAR 一起放在 WEB-INF 下。
      
      清單 2. toolbox.xml
      
      <?xml version="1.0"?>
      <toolbox>
      <tool>
      <key>link</key>
      <scope>request</scope>
      <class>
      org.apache.velocity.tools.struts.StrutsLinkTool
      </class>
      </tool>
      <tool>
      <key>msg</key>
      <scope>request</scope>
      <class>
      org.apache.velocity.tools.struts.MessageTool
      </class>
      </tool>
      <tool>
      <key>errors</key>
      <scope>request</scope>
      <class>
      org.apache.velocity.tools.struts.ErrorsTool
      </class>
      </tool>
      <tool>
      <key>form</key>
      <scope>request</scope>
      <class>
      org.apache.velocity.tools.struts.FormTool
      </class>
      </tool>
      <tool>
      <key>tiles</key>
      <scope>request</scope>
      <class>
      org.apache.velocity.tools.struts.TilesTool
      </class>
      </tool>
      <tool>
      <key>validator</key>
      <scope>request</scope>
      <class>
      org.apache.velocity.tools.struts.ValidatorTool
      </class>
      </tool>
      </toolbox>
      
      第 4 步:修改 struts-config
      
      下一步是修改 struts-config.xml,指向 Velocity 視圖而不是 JSP。新的配置文件如清單 3 所示。
      
      清單 3. 針對(duì) Velocity 視圖修改后的 struts-config.xml
      
      <?xml version="1.0" encoding="ISO-8859-1" ?>
      
      <!DOCTYPE struts-config PUBLIC
      "-//Apache Software Foundation//DTD Struts Configuration 1.0//EN"
      "http://jakarta.apache.org/struts/dtds/struts-config_1_0.dtd">
      
      <struts-config>
      <form-beans>
      <form-bean name="searchForm" type="app.SearchForm"/>
      </form-beans>
      
      <global-forwards>
      <forward name="welcome" path="/welcome.do"/>
      </global-forwards>
      
      <action-mappings>
      <action
      path="/welcome"
      type="org.apache.struts.actions.ForwardAction"
      parameter="/pages/search.vm"/> |(1)
      
      <action
      path="/search"
      type="app.SearchAction"
      name="searchForm"
      scope="request"
      input="/pages/search.vm"> |(2)
      <forward name="success"
      path="/pages/results.vm"/> |(3)
      </action>
      </action-mappings>
      </struts-config>
      
      清單 3 看起來就像一個(gè)非常典型的 Struts 應(yīng)用程序,只有一個(gè)小小的不同。響應(yīng)沒有把客戶轉(zhuǎn)向到 JSP,而直接轉(zhuǎn)向到 .vm 文件(請(qǐng)參閱清單 3 中的引用 1、2 和 3)。在大多數(shù)情況下,把 Struts 應(yīng)用程序從 JSP 遷移到 Velocity 視圖,需要做的僅僅是全局搜索,把 .jsp 替換成 .vm。其他所有東西都可以保持不變!模板可以同樣保存在以前保存 JSP 的位置;所需要做的只是用 Velocity 命令代替 JSP 標(biāo)記。
      
      第 5 步:創(chuàng)建 Velocity 模板
      
      在清單 4 中,可以看到示例應(yīng)用程序搜索頁(yè)面的 Velocity 模板。
      
      清單 4. 搜索頁(yè)面的 Velocity 模板
      
      <HTML>
      <HEAD>
      <TITLE>Search</TITLE>
      </HEAD>
      <BODY>
      $!errors.msgs()||(1)
      <FORM method="POST"
      action="$link.setAction('/search')"> |(2)
      <h2>Book Search</h2>
      ISBN:<INPUT type="text" name="isbn">
      <INPUT type="submit" value="Submit" name="submit">
      </FORM>
      </BODY>
      </HTML>
      
      清單 4 是一個(gè)沒有 JSP 或 Struts 標(biāo)記的典型的 HTML 頁(yè)面。但是,以下元素看起來可能不是那么熟悉:
      
      (1)用 $!errors.msgs() 得到錯(cuò)誤消息隊(duì)列中的錯(cuò)誤消息。
      
      (2)用 $link.setAction('/search') 獲得搜索轉(zhuǎn)發(fā)的 URL。
      
      這就成功了 ?? 模板剩下的部分看起來幾乎與以前熟悉的 HTML 文件相同。清單 5 顯示了應(yīng)用程序結(jié)果頁(yè)面的模板。
      
      清單 5. 結(jié)果頁(yè)面的 Velocity 模板
      
      <html>
      <body>
      
      <h1>Book Details</h1>
      <a href="$link.setForward("searchEntry")">Search again</a> |(1)
      
      <h3>$book.title</h3> |(2)
      
      <b>ISBN:</b>$book.isbn<br>|(3)
      <b>Title:</b>$book.title<br>|(4)
      <b>Author:</b>$book.author<br>|(5)
      <b>Price:</b>$book.price<br>|(6)
      <b>No Pages:</b>$book.pages<br>|(7)
      <b>Description:</b>$book.description<br>|(8)
      <b>Publisher:</b>$book.publisher<br>|(9)
      </body>
      <html>
      
      可以注意到,清單 5 中不包含 JSP 標(biāo)記或 Struts 標(biāo)記。我們來詳細(xì)看看它:
      
      (1)用 Struts 的鏈接工具把 <a> 標(biāo)記的 href 設(shè)置為 Struts 轉(zhuǎn)發(fā)。
      
      (2)訪問 $book title 屬性。
      
      (3)訪問 $book isbn 屬性。
      
      (4)再次訪問 $book title 屬性。
      
      (5)訪問 $book author 屬性。
      
      (6)訪問 $book price 屬性。
      
      (7)訪問 $book pages 屬性。
      
      (8)訪問 $book description 屬性。
      
      (9)訪問 $book publisher 屬性。
      
      討論
      
      這就是把 Struts 與 Velocity 模板引擎集成的全部工作。表面看起來非常簡(jiǎn)單(實(shí)際上也很簡(jiǎn)單),但是請(qǐng)想想是什么讓這個(gè)集成能夠工作的呢?
      
      Struts 動(dòng)作映射可以定義任何視圖,不僅限于 JSP。在這篇文章中,我只是把動(dòng)作映射修改為以 vm 結(jié)尾而不是以 jsp 結(jié)尾的返回文件。然后,我聲明了 Velocity servlet,并告訴 Servlet 容器把以 vm 結(jié)尾的文件發(fā)送給 VelocityViewServlet。
      
      VelocityViewServlet 把 Velocity 命令表示成 HTML 響應(yīng)。通過這種方式,VelocityViewServlet 充當(dāng)了視圖響應(yīng)的攔截器。Struts 控制器把視圖轉(zhuǎn)發(fā)給 VelocityViewServlet,后者在向客戶端發(fā)送響應(yīng)之前處理 vm 文件。請(qǐng)參閱參考資料 獲得關(guān)于將 Velocity 視圖集成進(jìn) Struts 應(yīng)用程序的更多內(nèi)容。
      
      結(jié)束語(yǔ)
      
      正如在本文中看到的,Struts 與 Velocity 的集成很簡(jiǎn)單。只需五個(gè)步驟就可以把所有東西連在一起。針對(duì)不同的引擎和場(chǎng)景,采用模板引擎而不是 JSP 的優(yōu)勢(shì)各有不同。在 Velocity 的情況下,優(yōu)勢(shì)就是簡(jiǎn)單性、容易學(xué)習(xí)以及更好的性能。
    posted on 2007-11-02 17:02 緣來如此 閱讀(344) 評(píng)論(0)  編輯  收藏 所屬分類: Velocity

    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 久久综合图区亚洲综合图区| 亚洲国产成人精品无码区在线网站 | 无码人妻一区二区三区免费| 野花视频在线官网免费1| 成人午夜亚洲精品无码网站| 中国人xxxxx69免费视频| 亚洲欧美成aⅴ人在线观看| 久久精品国产精品亚洲| 精品免费久久久久久久| 性生大片视频免费观看一级| 亚洲av无码乱码国产精品| 岛国av无码免费无禁网站| 2022免费国产精品福利在线| 亚洲日韩乱码久久久久久| 亚洲日本中文字幕一区二区三区| 91久久青青草原线免费| 九九视频高清视频免费观看| 亚洲福利一区二区| 国产偷窥女洗浴在线观看亚洲| 99久久国产热无码精品免费| www永久免费视频| 亚洲欧美第一成人网站7777| 亚洲v高清理论电影| 亚洲VA综合VA国产产VA中| 无人在线观看完整免费版视频| 中文字幕在线免费看| 亚洲欧美日韩久久精品| 亚洲AV无码乱码在线观看富二代 | 日韩插啊免费视频在线观看| 羞羞漫画页面免费入口欢迎你| 亚洲国产精品无码久久久| 国产亚洲精品福利在线无卡一| 日韩精品无码区免费专区| 三年片在线观看免费观看大全一 | 亚洲阿v天堂在线| 免费很黄很色裸乳在线观看| 无码免费午夜福利片在线| 日本高清免费观看| 一级毛片免费视频网站| 国产精品亚洲av色欲三区| 77777午夜亚洲|