Sung in Blog

                     一些技術文章 & 一些生活雜碎
          1、 摘要
          2、 關鍵詞
          3、 Framework
          4、 Struts的起源
          5、 Struts工作原理
          6、 Struts安裝
          7、 一個實例
          8、 Struts優缺點
          9、 Struts項目實施經驗
          10、 總結
          11、 參考文獻

          1、 摘要
            本文主要講述了Struts(以Struts1.0.2為例)的工作原理,安裝以及配置方面的問題。然后結合一個實例,詳細討論了Struts在實際開發過程中的應用,最后提供一些在開發過程中積累的經驗,供大家參考。

          2、關鍵詞
          Struts、MVC、J2EE、Tiles、Framework

          3、Framework
            Framework即架構(框架),這里指軟件的架構方式,為什么要提Framework呢?請允許我從J2EE講起。
            J2EE體系包括JSP、Servlet、EJB、WEB SERVICE等多項技術。這些技術的出現給電子商務時代的WEB應用開發提供了一個非常有競爭力的選擇。怎樣把這些技術組合起來,形成一個適應項目需要的穩定架構是項目開發過程中一個非常重要的步驟。
            此步驟一般主要由架構設計師完成,設計師將根據項目需求,對J2EE體系中的各處技術進行篩選取舍,并考慮到開發過程中的角色分工、后期的運行維護,以及系統擴展性等諸多因素,建立系統的架構。
            一個成功的軟件需要有一個成功的架構,但軟件架構的建立是一個復雜而又持續改進的過程,軟件開發者們不可能對每個不同的項目做不同的架構,而總是盡量重用以前的架構,或開發出盡量通用的架構方案,Struts就是其中之一,Struts是流行的基于J2EE的架構方案,其他常用的基于J2EE的架構方案還有Turbine、RealMothods等。

          4、Struts的起源
            Struts最早是作為Apache Jakarta項目的組成部分問世運做。項目的創立者希望通過對該項目的研究,改進和提高Java Server Pages (JSPs)、Servlet、標簽庫以及面向對象的技術水準。當前最高發行版本為Struts1.0.2,可以到http://jakata.apache.org/Struts下載。
            Struts這個名字來源于在建筑和舊式飛機中使用的支持金屬架。它的目的是為了幫助你減少在運用MVC設計模型來開發Web應用的時間。你仍然需要學習和應用該架構,不過它將可以完成其中一些繁重的工作。如果想混合使用Servlets和JSP的優點來建立可擴展的應用,Struts是一個不錯的選擇。

          5、Struts工作原理
            MVC即Model-View-Controller的縮寫,是一種常用的設計模式。MVC 減弱了業務邏輯接口和數據接口之間的耦合,以及讓視圖層更富于變化。MVC的工作原理,如下圖1所示:


            Struts 是MVC的一種實現,它將 Servlet和 JSP 標記(屬于 J2EE 規范)用作實現的一部分。Struts繼承了MVC的各項特性,并根據J2EE的特點,做了相應的變化與擴展。Struts的工作原理,如下圖2所示:


          控制:通過圖2大家可以看到有一個XML文件Struts-config.xml,與之相關聯的是Controller,在Struts中,承擔MVC中Controller角色的是一個Servlet,叫ActionServlet。ActionServlet是一個通用的控制組件。這個控制組件提供了處理所有發送到Struts的HTTP請求的入口點。它截取和分發這些請求到相應的動作類(這些動作類都是Action類的子類)。另外控制組件也負責用相應的請求參數填充 Action From(通常稱之為FromBean),并傳給動作類(通常稱之為ActionBean)。動作類實現核心商業邏輯,它可以訪問java bean 或調用EJB。最后動作類把控制權傳給后續的JSP 文件,后者生成視圖。所有這些控制邏輯利用Struts-config.xml文件來配置。

          視圖:主要由JSP生成頁面完成視圖,Struts提供豐富的JSP 標簽庫: Html,Bean,Logic,Template等,這有利于分開表現邏輯和程序邏輯。

          模型:模型以一個或多個java bean的形式存在。這些bean分為三類:Action Form、Action、JavaBean or EJB。Action Form通常稱之為FormBean,封裝了來自于Client的用戶請求信息,如表單信息。Action通常稱之為ActionBean,獲取從ActionSevlet傳來的FormBean,取出FormBean中的相關信息,并做出相關的處理,一般是調用Java Bean或EJB等。
          流程:在Struts中,用戶的請求一般以*.do作為請求服務名,所有的*.do請求均被指向ActionSevlet,ActionSevlet根據Struts-config.xml中的配置信息,將用戶請求封裝成一個指定名稱的FormBean,并將此FormBean傳至指定名稱的ActionBean,由ActionBean完成相應的業務操作,如文件操作,數據庫操作等。每一個*.do均有對應的FormBean名稱和ActionBean名稱,這些在Struts-config.xml中配置。

          核心:Struts的核心是ActionSevlet,ActionSevlet的核心是Struts-config.xml。這在后面還會詳細討論。

          6、Struts安裝
            Struts的安裝比較簡單,下面的以Tomcat 4.0.4為例,講述安裝過程。
            首先請到http://jakarta.apache.org/Struts下載Struts,建議使用release版,現在最高版本為1.0.2,下載后得到的是一個ZIP文件。將ZIP包解開,可以看到這個目錄:lib和webapps,webapps下有一些WAR文件。
            假設你的Tomcat裝在c:\Tomcat下,則將那些WAR文件拷貝到C:\Tomcat\webapps,重新啟動Tomcat即可。
            打開瀏覽器,在地址欄中輸入:http://localhost:8080/Struts-example/index.jsp,若能見到“powered by Struts”的深藍色圖標,即說明成功了。這是Struts自帶的一個例子,附有詳細的說明文檔,可以做為初學者的入門教程。
            另外,Struts還提供了一系統實用對象:XML處理、通過Java reflection APIs自動處理JavaBeans屬性、國際化的提示和消息等。


          7、一個實例
            一個用戶注冊系統,用戶通過網頁輸入相關信息:注冊ID號,密碼,EMAIL,若注冊成功,則返回成功提示信息,反之出現注冊失敗提示信息。
          以下是相關文件的部分核心代碼。

          項目建立:
            正式開發前,需要在Tocmat(我的tomcat裝在c:\tomcat)中建立此項目。
          比較快的一種建立方式為:
            在C:\tomcat\webapps下新建目錄test,再將C:\tomcat\webapps\struts-example下的
          WEB-INF目錄拷貝到test目錄下,然后將test\WEB-INF下的src和classes目錄清空,以及struts-config.xml文件中內容清空即可。這樣,我們需要的Struts類包及相關的配置文件就都齊了。
            開發時,將JSP文件放在test目錄下,Java原文件放在test\WEB-INF\src下,編譯后的類文件放在test\WEB-INF\classes下。

          注冊頁面:reguser.jsp

          <%@ page contentType="text/html;charset=UTF-8" language="java" %>
          <%@ taglib uri="/WEB-INF/Struts-bean.tld" prefix="bean" %>
          <%@ taglib uri="/WEB-INF/Struts-html.tld" prefix="html" %>
          <html:html locale="true">
          <head>
          <title>RegUser</title>
          <html:base/>
          </head>
          <body bgcolor="white">
          <html:errors/>
          <html:form action="/regUserAction" focus="logname">
          <table border="0" width="100%">
          <tr>
          <th align="right">
          Logname:
          </th>
          <td align="left">
          <html:text property="logname" size="20" maxlength="20"/>
          </td>
          </tr>
          <tr>
          <th align="right">
          Password:
          </th>
          <td align="left">
          <html:password property="password" size="20" maxlength="20"/>
          </td>
          </tr>
          <tr>
          <th align="right">
          E-mail:
          </th>
          <td align="left">
          <html:password property="email" size="30" maxlength="50"/>
          </td>
          </tr>
          <tr>
          <td align="right">
          <html:submit property="submit" value="Submit"/>
          </td>
          <td align="left">
          <html:reset/>
          </td>
          </tr>
          </table>
          </html:form>
          </body>
          </html:html>

            此JSP頁面不同于普通的JSP頁,因為它大量運用了taglib,這些taglib對初學者而言,可能難于掌握,可這卻是Struts的精華之一。靈活運用,將大大提高開發效率。

          Struts-config.xml:

          <Struts-config>
          <form-beans>
          <form-bean name="regUserForm"
          type="org.cjea.Struts.example. RegUserForm "/>
          </form-beans>

          <action-mappings>
          <action path="/regUserAction"
          type=" org.cjea.Struts.example.RegUserAction "
          attribute=" regUserForm "
          scope="request"
          validate="false">
          <forward name="failure" path="/ messageFailure.jsp"/>
          <forward name="success" path="/ messageSuccess.jsp"/>
          </action>
          </action-mappings>
          </Struts-config>

            Struts的核心是Controller,即ActionServlet,而ActionServlet的核心就是Struts-config.xml,Struts-config.xml集中了所有頁面的導航定義。對于大型的WEB項目,通過此配置文件即可迅速把握其脈絡,這不管是對于前期的開發,還是后期的維護或升級都是大有裨益的。掌握Struts-config.xml是掌握Struts的關鍵所在。

          FormBean:RegUserForm

          package org.cjea.Struts.example;

          import javax.Servlet.http.HttpServletRequest;
          import org.apache.Struts.action.ActionForm;
          import org.apache.Struts.action.ActionMapping;

          public final class RegUserForm extends ActionForm{

          private String logname;
          private String password;
          private String email;

          public RegUserForm(){
          logname = null;
          password = null;
          email = null;
          }

          public String getLogName() {
          return this.logname;
          }
          public void setLogName(String logname) {
          this.logname = logname;
          }
          public void setPassWord(String password) {
          this.password = password;
          }
          public String getPassWord() {
          return this.password;
          }
          public void setEmail(String email) {
          this.email = email;
          }
          public String getEmail() {
          return this.email;
          }

          public void reset(ActionMapping mapping, HttpServletRequest request)
          {
          logname = null;
          password = null;
          email = null;
          }
          }

            每一個FormBean 都必須繼承ActionForm類,FormBean是對頁面請求的封裝。即把HTTP request 封裝在一個對象中,需要說明的一點就是多個HTTP request可以共用一個FormBean,便于維護和重用。

          ActionBean:RegUserAction

          package org.cjea.Struts.example;

          import javax.Servlet.http.*;
          import org.apache.Struts.action.*;

          public final class RegUserAction extends Action
          {

          public ActionForward perform(ActionMapping mapping,
          ActionForm form, HttpServletRequest req,
          HttpServletResponse res)
          {
          String title = req.getParameter("title");
          String password = req.getParameter("password");
          String email = req.getParameter("email");
          /*
          取得用戶請求,做相應數據庫操作,略
          */
          }
          }

            FormBean的產生是為了提供數據給ActionBean,在ActionBean中可以取得FormBean中封裝的數據,經相應的邏輯處理后,調用業務方法完成相應業務要求。

            Servlet的演變:在常規的 JSP,Servlet,JavaBean三層結構中,JSP實現View的功能,Servlet實現Controller的功能,JavaBean實現Model的實現。
            在Struts中,將常規情況下的Servlet拆分與ActionServlet、FormBean、ActionBean三個部分。ActionServlet配合Struts-config.xml,專職完成頁面導航,而不再負責具體的數據獲取與相應邏輯,這兩部分功能由FormBean和ActionBean來完成。

          8、Struts優缺點
          優點:
            Struts跟Tomcat、Turbine等諸多Apache項目一樣,是開源軟件,這是它的一大優點。使開發者能更深入的了解其內部實現機制。
            除此之外,Struts的優點主要集中體現在兩個方面:Taglib和頁面導航。Taglib是Struts的標記庫,靈活動用,能大大提高開發效率。另外,就目前國內的JSP開發者而言,除了使用JSP自帶的常用標記外,很少開發自己的標記,或許Struts是一個很好的起點。
            關于頁面導航,我認為那將是今后的一個發展方向,事實上,這樣做,使系統的脈絡更加清晰。通過一個配置文件,即可把握整個系統各部分之間的聯系,這對于后期的維護有著莫大的好處。尤其是當另一批開發者接手這個項目時,這種優勢體現得更加明顯。
          缺點:
            Taglib是Struts的一大優勢,但對于初學者而言,卻需要一個持續學習的過程,甚至還會打亂你網頁編寫的習慣,但是,當你習慣了它時,你會覺得它真的很棒。
            Struts將MVC的Controller一分為三,在獲得結構更加清晰的同時,也增加了系統的復雜度。
          Struts從產生到現在還不到半年,但已逐步越來越多運用于商業軟件。雖然它現在還有不少缺點,但它是一種非常優秀的J2EE MVC實現方式,如果你的系統準備采用J2EE MVC架構,那么,不妨考慮一下Struts。


          9、Struts項目實施經驗
            前段時間,我們基于Struts架構(結合Tiles),開發了一個WEB應用。以下是我們在項目過程中積累的一些經驗和吸取的教訓,望對各位有所幫助。
          1、 基于Struts架構的項目開發,首先需要有一個很好的整體規劃,整個系統中包括哪幾個模塊,每個模塊各需要多少FormBean和ActionBean等,而且最h有專人負責Struts-config.xml的管理。開發基于Struts的項目的難點在于配置管理,尤其是對Struts-config.xml的管理。
          2、 如果你的項目非常緊,并且項目組中又沒有富有經驗的Struts開發人員,建議不要冒然采用Struts。Struts的掌握需要一個過程,對于一個熟練的JSP程序員,自學大概需要半個月左右的時間。如果結合titls,則需要更長的時間。
          3、 如果你在網頁中大量運用taglib,那么你的美工將做出部分犧牲。當你結合Tiles,功能增強的同時,這種犧牲尤為明顯。當然,你對功能和美觀的取舍由你自己決定。
          4、 Taglib是一個好東西,但靈活運用它卻需要一個過程,如果你不想在Taglib上花太多的時間,那么只需理解與FORM有關的幾個標記,其它的標記就放著吧,以后再看,先去研究ActionServlet和Struts-config.xml,你會覺得很有成就感。
          5、 Struts的誕生時間雖不長,但與之相關的工具卻越來越多,如果你是用Jbuilder作為開發工具,那我可以為你推薦幾款優秀的open tools,極大的提高開發效率。
          6、 Struts是否只適合于大型項目呢?No!Struts適合于各種大小的項目,當然,對于大型項目,它所體現出來的優勢更加明顯。

          10、總結
            Struts是一種優秀的J2EE MVC架構方式。它利用taglib獲得可重用代碼和抽象 Java 代碼,利用ActionServlet配合Struts-config.xml實現對整個系統導航。增強了開發人員對系統的整體把握,提高了系統的可維護性和可擴充性。

          11、參考文獻
          1、 《Struts-documentation》
          2、 《當前流行的J2EE WEB應用架構分析》 龔永生 IBM開發者網站
          3、 《Struts,MVC 的一種開放源碼實現用這種Servlet和JSP框架管理復雜的大型網站》Malcolm G. Davis IBM開發者網站
          4、 《Jakarta Struts Book Review Project》 Chuck Cavaness Theserverside連載
          posted on 2005-10-26 16:30 Sung 閱讀(302) 評論(0)  編輯  收藏 所屬分類: Struts
          主站蜘蛛池模板: 大余县| 南丹县| 石狮市| 怀宁县| 万山特区| 稷山县| 汾阳市| 晋城| 南靖县| 伊春市| 迁西县| 邛崃市| 桐庐县| 阿鲁科尔沁旗| 菏泽市| 河北区| 柞水县| 大安市| 定结县| 黑河市| 舟曲县| 山阴县| 宝兴县| 东乡| 三门峡市| 富蕴县| 奈曼旗| 抚松县| 新乡县| 玉山县| 益阳市| 平阴县| 宜昌市| 娄底市| 安远县| 鹤岗市| 紫阳县| 济源市| 温州市| 宁陕县| 平邑县|