亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JSP > 正文

Struts與Velocity集成 五個步驟替代JSP

2024-09-05 00:20:03
字體:
來源:轉載
供稿:網友
  struts recipes 的合著者 george franciscus 帶您一步步地把 velocity 模板引擎集成進 struts 應用程序。結果是一個快速、靈活的 jsp 替代物,同時帶有希望從 struts 得到的所有方便。
  
  java? 服務器頁面(jsp)技術是如此普及,以至于人們忘記了在創建 web 頁面時還有其他選擇。但是最近,有些開發人員已經轉向模板引擎,以獲得在 jsp 中得不到的靈活性。雖然用 jsp 和模板引擎都可以把數據嵌入 html,但是每種技術都有自己的處理方式。velocity 模板是一個特別流行的 jsp 替代品。velocity 提供了平緩的學習曲線和巨大的易用性。開發人員喜歡它簡潔的語法,而且性能分析也證明它的性能超出 jsp。velocity 也非常容易集成進 struts 應用程序。
  
  在這篇文章中,我將介紹如何在 struts 應用程序中集成和使用 velocity 模板引擎。我會首先提供一個公式,然后逐步展開它。生成的應用程序組合了 struts 和 velocity ?? 一個第一流的組合,可能會讓您懷疑自己對 jsp 的忠誠!
  
  在開始之前下載這篇文章的源代碼,以及 struts、velocity 和 velocity 工具包。請注意,本文假設您熟悉使用 struts 框架進行 mvc 編程。
  
  關于模板引擎
  
  在開始集成 struts 和 velocity 的簡單任務之前,讓我們先確保您理解模板引擎和它們在視圖生成中的角色。模板引擎作為整體概念,velocity 作為具體實現,它們的生命在 html 之外。velocity 把數據合并到文本主體中不同的點上。文本可以是文字、電子郵件或 html。由于采用這種方式,velocity 模板引擎有點兒像 microsoft word 的“郵件合并”特性。郵件合并允許您方便地把動態數據(例如姓名、地址和電話號碼)合并到信件中。在早期的日子里,組織用這項特性生成大型郵件列表并把它們送到郵局,導致垃圾郵件的產生!
  
  velocity 是什么?
  
  velocity 是一個基于 java 的模板引擎,它提供了簡單的基于模板的語言,可以用類似腳本的方式引用對象。velocity 促進了分離團隊成員之間的責任:允許 web 設計人員專注于視圖(即頁面的觀感),而 java 程序員專注于后端代碼。把 java 代碼從頁面布局中分離出來,會讓 web 應用程序未來更易維護。當 velocity 與 sruts 這樣的 mvc 框架結合時,就成了 jsp 或 php 可行的替代。
  
  在 web 應用程序中,velocity 實現的目標與 jsp 相同:可以用它在向 httpservletresponse 的 outputstream 發送之前生成要發送的 html。在 struts 應用程序中使用 velocity 的一種方式是在 struts 的 action 內部寫入響應,然后返回 null 的 actionforward。雖然這種技術可行,但卻有嚴重的缺陷:無法使用 struts-config.xml 文件把響應抽象出來。把視圖放在 action 內部,意味著如果想要修改響應,就必須修改 action。
  
  因為這種技術剝奪了 struts 最好的一項特性(即從視圖中抽象出重點的能力),所以我更愿意把所有響應指向一個 servlet,由它負責訪問 velocity 模板,合并上下文的數據,生成響應,然后再送回瀏覽器。稍后就會學到,velocity 的設計者們已經把這些步驟全都捆綁在了一起:您需要做的只是跟著我來看如何一步步地實現它們。如果您還沒有 訪問“下載”一節,現在是訪問的時候了。
  
  velocity 的五步
  
  把 struts 與 velocity 模板引擎組合起來很簡單,也很直接;實際上,只要用五步就可以實現:
  
  1.  把 velocity jar 放在類路徑中。
  
  2.  修改 web.xml 文件讓它識別 velocity servlet。
  
  3.  把 velocity toolbox.xml 放在應用程序的 web-inf 目錄下。
  
  4.  修改 struts-config,把它的視圖指向 velocity 模板而不是 jsp。
  
  5.  為每個需要顯示的頁面創建 velocity 模板。
  
  我將用一個熟悉的搜索用例來演示 struts 與 velocity 的集成。在這個示例中,一個簡單的應用程序允許用戶按照圖書的 isbn 編號搜索圖書。應用程序的結果頁面顯示與 isbn 編號匹配的圖書。
  
  第 1 步:把 velocity jar 放在 web-inf/lib 下
  
  放棄 struts 標記 ?? 不!
  
  現在,您可能會想,是不是需要放棄那些過去讓您節約了許多編碼時間的很好的 struts 標記。如果不使用 jsp,那么肯定沒有使用 struts 的 jsp 標記!幸運的是,您可以使用 velocity 工具。velocity 的 struts 工具提供了所有您熟悉的 struts 方便特性,但是添加了 velocity 的靈活性。
  
  如果您還沒下載 velocity,那么現在需要下載它。velocity 本身是很棒的,但是它的工具包可以幫助您把工作做得更好更快。特別是 struts 工具模擬了您以前熟悉的 struts 標記。請參閱 下載 一節下載 velocity 模板引擎和 velocity 工具。
  
  請注意不同時候,需要的 jar 也會略有不同。在這里我不想列出一個 jar 列表,只是想建議您訪問 velocity 的主頁(請參閱 參考資料)并閱讀那里的安裝指南。一旦得到了需要的 jar,只需把它們放在 web-inf/lib 下面即可。
  
  第 2 步:修改 web.xml,讓它識別 velocity 的 servlet
  
  下一步是修改 struts 的 web.xml 文件,讓它識別 velocity 的 servlet 并把所有以 .vm 結尾的資源請求定向到 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 中發生了什么:
  
  (1)聲明了 velocity servlet 并給了它一個 velocity 句柄。
  
 ?。?)聲明了 velocity servlet 的類名。
  
  velocity servlet 接受“toolbox”參數。toolbox 是聲明應用程序的可用工具的位置。因此,在清單 1 中,我還做了以下工作:
  
 ?。?)告訴 velocityservlet 在哪里可以找到 toolbox 的配置。
  
  (4)設置了 load-on-startup 標記,確保在正確的時間裝入 velocity servlet。任何大于或等于 0 的值都會迫使容器通過調用 servlet 的 init() 方法來裝入它。放在 load-on-startup 標記體中的值決定了不同的 servlet 的 init 方法調用的次序。例如,0 在 1 之前調用,而 1 在 2 之前調用。缺少的標記或負值允許 servlet 容器根據自己的選擇裝入 servlet。
  
 ?。?)聲明了 servlet 映射,強迫所有用 .vm 結尾的資源請求定向到 velocity servlet。請注意(5)中的<servlet-name> 必須與(1)中的<servlet-name> 匹配。交錯的聲明和映射會在日志中生成錯誤。
  
  第 3 步:把 toolbox.xml 放在 web-inf 下
  
  利用 velocity,可以使用(或創建)包含許多工具的工具箱。用來登記類的工具箱中包含有用的函數,常常會用到。幸運的是,velocity 提供了許多預先構建好的工具。還創建了許多 struts 工具來模擬原始的 struts 標記。如果發現需要構建自己的工具,也可以自由地構建。在清單 2 中顯示的 toolbox.xml 可以在 velocity 工具下載中找到。這個文件應當隨 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. 針對 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 看起來就像一個非常典型的 struts 應用程序,只有一個小小的不同。響應沒有把客戶轉向到 jsp,而直接轉向到 .vm 文件(請參閱清單 3 中的引用 1、2 和 3)。在大多數情況下,把 struts 應用程序從 jsp 遷移到 velocity 視圖,需要做的僅僅是全局搜索,把 .jsp 替換成 .vm。其他所有東西都可以保持不變!模板可以同樣保存在以前保存 jsp 的位置;所需要做的只是用 velocity 命令代替 jsp 標記。
  
  第 5 步:創建 velocity 模板
  
  在清單 4 中,可以看到示例應用程序搜索頁面的 velocity 模板。
  
  清單 4. 搜索頁面的 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 是一個沒有 jsp 或 struts 標記的典型的 html 頁面。但是,以下元素看起來可能不是那么熟悉:
  
 ?。?)用 $!errors.msgs() 得到錯誤消息隊列中的錯誤消息。
  
  (2)用 $link.setaction('/search') 獲得搜索轉發的 url。
  
  這就成功了 ?? 模板剩下的部分看起來幾乎與以前熟悉的 html 文件相同。清單 5 顯示了應用程序結果頁面的模板。
  
  清單 5. 結果頁面的 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 標記或 struts 標記。我們來詳細看看它:
  
 ?。?)用 struts 的鏈接工具把 <a> 標記的 href 設置為 struts 轉發。
  
 ?。?)訪問 $book title 屬性。
  
  (3)訪問 $book isbn 屬性。
  
  (4)再次訪問 $book title 屬性。
  
 ?。?)訪問 $book author 屬性。
  
  (6)訪問 $book price 屬性。
  
 ?。?)訪問 $book pages 屬性。
  
 ?。?)訪問 $book description 屬性。
  
  (9)訪問 $book publisher 屬性。
  
  討論
  
  這就是把 struts 與 velocity 模板引擎集成的全部工作。表面看起來非常簡單(實際上也很簡單),但是請想想是什么讓這個集成能夠工作的呢?
  
  struts 動作映射可以定義任何視圖,不僅限于 jsp。在這篇文章中,我只是把動作映射修改為以 vm 結尾而不是以 jsp 結尾的返回文件。然后,我聲明了 velocity servlet,并告訴 servlet 容器把以 vm 結尾的文件發送給 velocityviewservlet。
  
  velocityviewservlet 把 velocity 命令表示成 html 響應。通過這種方式,velocityviewservlet 充當了視圖響應的攔截器。struts 控制器把視圖轉發給 velocityviewservlet,后者在向客戶端發送響應之前處理 vm 文件。請參閱 參考資料 獲得關于將 velocity 視圖集成進 struts 應用程序的更多內容。
  
  結束語
  
  正如在本文中看到的,struts 與 velocity 的集成很簡單。只需五個步驟就可以把所有東西連在一起。針對不同的引擎和場景,采用模板引擎而不是 jsp 的優勢各有不同。在 velocity 的情況下,優勢就是簡單性、容易學習以及更好的性能。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美午夜片在线免费观看| 日韩精品免费在线视频观看| 亚洲free性xxxx护士hd| 欧美日韩另类视频| 亚洲999一在线观看www| 亚洲黄色有码视频| 国产精品视频在线观看| 久久久久久999| www.99久久热国产日韩欧美.com| 自拍偷拍免费精品| 色狠狠av一区二区三区香蕉蜜桃| 国产精品人成电影在线观看| 久久精品国产69国产精品亚洲| 久久国产精品久久精品| 国产一区私人高清影院| 欧美精品免费看| 日韩精品极品视频免费观看| 欧美成人激情图片网| 久久久久久网址| 日韩中文理论片| 国语自产在线不卡| 国产一区二区三区在线观看视频| 精品国产乱码久久久久久天美| 国产精品久久久久aaaa九色| 97热在线精品视频在线观看| 精品视频中文字幕| 中文字幕日韩精品有码视频| 久久激情视频久久| 97香蕉超级碰碰久久免费软件| 中国china体内裑精亚洲片| 精品呦交小u女在线| 91av在线免费观看| 久久久久久久久综合| 中文字幕亚洲专区| 久精品免费视频| 国产精品一区二区三| 中文字幕亚洲综合久久| 亚洲影院在线看| 亚洲精品国产品国语在线| 亚洲一区二区三区成人在线视频精品| 亚洲日本欧美日韩高观看| 中文字幕成人精品久久不卡| 国产免费一区二区三区在线能观看| 久久久久国产精品一区| 中文字幕av一区中文字幕天堂| 国内精品久久久久久中文字幕| 欧美电影免费观看电视剧大全| 色综合五月天导航| 国内精品视频在线| 日韩av免费在线看| 久久国产精品偷| 久久久亚洲福利精品午夜| www.亚洲免费视频| 亚洲精品xxxx| 亚洲国语精品自产拍在线观看| 国产精品久久久久免费a∨大胸| 亚洲精美色品网站| 国产不卡在线观看| 成人免费福利在线| 91a在线视频| 日韩一区av在线| 欧美色另类天堂2015| 国产欧亚日韩视频| 亚洲国产成人久久综合一区| 成人免费淫片aa视频免费| 成人免费福利在线| 国产成人精品久久久| 欧美激情按摩在线| 成人中心免费视频| 亚洲精品不卡在线| 久久免费精品日本久久中文字幕| 欧美精品一区二区三区国产精品| 亚洲国产成人久久| 日本免费久久高清视频| 久久久女女女女999久久| 日韩的一区二区| 中日韩午夜理伦电影免费| 亚洲在线一区二区| 精品欧美激情精品一区| 午夜伦理精品一区| 久久久久久久97| 久久亚洲精品中文字幕冲田杏梨| 欧美性生交xxxxxdddd| 69av视频在线播放| 国产精品久久久久免费a∨大胸| 日韩在线观看免费全| 九九精品在线观看| 亚洲国产精品视频在线观看| 欧美精品久久久久a| 亚洲va久久久噜噜噜| 欧美国产中文字幕| 欧美影院在线播放| 色综合久综合久久综合久鬼88| 亚洲国产精品资源| 亚洲国产成人av在线| 日本国产精品视频| 欧美激情中文字幕在线| 亚洲jizzjizz日本少妇| 国产成人精品一区二区三区| 精品福利在线观看| 亚洲乱码国产乱码精品精| 亚洲最新av在线网站| 一区二区欧美激情| 国产99久久久欧美黑人| 欧美亚洲成人网| 欧美激情亚洲综合一区| 欧美视频免费在线观看| 国产综合在线看| 亚洲精品视频在线观看视频| 国产美女扒开尿口久久久| 亚洲自拍偷拍网址| 2021久久精品国产99国产精品| 国精产品一区一区三区有限在线| 久久av中文字幕| 欧美夫妻性生活xx| 91经典在线视频| 成人av番号网| 国产成人亚洲综合青青| 国产精品美女免费看| 国产精品入口免费视频一| 欧美激情国产日韩精品一区18| 97视频网站入口| 久久免费精品日本久久中文字幕| 91久久久久久久一区二区| 亚洲男人7777| 日本久久久久久久久| 亚洲人成毛片在线播放| 久久天天躁狠狠躁夜夜躁| 国产美女直播视频一区| 国产精品久久久久9999| 亚洲图片在线综合| 欧美福利视频在线| 精品国产精品三级精品av网址| 欧美日韩国产色| 一区二区欧美久久| 国产精品扒开腿爽爽爽视频| 国产精品视频公开费视频| 亚洲精品电影在线| 中文字幕亚洲一区在线观看| 国产精品夫妻激情| 中文字幕久久久| 国产91精品不卡视频| 日韩网站在线观看| 日韩欧美亚洲综合| 亚洲精品720p| 中文字幕九色91在线| 91精品啪aⅴ在线观看国产| 九九久久久久99精品| 欧美一级电影免费在线观看| 日韩成人中文字幕在线观看| 欧美日韩精品在线| 欧美国产激情18| 日韩精品在线观看一区二区| 日韩美女激情视频| 蜜臀久久99精品久久久久久宅男| 欧美性生交大片免费| 国产精品一区二区久久国产| 亚洲人成网站777色婷婷| 国产成人精彩在线视频九色| 国产精品偷伦免费视频观看的| 亚洲日韩欧美视频| 人体精品一二三区| 国产aⅴ夜夜欢一区二区三区| 国产精品亚洲аv天堂网|