Struts Mitac(1)

6,237 views

Published on

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

No Downloads
Views
Total views
6,237
On SlideShare
0
From Embeds
0
Number of Embeds
28
Actions
Shares
0
Downloads
63
Comments
0
Likes
2
Embeds 0
No embeds

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

    1. 1. J2EE 前端應用程式架構與 Struts Framework 廖峻鋒 NCCU Computer Center Feb 2,2003
    2. 2. Agenda <ul><li>Struts 簡介與定位 </li></ul><ul><li>Web-tier 概觀 </li></ul><ul><li>Framework & 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. 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. 4. Must Read when Architecting J2EE Applications P of EAA Core J2EE Patterns 2/e
    5. 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. 6. Struts Framework 的定位 Web tier / Persistence /workflow Your Code WebLogic / WebSphere ? jRocket VM / JDK ? Linux / Windows ? Struts is one of your architectural decisions
    7. 7. How Struts fits into RUP ? Architecture should be finished
    8. 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. 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. 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. 11. Framework and Design Patterns Struts Framework is built upon several well-known proven patterns 簡介
    12. 12. <ul><li>如果建築師都用軟體工程師的方法來建造房子,那麼第一隻飛來的啄木鳥便足以將整個文明都給摧毀。 </li></ul><ul><ul><li>- Applied Java Patterns by Stephen Stelting and Olava Maassen </li></ul></ul>
    13. 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. 14. <ul><li>Two primary books </li></ul><ul><ul><li>POSA </li></ul></ul><ul><ul><li>Gof </li></ul></ul>
    15. 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. 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. 17. 框架與應用程式的關係 <ul><li>框架可以看成是整個應用程式的 骨架 ,程式開發人員將框架 客製化 以寫出真正的應用程式。 </li></ul>框架 ( 抽象的、不能使用 ) 應用程式 ( 具體的、可以使用的 ) 客製化
    18. 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. 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. 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. 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. 22. Framework and Design Patterns 幾個常用到的基本技巧
    23. 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. 24. Inversion of Control Library 使用者的實作 Framework 使用者的實作
    25. 25. Library Reuse <ul><li>String countStr = “256”; </li></ul><ul><li>String count = Integer.parseInt (countStr); </li></ul>你控制流程, Library 提供實作 ! Structured Style!
    26. 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. 27. 建構框架基本原則 -Essential Framework construction principles Unification Separation
    28. 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. 29. 範例 :LoginHandler
    30. 30. Unification Template method Hook method template 、 hook 在同一個 Class
    31. 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. 32. Servlet
    33. 33. Interface <ul><li>Interface 規定了一組契約 (method) ,所有實作它的類別都要實作 所有方法 。 </li></ul><ul><li>Client 呼叫的是 Interface 中的方法,所以元件的抽換對 Client 來說是感覺不到的 ( 不用改 code) 。 </li></ul>
    34. 34. 實作界面就可保証符合規格
    35. 35. java.io.FilenameFilter ps. 其實這是一個 strategy pattern
    36. 36. Separation Template method Hook method Template Class 與 Hook Class 有委任關係 Observer Pattern
    37. 37. 範例 : 時常需要切換多台資料庫 template method hook method 在 template method 中呼叫 hook method
    38. 38. 討論 : 彈性的登入機制 Which is template method ? which is hook method ?
    39. 39. Struts Architectural Overview
    40. 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. 41. Model 1 在 JSP 中決定下一頁是那裏,所以稱為 Page Controller ,通常 Page Controller 會有多個。 (PEAA) ASP.NET 的標準做法
    42. 42. Model 1 : Page Controller login.jsp 資料庫 index.htm index.jsp 在 JSP 中決定下一頁是那裏,所以稱為 Page Controller Java Bean Request or Session Scope
    43. 43. Model 1 有什麼問題 ? Servlet/ JSP Servlet/ JSP Servlet/ JSP Web Server Servlet/ JSP One controller per page , hard to maintain !
    44. 44. MVC : Separation of Concern C V M
    45. 45. Model 2 - MVC index.jsp BO index.htm ControllerServlet Java Bean read data set data Request or Session Scope Forward/Redirect
    46. 46. Controller Split index.jsp LoginAction BO Request or Session Scope index.htm Java Bean Controller
    47. 47. Controller Split in Struts Controller = ActionServlet + Action Classes
    48. 48. MVC index.jsp LoginAction BO Request or Session Scope index.htm Java Bean Model View Controller Controller
    49. 49. Struts 的 MVC 模型 index.jsp Action Class Business Logic Request or Session Scope index.htm ActionForm Model View Controller ActionServlet
    50. 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. 51. MVC Implementations <ul><li>Hans MVC </li></ul><ul><li>Struts Framework </li></ul>
    52. 52. MVC 實作基本觀念 (1) index . do Action String Controller String Controller String 用來指定 Controller 類別來處理 Action String 用來指定要交給那個 Action 類別處理 http://localhost:8080/jpetstore/ index.do
    53. 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. 54. Hans MVC
    55. 55. 簡單的 MVC 實作 查表
    56. 56. Struts modifications struts-config.xml ActionServlet + RequestProcessor Abstract Action
    57. 58. 使用 ActionForm 來協助處理 HTML 表單 <ul><li>每一個 HTML Form 背後都有一個 ActionForm 來 support 。 </li></ul>id password <<ActionForm>> LoginActionForm id password getId()/setId() getPassword() setPassword() reset() validate()
    58. 59. ActionForm 的處理 askName.jsp ProcessNameAction ActionServlet /processName.do UserNameForm ActionSerlvet 會依據 config 檔 將使用者填入的資料填入 ActionForm 中 ActionForm 的會以參數的形式傳給 Action 類別, 供開發者在取得 ActionForm 的資料 <<ActionForm>> <<Action>>
    59. 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>
    60. 61. struts-config.xml ActionForm 設定 ActionMapping 設定
    61. 62. struts-config.xml 的處理
    62. 63. Author: Jean-Michel Garnier , http://rollerjm.free.fr/pro/Struts11.html
    63. 64. Developing Web Applications with Struts Framework
    64. 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>
    65. 66. Struts - View
    66. 67. JSP 的寫作 : 二種選擇 <ul><li>JSTL </li></ul><ul><ul><li><c:out value=“$ {sessionScope.userBean.name }” /> </li></ul></ul><ul><li>Struts-bean </li></ul><ul><ul><li><bean:write name=“ userBean ” property=“ name ” /> </li></ul></ul>
    67. 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 優先 !
    68. 69. JSTL 與 Struts tag 取捨準則 <ul><li>( 摘自 Struts in Action by Ted Husted) </li></ul><ul><ul><li>使用 JSTL 取代 <bean:…> 與 <logic:…> </li></ul></ul><ul><ul><li>繼續使用 <html:……> </li></ul></ul><ul><li>目前 Struts 正在開發 Struts-EL ,未來在 <html:…> 中將可使用 Expression Language . </li></ul>
    69. 70. 使用 Struts 控制項 取代傳統 Html 控制項 <ul><li>目的 : 使用 Struts 的 html 控制項才能利用 ActionForm 的好處。 </li></ul><ul><li>有時會和 JSTL 一起合併使用。 </li></ul>
    70. 71. 傳統的 Html Form <ul><li><html> </li></ul><ul><ul><li><body> </li></ul></ul><ul><ul><ul><li><form action=“sayHello.do”> </li></ul></ul></ul><ul><ul><ul><li><input type=“text” name=“userName”/> </li></ul></ul></ul><ul><ul><ul><li><input type=“submit” /> </li></ul></ul></ul><ul><ul><ul><li></form> </li></ul></ul></ul><ul><ul><li></body> </li></ul></ul><ul><li></html> </li></ul>
    71. 72. 使用 Struts 控制項 取代 html 控制項 <ul><li>修改 web.xml </li></ul><ul><li>副檔名改成 .jsp </li></ul><ul><li>修改 tag </li></ul>
    72. 73. <ul><li>修改 web.xml </li></ul><ul><li><taglib> </li></ul><ul><li><taglib-uri>/WEB-INF/struts-html.tld</taglib-uri> </li></ul><ul><li><taglib-location> </li></ul><ul><li>/WEB-INF/tld/struts-html.tld </li></ul><ul><li></taglib-location> </li></ul><ul><li></taglib> </li></ul>使用 Struts 控制項 取代傳統 html 控制項 隨便取個名字,識別用 . TLD 真正的位置
    73. 74. 使用 Struts 控制項 取代傳統 html 控制項 <%@ taglib uri=&quot;/WEB-INF/struts-html.tld&quot; prefix=&quot;html&quot; %> <html:html> <html:form action=“sayHello.do”> <html:text property=“userName” /> <html:submit /> </html:form> </html:html> 要先宣告 前面加上 html 的 prefix 相同 !
    74. 75. HTML 的 Form 如何與 ActionForm 對映 ? <ul><li>基本上每一個 <html:form>……</html:form> 背後都會有一個 ActionForm 。 </li></ul><ul><li>表單的每一個輸入欄位原則上對映到 JavaBean 的一個 property 。 </li></ul>
    75. 76. 範例 <ul><li><html:html> </li></ul><ul><li><html:form action=“sayHello.do”> </li></ul><ul><li><html:text name=“userNameForm” property=“userName” /> </li></ul><ul><li><html:text name=“userNameForm” property=“password” /> </li></ul><ul><li><html:submit /> </li></ul><ul><li></html:form> </li></ul><ul><li></html:html> </li></ul>ActionForm 名稱 所對映到的屬性
    76. 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>如果欄位很多,寫起來很麻煩 ?
    77. 78. 在那裏登記 ActionForm? ActionForm 設定
    78. 79. 登記 ActionForm <ul><li><form-bean </li></ul><ul><li>name=“userNameForm” </li></ul><ul><li>type=“demo.UserNameForm” </li></ul><ul><li>/> </li></ul><ul><li>其它屬性 </li></ul><ul><li>className – 指定 FormBeanConfig 類別。 </li></ul><ul><li>dynamic – 是否使用 DynaForm ? </li></ul>ActionForm 類別名稱 ActionForm 的名字,將在 ActionMapping 區段中使用
    79. 80. 使用 DynaBean <ul><li><form-bean </li></ul><ul><li>name=“userNameForm” </li></ul><ul><li>type=“ org.apache.struts.action.DynaActionForm ” </li></ul><ul><li>dynamic=“ true ” > </li></ul><ul><ul><li><form-property name=“userName” type=“java.lang.String”/> </li></ul></ul><ul><ul><li><form-property name=“password” type=“java.lang.String”/> </li></ul></ul><ul><li></form-bean> </li></ul>使用單一 Map 物件儲存所有 JavaBean 的屬性 登記屬性名稱
    80. 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&quot;)); </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>讀取 ActionForm 的資料 以參數形式傳入 取得 ActionForm 的參考
    81. 82. Action Class
    82. 83. (revisited) Struts 的 MVC 模型 index.jsp Action Class Business Logic Request or Session Scope index.htm ActionForm Model View Controller ActionServlet
    83. 84. Action 做些什麼 ? <ul><li>從 ActionForm 中取得資料 </li></ul><ul><li>從 request/response 中取得資料 </li></ul><ul><li>委任商業邏輯 ( 含資料庫存取 ) </li></ul><ul><li>將控制權 forward 到合適的 View 中 </li></ul>
    84. 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&quot;)); </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
    85. 86. ActionServlet 使用 struts-config.xml 控制 ActionServlet 行為 !
    86. 87. Struts-config.xml <ul><li>Struts 的核心,用來描述各元件的關係。 </li></ul><ul><li>市面上有很多 GUI 工具可支援自動產生。 </li></ul>
    87. 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>
    88. 89. ActionForm 區段 <ul><li>目的 : 在此宣告你寫的 ActionForm 及其代名 ( 你要怎麼稱呼他 ?) ,以便在 ActionMapping 中做相對設定。 </li></ul><ul><li>以 <form-beans>…</form-beans> 為界。 </li></ul><ul><li><form-beans> 中包含數個 <form-bean> 。 </li></ul>
    89. 90. ActionForm 區段 <ul><li><form-beans> </li></ul><ul><li><form-bean </li></ul><ul><li>name=&quot;userNameForm&quot; </li></ul><ul><li>type=&quot;simple.form.SimpleForm“ </li></ul><ul><li>/> </li></ul><ul><li><form-bean </li></ul><ul><li>name=“anotherForm&quot; </li></ul><ul><li>type=&quot;simple.form.AnotherForm“ </li></ul><ul><li>/> </li></ul><ul><li></form-beans> </li></ul>ActionMapping 區段將使用這個名字來指稱你的 FormBeans
    90. 91. ActionMappings 區段 <ul><li>目的 : 將 jsp 背後的 ActionForm 、發出的 url 、 Action class 及其處理完後要 forward 的對象,四者間的關係連結起來。 </li></ul>
    91. 92. ActionMappings 區段 <ul><li>如何將以下這幾個 component 的關係化成文字 ? </li></ul>index.jsp SayHelloAction hello.jsp ActionServlet /sayHello.do success Request Scope UserNameForm
    92. 93. ActionMappings 區段 <ul><li><action-mappings> </li></ul><ul><li><action path =&quot;/sayHello&quot; </li></ul><ul><li>type =&quot;simple.action.SayHelloAction&quot; </li></ul><ul><li>name =&quot;userNameForm&quot; </li></ul><ul><li>scope =&quot;request&quot; </li></ul><ul><li>input =“index.jsp” > </li></ul><ul><li><forward name=&quot;success&quot; path=&quot;/hello.jsp&quot;/> </li></ul><ul><li></action> </li></ul><ul><li><action>…..</action> </li></ul><ul><li><action>…..</action> </li></ul><ul><li></action-mappings> </li></ul>要將 .do 去掉
    93. 94. Struts Application Demo(1) - 使用 JBuilder X
    94. 95. 系統設計 askName.jsp ProcessNameAction sayHello.jsp ActionServlet /processName.do sayHello Request Scope UserNameForm
    95. 96. 輸入驗証 (Validation) <ul><li>Client side validation </li></ul><ul><li>Server side validation </li></ul><ul><ul><li>實作 ActionForm.validate() </li></ul></ul>
    96. 97. Struts 的輸入驗証架構
    97. 98. 實作 validation 步驟 <ul><li>在 ActionForm 中實作 validate 方法 </li></ul><ul><li>struts-config.xml 中的 <action> 標籤中之 validate 屬性設為 true </li></ul><ul><li>設定 ApplicationResource.properties </li></ul><ul><li>寫作 ActionError 與錯誤訊息 </li></ul>
    98. 99. Struts Application Demo(2) -validation
    99. 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.
    100. 101. 其它注意事項
    101. 102. Q & A <ul><li>[email_address] </li></ul><ul><li>http://java.cc.nccu.edu.tw </li></ul>
    102. 103. backup
    103. 104. Request Dispatching <ul><li>/sales /report ? month=Jan </li></ul>Servlet Context Context Path Query String
    104. 105. Framework 進階閱讀 <ul><li>Building Application Framework (Wiley)- 這本很像論文集,不好唸且錯誤很多,宜以讀書會方式加以了解。 </li></ul><ul><li>Java Application Framework (Wiley). </li></ul><ul><li>應用架構入門與實例 – 台灣本土唯一一本 Framework 著作,但是是數年前的著作,前幾章仍有閱讀的價值。 ( 可自 MISOO 上自由下傳 ) 。 </li></ul>
    105. 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>
    106. 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>
    107. 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>
    108. 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>

    ×