Your SlideShare is downloading. ×
0
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Struts Mitac(1)
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Struts Mitac(1)

4,996

Published on

Published in: Technology
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
4,996
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
58
Comments
0
Likes
2
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide
  • Understanding the struts framework Framework 是什麼 ? Struts Framework 的功用 ? 一定要用 Struts 嗎 ? 有沒有其它替代方案 ? Struts 要怎麼用 ?
  • Transcript

    • 1. J2EE 前端應用程式架構與 Struts Framework 廖峻鋒 NCCU Computer Center Feb 2,2003
    • 2. Agenda <ul><li>Struts 簡介與定位 </li></ul><ul><li>Web-tier 概觀 </li></ul><ul><li>Framework &amp; Design Patterns 概論 </li></ul><ul><ul><li>基本觀念與常用 OO 技巧簡介 </li></ul></ul><ul><li>Struts Framework Architectural Overview </li></ul><ul><ul><li>The MVC Architectural Pattern </li></ul></ul><ul><ul><li>Struts 設計理念 </li></ul></ul><ul><li>Struts 實作議題 </li></ul>
    • 3. What is Struts? <ul><li>基於 MVC Architectural Pattern 所開發的 Web Application Framework </li></ul><ul><li>Craig McClanahan 在 2000 年提出, 2001 年 6 月 release struts 1.0 。 </li></ul><ul><li>Hosted in Apache Jakarta project </li></ul><ul><li>將開發 web 程式之 best practice 以 Application Framework 的方式封裝,供開發人員重用。 </li></ul>為何有資格稱為 best practice ?
    • 4. Must Read when Architecting J2EE Applications P of EAA Core J2EE Patterns 2/e
    • 5. Struts 與 J2EE Core Patterns <ul><li>Struts 實作了下列 J2EE Core Patterns </li></ul><ul><ul><li>Application Controller (PEAA) </li></ul></ul><ul><ul><li>Front Controller (PEAA) </li></ul></ul><ul><ul><li>View Helper (PEAA:Template View) </li></ul></ul><ul><ul><li>Service to Worker </li></ul></ul><ul><ul><li>Dispatcher View </li></ul></ul>
    • 6. Struts Framework 的定位 Web tier / Persistence /workflow Your Code WebLogic / WebSphere ? jRocket VM / JDK ? Linux / Windows ? Struts is one of your architectural decisions
    • 7. How Struts fits into RUP ? Architecture should be finished
    • 8. J2EE 前端的任務 <ul><li>UI ( 顯示畫面 ) </li></ul><ul><li>Presentation Logic ( 顯示邏輯 ) </li></ul><ul><li>Collects Inputs </li></ul><ul><li>Page Flow Control </li></ul><ul><ul><li>決定接下來要顯示那個 Page </li></ul></ul><ul><li>當不使用 EJB 時… </li></ul><ul><ul><li>May Maintain State (HttpSession) </li></ul></ul><ul><ul><li>May Implement Business Logic </li></ul></ul>J2EE 前端 = Web Tier
    • 9. J2EE 前端的相關規格 / 技術 <ul><li>JSP / Servlets </li></ul><ul><ul><li>最新版為 2.0 / 2.4 , 目前廣泛使用 1.2/2.3 </li></ul></ul><ul><li>JSP Custom Tag Library </li></ul><ul><li>JSTL (JSP Standard Tag Library) </li></ul><ul><ul><li>目前為 1.0 (2003.6) </li></ul></ul><ul><li>JavaServer™ Faces </li></ul><ul><ul><li>目前為 1.0 final draft (2003.12.19) </li></ul></ul><ul><ul><li>UI components / UI Event Handling </li></ul></ul>
    • 10. 問題與討論 <ul><li>試以簡圖表示 JSP 與 Servlet 如何運作 ? </li></ul><ul><li>什麼是 Container? 什麼是 Servlet Container? </li></ul><ul><li>至少說出三個 JSP 與 ASP 不同之處 ? </li></ul><ul><li>一個完全使用 Servlet 的應用程式可能有什麼缺點 ? </li></ul><ul><li>什麼是 scriptlet ? 一個完全使用 scriptlet 的 JSP 應用程式可能有什麼缺點 ? </li></ul><ul><li>JSP 1.2 規格書中訂有那四個 scope ,其意義為何 ? 使用時機為何 ? </li></ul><ul><li>請舉例說明一個合乎 Servlet 2.3 規格書的 Web Application 應該長什麼樣子。 </li></ul><ul><li>Forward 和 Redirect 有何不同 ? </li></ul>
    • 11. Framework and Design Patterns Struts Framework is built upon several well-known proven patterns 簡介
    • 12. <ul><li>如果建築師都用軟體工程師的方法來建造房子,那麼第一隻飛來的啄木鳥便足以將整個文明都給摧毀。 </li></ul><ul><ul><li>- Applied Java Patterns by Stephen Stelting and Olava Maassen </li></ul></ul>
    • 13. Design Patterns <ul><li>Christopher Alexander (U.C. Berkeley) – 1977 出版了一本建築學用的樣式目錄 (Pattern- Catalog) 。 </li></ul><ul><li>1987 OOPSLA 中 Kent Beck 等人發表了 smalltalk 的 Design Patterns 。 </li></ul><ul><li>1995 年 Gof 出版了 Design patterns:Elements of Reusable Object-Oriented Software 。 </li></ul><ul><li>1996 年 Frank 等人出版了 POSA(Pattern Oriented Software Architecture) 。 </li></ul><ul><li>這二本書問世後, Design Patterns 開始受到廣泛的重視與成長。 </li></ul>
    • 14. <ul><li>Two primary books </li></ul><ul><ul><li>POSA </li></ul></ul><ul><ul><li>Gof </li></ul></ul>
    • 15. Pattern System <ul><li>由 [POSA96] 首先提出對 Patterns 的分類 </li></ul><ul><li>將 Pattern 從「鉅觀」到「微觀」加以分類 </li></ul><ul><ul><li>Architectural Patterns ( 例如 :MVC 、 Layer) </li></ul></ul><ul><ul><li>Design Patterns ( 例如 :Gof 的 23 個 patterns) </li></ul></ul><ul><ul><li>Idioms ( 例如大量接合字串問題或 Code Style) </li></ul></ul>
    • 16. 框架 (Framework) <ul><li>A framework is a reusable, semi-complete application( 半成品 ) that can be specialized to produce custom applications. </li></ul><ul><li>Application frameworks are for reifying( 具體化 ) proven software designs and implementations . </li></ul><ul><li>Framework 通常針對特定領域來設計。 </li></ul>讓成功的設計經驗可以重複使用 !
    • 17. 框架與應用程式的關係 <ul><li>框架可以看成是整個應用程式的 骨架 ,程式開發人員將框架 客製化 以寫出真正的應用程式。 </li></ul>框架 ( 抽象的、不能使用 ) 應用程式 ( 具體的、可以使用的 ) 客製化
    • 18. Framework 與 Patterns 的比較 <ul><li>Design Patterns 是從很多 Framework 中歸納得來。 </li></ul><ul><li>一個 Framework 可能會包括很多 Design Patterns 。 </li></ul><ul><li>Design Patterns 只能在觀念層級被重用。 </li></ul><ul><ul><li>Patterns are more abstract than frameworks </li></ul></ul><ul><li>Framework 通常會由一群 Design Patterns 組成。 </li></ul>
    • 19. 使用 Framework 的好處 ? <ul><li>讓成功的經驗得以重複使用。 </li></ul><ul><li>將領域專家 (Domain Expert) 的知識封裝於 Framework 中。 </li></ul><ul><li>鼓勵重用。 </li></ul><ul><li>增進開發效率。 </li></ul><ul><li>將軟體開發經驗轉換成具體資產。 </li></ul>
    • 20. Applying Framework <ul><li>Framework Develop time </li></ul><ul><ul><li>2002.11 ~ 2003.06 (7 個月 / 1 人 ) </li></ul></ul><ul><li>Applications Develop time </li></ul><ul><ul><li>改寫時間 2003.7 ~ 2003.8 (2 個月 / 2 人 ) </li></ul></ul>
    • 21. 使用 Framework 的經驗 <ul><li>Developers should have strong OO backgrounds. </li></ul><ul><ul><li>在 Programmer 沒有足夠 OO Background 的情況下套用 Framework 可能造成反效果 . </li></ul></ul><ul><li>Learning curve should be taken into account. </li></ul><ul><li>Once framework is on-line , it will be very hard to modified. </li></ul>
    • 22. Framework and Design Patterns 幾個常用到的基本技巧
    • 23. 實作 和 流程控制 角色互換 ( Inversion of Control) <ul><li>傳統的公用函式庫 (Library) </li></ul><ul><ul><li>函式由函式庫定義。 </li></ul></ul><ul><ul><li>我們寫主程式,在主程式中呼叫函式。 </li></ul></ul><ul><ul><li>你控制流程 , Library 提供實作。 </li></ul></ul><ul><li>框架 (Framework) </li></ul><ul><ul><li>主程式由框架定義。 </li></ul></ul><ul><ul><li>我們實作函式, 被框架定義的主程式所呼叫 。 </li></ul></ul><ul><ul><li>Framework 控制流程,它會呼叫 你所提供的實作 ! </li></ul></ul>又稱 :HollyWood 法則  Don’t call me, I will call you!
    • 24. Inversion of Control Library 使用者的實作 Framework 使用者的實作
    • 25. Library Reuse <ul><li>String countStr = “256”; </li></ul><ul><li>String count = Integer.parseInt (countStr); </li></ul>你控制流程, Library 提供實作 ! Structured Style!
    • 26. Framework Reuse <ul><li>public class MyServlet extends HttpServlet </li></ul><ul><li>{ </li></ul><ul><li>public void doGet(…){ </li></ul><ul><li>// 提供實作 </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>Framework 控制流程,你提供實作 ! Call Back Style!
    • 27. 建構框架基本原則 -Essential Framework construction principles Unification Separation
    • 28. Template Method /Hook Method <ul><li>Framework 的作者通常將 主要邏輯 寫在 Template Method 中。 </li></ul><ul><li>Template Method 會呼叫若干 Hook Method , Hook Method 通常就是「變異點 (Hot Spot) 」。 </li></ul><ul><li>覆寫 Hook Method ,就可改變 Template Method 的行為。 ( 例如 Servlet 的 doGet()/doPost() ) </li></ul><ul><li>參考下頁的例子。 </li></ul>
    • 29. 範例 :LoginHandler
    • 30. Unification Template method Hook method template 、 hook 在同一個 Class
    • 31. Servlet 與 Template Method [Gof95] <ul><li>一個 Browser 向 HttpServlet 發出 post 時,會觸發 doPost() 方法。 </li></ul><ul><li>一個 Browser 向 Servlet 發出 get 時,會觸發 doGet() 方法。 </li></ul><ul><li>判別是 get 或 post ,由 HttpServlet 決定,至於 doPost() , doGet() 由子類別決定。 </li></ul><ul><li>Template Method 是 Framework 中最常見到的 Design Pattern! </li></ul>
    • 32. Servlet
    • 33. Interface <ul><li>Interface 規定了一組契約 (method) ,所有實作它的類別都要實作 所有方法 。 </li></ul><ul><li>Client 呼叫的是 Interface 中的方法,所以元件的抽換對 Client 來說是感覺不到的 ( 不用改 code) 。 </li></ul>
    • 34. 實作界面就可保証符合規格
    • 35. java.io.FilenameFilter ps. 其實這是一個 strategy pattern
    • 36. Separation Template method Hook method Template Class 與 Hook Class 有委任關係 Observer Pattern
    • 37. 範例 : 時常需要切換多台資料庫 template method hook method 在 template method 中呼叫 hook method
    • 38. 討論 : 彈性的登入機制 Which is template method ? which is hook method ?
    • 39. Struts Architectural Overview
    • 40. 伺服端應用程式設計的演進 <ul><li>Servlet </li></ul><ul><li>JSP scriptlet </li></ul><ul><li>JSP+Bean (Model 1, Page Controller) </li></ul><ul><li>MVC (Model 2) </li></ul>
    • 41. Model 1 在 JSP 中決定下一頁是那裏,所以稱為 Page Controller ,通常 Page Controller 會有多個。 (PEAA) ASP.NET 的標準做法
    • 42. Model 1 : Page Controller login.jsp 資料庫 index.htm index.jsp 在 JSP 中決定下一頁是那裏,所以稱為 Page Controller Java Bean Request or Session Scope
    • 43. Model 1 有什麼問題 ? Servlet/ JSP Servlet/ JSP Servlet/ JSP Web Server Servlet/ JSP One controller per page , hard to maintain !
    • 44. MVC : Separation of Concern C V M
    • 45. Model 2 - MVC index.jsp BO index.htm ControllerServlet Java Bean read data set data Request or Session Scope Forward/Redirect
    • 46. Controller Split index.jsp LoginAction BO Request or Session Scope index.htm Java Bean Controller
    • 47. Controller Split in Struts Controller = ActionServlet + Action Classes
    • 48. MVC index.jsp LoginAction BO Request or Session Scope index.htm Java Bean Model View Controller Controller
    • 49. Struts 的 MVC 模型 index.jsp Action Class Business Logic Request or Session Scope index.htm ActionForm Model View Controller ActionServlet
    • 50. Strengths of MVC Pattern <ul><li>Provides a clear separation between: </li></ul><ul><ul><li>Business Logic (M) </li></ul></ul><ul><ul><li>Output Presentation (V) </li></ul></ul><ul><ul><li>Request Processing (C) </li></ul></ul><ul><li>Provides single point of workflow control </li></ul><ul><li>Increases code manageability </li></ul><ul><li>Increases code extensibility </li></ul>
    • 51. MVC Implementations <ul><li>Hans MVC </li></ul><ul><li>Struts Framework </li></ul>
    • 52. MVC 實作基本觀念 (1) index . do Action String Controller String Controller String 用來指定 Controller 類別來處理 Action String 用來指定要交給那個 Action 類別處理 http://localhost:8080/jpetstore/ index.do
    • 53. MVC 實作基本觀念 (2) <ul><li>Action Table 在 Controller 中以 HashMap 方式實作 </li></ul><ul><li>Controller 經由查表可得知該使用那個那個 Action 類別來處理該 Action String 。 </li></ul>ViewCategoryAction viewCategory IndexAction index Action 類別 Action String
    • 54. Hans MVC
    • 55. 簡單的 MVC 實作 查表
    • 56. Struts modifications struts-config.xml ActionServlet + RequestProcessor Abstract Action
    • 57. &nbsp;
    • 58. 使用 ActionForm 來協助處理 HTML 表單 <ul><li>每一個 HTML Form 背後都有一個 ActionForm 來 support 。 </li></ul>id password &lt;&lt;ActionForm&gt;&gt; LoginActionForm id password getId()/setId() getPassword() setPassword() reset() validate()
    • 59. ActionForm 的處理 askName.jsp ProcessNameAction ActionServlet /processName.do UserNameForm ActionSerlvet 會依據 config 檔 將使用者填入的資料填入 ActionForm 中 ActionForm 的會以參數的形式傳給 Action 類別, 供開發者在取得 ActionForm 的資料 &lt;&lt;ActionForm&gt;&gt; &lt;&lt;Action&gt;&gt;
    • 60. struuts-config.xml 主要區段 <ul><li>依先後次序為 : </li></ul><ul><ul><li>DataSource 設定  (JDBC) </li></ul></ul><ul><ul><li>ActionForm 設定  重要 ! </li></ul></ul><ul><ul><li>Global 相關設定 </li></ul></ul><ul><ul><li>ActionMapping 設定  重要 ! </li></ul></ul><ul><ul><li>Controller 設定 </li></ul></ul><ul><ul><li>其它設定 (i18n,plug-in,resource…) </li></ul></ul>
    • 61. struts-config.xml ActionForm 設定 ActionMapping 設定
    • 62. struts-config.xml 的處理
    • 63. Author: Jean-Michel Garnier , http://rollerjm.free.fr/pro/Struts11.html
    • 64. Developing Web Applications with Struts Framework
    • 65. Struts 主要元件 <ul><li>Struts JSP 自訂標籤庫 </li></ul><ul><li>ActionForm </li></ul><ul><li>Action classes </li></ul><ul><li>ActionServlet </li></ul><ul><ul><li>struts-config.xml </li></ul></ul>
    • 66. Struts - View
    • 67. JSP 的寫作 : 二種選擇 <ul><li>JSTL </li></ul><ul><ul><li>&lt;c:out value=“$ {sessionScope.userBean.name }” /&gt; </li></ul></ul><ul><li>Struts-bean </li></ul><ul><ul><li>&lt;bean:write name=“ userBean ” property=“ name ” /&gt; </li></ul></ul>
    • 68. JSTL 與 Struts Tag ,何者優先 ? <ul><li>Should you use JSTL tags instead of Struts tags whenever you can ? Sure, if your container supports Servlets 2.3 and JSP 1.2, and that’s what you want to do .( 儘可能使用 JSTL 取代 Struts 標籤 ) </li></ul><ul><li>If JSTL already existed, most of the Struts tags would neverhave been written. </li></ul><ul><li>-Ted Husted ,Jakarta Struts technical lead. </li></ul>JSTL 優先 !
    • 69. JSTL 與 Struts tag 取捨準則 <ul><li>( 摘自 Struts in Action by Ted Husted) </li></ul><ul><ul><li>使用 JSTL 取代 &lt;bean:…&gt; 與 &lt;logic:…&gt; </li></ul></ul><ul><ul><li>繼續使用 &lt;html:……&gt; </li></ul></ul><ul><li>目前 Struts 正在開發 Struts-EL ,未來在 &lt;html:…&gt; 中將可使用 Expression Language . </li></ul>
    • 70. 使用 Struts 控制項 取代傳統 Html 控制項 <ul><li>目的 : 使用 Struts 的 html 控制項才能利用 ActionForm 的好處。 </li></ul><ul><li>有時會和 JSTL 一起合併使用。 </li></ul>
    • 71. 傳統的 Html Form <ul><li>&lt;html&gt; </li></ul><ul><ul><li>&lt;body&gt; </li></ul></ul><ul><ul><ul><li>&lt;form action=“sayHello.do”&gt; </li></ul></ul></ul><ul><ul><ul><li>&lt;input type=“text” name=“userName”/&gt; </li></ul></ul></ul><ul><ul><ul><li>&lt;input type=“submit” /&gt; </li></ul></ul></ul><ul><ul><ul><li>&lt;/form&gt; </li></ul></ul></ul><ul><ul><li>&lt;/body&gt; </li></ul></ul><ul><li>&lt;/html&gt; </li></ul>
    • 72. 使用 Struts 控制項 取代 html 控制項 <ul><li>修改 web.xml </li></ul><ul><li>副檔名改成 .jsp </li></ul><ul><li>修改 tag </li></ul>
    • 73. <ul><li>修改 web.xml </li></ul><ul><li>&lt;taglib&gt; </li></ul><ul><li>&lt;taglib-uri&gt;/WEB-INF/struts-html.tld&lt;/taglib-uri&gt; </li></ul><ul><li>&lt;taglib-location&gt; </li></ul><ul><li>/WEB-INF/tld/struts-html.tld </li></ul><ul><li>&lt;/taglib-location&gt; </li></ul><ul><li>&lt;/taglib&gt; </li></ul>使用 Struts 控制項 取代傳統 html 控制項 隨便取個名字,識別用 . TLD 真正的位置
    • 74. 使用 Struts 控制項 取代傳統 html 控制項 &lt;%@ taglib uri=&amp;quot;/WEB-INF/struts-html.tld&amp;quot; prefix=&amp;quot;html&amp;quot; %&gt; &lt;html:html&gt; &lt;html:form action=“sayHello.do”&gt; &lt;html:text property=“userName” /&gt; &lt;html:submit /&gt; &lt;/html:form&gt; &lt;/html:html&gt; 要先宣告 前面加上 html 的 prefix 相同 !
    • 75. HTML 的 Form 如何與 ActionForm 對映 ? <ul><li>基本上每一個 &lt;html:form&gt;……&lt;/html:form&gt; 背後都會有一個 ActionForm 。 </li></ul><ul><li>表單的每一個輸入欄位原則上對映到 JavaBean 的一個 property 。 </li></ul>
    • 76. 範例 <ul><li>&lt;html:html&gt; </li></ul><ul><li>&lt;html:form action=“sayHello.do”&gt; </li></ul><ul><li>&lt;html:text name=“userNameForm” property=“userName” /&gt; </li></ul><ul><li>&lt;html:text name=“userNameForm” property=“password” /&gt; </li></ul><ul><li>&lt;html:submit /&gt; </li></ul><ul><li>&lt;/html:form&gt; </li></ul><ul><li>&lt;/html:html&gt; </li></ul>ActionForm 名稱 所對映到的屬性
    • 77. UserNameForm <ul><li>Package demo; </li></ul><ul><li>Public class UserNameForm extends ActionForm </li></ul><ul><li>{ // 屬性和 html form 的要一一對應,名字也要相同 </li></ul><ul><li>private String userName; </li></ul><ul><li>private String password; </li></ul><ul><li>// 每一個屬性都要有 getter 及 setter </li></ul><ul><li>public void setUserName(String userName) {…} </li></ul><ul><li>public String getUserName() {…..} </li></ul><ul><li>public void setPassword(){…..} </li></ul><ul><li>public String getPassword() {….} </li></ul><ul><li>} </li></ul>如果欄位很多,寫起來很麻煩 ?
    • 78. 在那裏登記 ActionForm? ActionForm 設定
    • 79. 登記 ActionForm <ul><li>&lt;form-bean </li></ul><ul><li>name=“userNameForm” </li></ul><ul><li>type=“demo.UserNameForm” </li></ul><ul><li>/&gt; </li></ul><ul><li>其它屬性 </li></ul><ul><li>className – 指定 FormBeanConfig 類別。 </li></ul><ul><li>dynamic – 是否使用 DynaForm ? </li></ul>ActionForm 類別名稱 ActionForm 的名字,將在 ActionMapping 區段中使用
    • 80. 使用 DynaBean <ul><li>&lt;form-bean </li></ul><ul><li>name=“userNameForm” </li></ul><ul><li>type=“ org.apache.struts.action.DynaActionForm ” </li></ul><ul><li>dynamic=“ true ” &gt; </li></ul><ul><ul><li>&lt;form-property name=“userName” type=“java.lang.String”/&gt; </li></ul></ul><ul><ul><li>&lt;form-property name=“password” type=“java.lang.String”/&gt; </li></ul></ul><ul><li>&lt;/form-bean&gt; </li></ul>使用單一 Map 物件儲存所有 JavaBean 的屬性 登記屬性名稱
    • 81. <ul><li>public class ProcessNameAction extends Action </li></ul><ul><li>{ </li></ul><ul><li>public ActionForward execute( </li></ul><ul><li>ActionMapping mapping, </li></ul><ul><li>ActionForm form , </li></ul><ul><li>HttpServletRequest request, </li></ul><ul><li>HttpServletResponse response) </li></ul><ul><li>{ </li></ul><ul><li>UserNameForm myForm = (UserNameForm) form; </li></ul><ul><li>… ..(do something)… </li></ul><ul><li>return (mapping.findForward(“sayHello&amp;quot;)); </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>讀取 ActionForm 的資料 以參數形式傳入 取得 ActionForm 的參考
    • 82. Action Class
    • 83. (revisited) Struts 的 MVC 模型 index.jsp Action Class Business Logic Request or Session Scope index.htm ActionForm Model View Controller ActionServlet
    • 84. Action 做些什麼 ? <ul><li>從 ActionForm 中取得資料 </li></ul><ul><li>從 request/response 中取得資料 </li></ul><ul><li>委任商業邏輯 ( 含資料庫存取 ) </li></ul><ul><li>將控制權 forward 到合適的 View 中 </li></ul>
    • 85. ProcessNameAction <ul><li>public class ProcessNameAction extends Action </li></ul><ul><li>{ </li></ul><ul><li>public ActionForward execute( </li></ul><ul><li>ActionMapping mapping, </li></ul><ul><li>ActionForm form, </li></ul><ul><li>HttpServletRequest request, </li></ul><ul><li>HttpServletResponse response) </li></ul><ul><li>{ </li></ul><ul><li>UserNameForm myForm = (UserNameForm) form; </li></ul><ul><li>… ..(do something)… </li></ul><ul><li>return (mapping.findForward(sayHello&amp;quot;)); </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
    • 86. ActionServlet 使用 struts-config.xml 控制 ActionServlet 行為 !
    • 87. Struts-config.xml <ul><li>Struts 的核心,用來描述各元件的關係。 </li></ul><ul><li>市面上有很多 GUI 工具可支援自動產生。 </li></ul>
    • 88. struuts-config.xml 主要區段 <ul><li>依先後次序為 : </li></ul><ul><ul><li>DataSource 設定  (JDBC) </li></ul></ul><ul><ul><li>ActionForm 設定  重要 ! </li></ul></ul><ul><ul><li>Global 相關設定 </li></ul></ul><ul><ul><li>ActionMapping 設定  重要 ! </li></ul></ul><ul><ul><li>Controller 設定 </li></ul></ul><ul><ul><li>其它設定 (i18n,plug-in,…) </li></ul></ul><ul><li>我們只講 ActionForm 及 ActionMapping ,其它 config 的細節請自行參考 struts 線上文件。 </li></ul>
    • 89. ActionForm 區段 <ul><li>目的 : 在此宣告你寫的 ActionForm 及其代名 ( 你要怎麼稱呼他 ?) ,以便在 ActionMapping 中做相對設定。 </li></ul><ul><li>以 &lt;form-beans&gt;…&lt;/form-beans&gt; 為界。 </li></ul><ul><li>&lt;form-beans&gt; 中包含數個 &lt;form-bean&gt; 。 </li></ul>
    • 90. ActionForm 區段 <ul><li>&lt;form-beans&gt; </li></ul><ul><li>&lt;form-bean </li></ul><ul><li>name=&amp;quot;userNameForm&amp;quot; </li></ul><ul><li>type=&amp;quot;simple.form.SimpleForm“ </li></ul><ul><li>/&gt; </li></ul><ul><li>&lt;form-bean </li></ul><ul><li>name=“anotherForm&amp;quot; </li></ul><ul><li>type=&amp;quot;simple.form.AnotherForm“ </li></ul><ul><li>/&gt; </li></ul><ul><li>&lt;/form-beans&gt; </li></ul>ActionMapping 區段將使用這個名字來指稱你的 FormBeans
    • 91. ActionMappings 區段 <ul><li>目的 : 將 jsp 背後的 ActionForm 、發出的 url 、 Action class 及其處理完後要 forward 的對象,四者間的關係連結起來。 </li></ul>
    • 92. ActionMappings 區段 <ul><li>如何將以下這幾個 component 的關係化成文字 ? </li></ul>index.jsp SayHelloAction hello.jsp ActionServlet /sayHello.do success Request Scope UserNameForm
    • 93. ActionMappings 區段 <ul><li>&lt;action-mappings&gt; </li></ul><ul><li>&lt;action path =&amp;quot;/sayHello&amp;quot; </li></ul><ul><li>type =&amp;quot;simple.action.SayHelloAction&amp;quot; </li></ul><ul><li>name =&amp;quot;userNameForm&amp;quot; </li></ul><ul><li>scope =&amp;quot;request&amp;quot; </li></ul><ul><li>input =“index.jsp” &gt; </li></ul><ul><li>&lt;forward name=&amp;quot;success&amp;quot; path=&amp;quot;/hello.jsp&amp;quot;/&gt; </li></ul><ul><li>&lt;/action&gt; </li></ul><ul><li>&lt;action&gt;…..&lt;/action&gt; </li></ul><ul><li>&lt;action&gt;…..&lt;/action&gt; </li></ul><ul><li>&lt;/action-mappings&gt; </li></ul>要將 .do 去掉
    • 94. Struts Application Demo(1) - 使用 JBuilder X
    • 95. 系統設計 askName.jsp ProcessNameAction sayHello.jsp ActionServlet /processName.do sayHello Request Scope UserNameForm
    • 96. 輸入驗証 (Validation) <ul><li>Client side validation </li></ul><ul><li>Server side validation </li></ul><ul><ul><li>實作 ActionForm.validate() </li></ul></ul>
    • 97. Struts 的輸入驗証架構
    • 98. 實作 validation 步驟 <ul><li>在 ActionForm 中實作 validate 方法 </li></ul><ul><li>struts-config.xml 中的 &lt;action&gt; 標籤中之 validate 屬性設為 true </li></ul><ul><li>設定 ApplicationResource.properties </li></ul><ul><li>寫作 ActionError 與錯誤訊息 </li></ul>
    • 99. Struts Application Demo(2) -validation
    • 100. Struts 就這樣嗎 ? <ul><li>還有很多有趣的細節等待你發掘。 </li></ul><ul><li>Tiles – Template framework </li></ul><ul><li>更多 Default Action Classes </li></ul><ul><li>ProcessBean </li></ul><ul><li>Validating Framework </li></ul><ul><li>Exception Handling </li></ul><ul><li>I18n </li></ul>建議參考書藉 – Struts in Action by T.Husted et al.
    • 101. 其它注意事項
    • 102. Q &amp; A <ul><li>[email_address] </li></ul><ul><li>http://java.cc.nccu.edu.tw </li></ul>
    • 103. backup
    • 104. Request Dispatching <ul><li>/sales /report ? month=Jan </li></ul>Servlet Context Context Path Query String
    • 105. Framework 進階閱讀 <ul><li>Building Application Framework (Wiley)- 這本很像論文集,不好唸且錯誤很多,宜以讀書會方式加以了解。 </li></ul><ul><li>Java Application Framework (Wiley). </li></ul><ul><li>應用架構入門與實例 – 台灣本土唯一一本 Framework 著作,但是是數年前的著作,前幾章仍有閱讀的價值。 ( 可自 MISOO 上自由下傳 ) 。 </li></ul>
    • 106. Design Patterns 學習地圖 <ul><li>精通任一種 OO 語言及 OO 基本觀念 ( 繼承封裝多形 ) 。 </li></ul><ul><ul><li>Thinking in Java( 有中譯本 ) . </li></ul></ul><ul><li>Design Patterns 入門 </li></ul><ul><ul><li>Java 與樣式理論 / Java 與樣式實作 ( 閻宏 ) </li></ul></ul><ul><ul><li>Applying UML and Patterns: An Introduction to Object-Oriented Analysis, 2/e( 有中譯本 ) </li></ul></ul><ul><ul><li>Design Patterns Explained: A New Perspective on Object-Oriented Design( 有中譯本 ) </li></ul></ul><ul><ul><li>Design Patterns 於 Java 語言上的實習應用 ( 有中譯本 ) </li></ul></ul>
    • 107. Design Patterns 學習地圖 2 <ul><li>觀察別人如何使用 Patterns(Java) </li></ul><ul><ul><li>Java Design Patterns: A Tutorial </li></ul></ul><ul><ul><li>Applied Java Patterns( 有中譯本 ) </li></ul></ul><ul><ul><li>Patterns in Java VI,V2. </li></ul></ul><ul><li>活用 Patterns </li></ul><ul><ul><li>Design Patterns Java Workbook( 有中譯本 ) </li></ul></ul><ul><ul><li>Pattern Hatching: Design Patterns Applied( 這本是以 C++ 為例 ). </li></ul></ul>
    • 108. Design Patterns 學習地圖 3 <ul><li>經典 </li></ul><ul><ul><li>Gof( 有中譯本 ) </li></ul></ul><ul><li>Architectural Patterns </li></ul><ul><ul><li>Patterns of Enterprise Application Architecture </li></ul></ul><ul><ul><li>Pattern Oriented Software Architecture (POSA) </li></ul></ul><ul><ul><ul><li>這本書 scope 非常廣,包含了 Software Architecture 、 Architectural Patterns 、 Design Patterns 及 Idioms 。 </li></ul></ul></ul>
    • 109. Design Patterns 學習地圖 4 <ul><li>Enterprise Design Patterns </li></ul><ul><ul><li>Patterns in Java V3 </li></ul></ul><ul><ul><li>POSA2 </li></ul></ul><ul><ul><li>Core J2EE Patterns / 2e </li></ul></ul><ul><ul><li>P of EAA </li></ul></ul><ul><li>HillSide Group( http://hillside.net ) - 由 Kent Beck 及 Grady Booch 建立,是 Pattern 族群的聖殿。 </li></ul>

    ×