Struts原理、開發及項目實施

Struts原理、開發及項目實施 Holen 2002-9-12 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等,而且最好有專人負責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連載
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章