Struts開始于2000年3月,是采用Java Servlet/JavaServer Pages技術,開發Web應用程序的開放源碼的框架。當前最新的正式版本是1.0.2,本文內容就是針對這個版本的。采用Struts能開發出基于MVC(Model-View-Controller)設計模式的Java Web前端應用。通常MVC設計模式把一個系統劃分為相互協作的三個部分: 1. Model(模型),模型用于封裝系統的狀態,比如業務數據; 2. View(視圖),視圖是模型的表示,提供用戶交互界面。當模型狀態發生變化時,視圖應該得到通知,以便更新模型的變化; 3. Controller(控制器),接受來自視圖的請求,修改模型的狀態; 但是,在基于JSP/Servlet的Web應用中要使用MVC模式,需要解決這樣一個問題,就是HTTP的底層是TCP/IP協議,而TCP/IP是一種無狀態連接的協議,如果我們的模型發生了變化,就無從通知視圖。而Struts采用了在“JSP規范v0.92”中就提出的MVC Model 2,這是對MVC在Web上應用的修訂版,它可以解決這個問題,見圖1。 ![]() ![]() Struts應用有3個主要部件:一個是使用Servlet實現的中心控制器(Controller Servlet,由Struts提供的org.apache.action. ActionServlet類實現)及負責具體業務邏輯處理的Action(org.apache.action.Action的子類);一個是用于顯示的JSP頁面(viewer);另一個是用于封裝系統狀態的業務邏輯元件(Model)。Struts 的中心控制器接受所有來自客戶端的請求,并根據系統的配置(struts-config.xml)路由HTTP請求到其它Action對象(開發者實現的org.apache.struts. action.Action的子類)。在這些Action對象中會完成所有的業務操作,比如插入一條訂單、修改一條記錄等。處理完畢,由Struts的Controller Servlet根據配置轉向到適當的JSP頁面,將處理結果顯示給用戶。從這里可以看出,在Struts中Controller Servlet擔任了重要的角色,它控制所有的程序流轉,使MVC三個相對獨立的部分協調工作,從而使系統的功能更加完善。從圖1可見Struts是MVC Model 2的一個典型應用。 你可以從http://jakarta.apache.org/builds/jakarta-struts/release/下載Struts最新的二進制版本和源碼。首先進入v1.0.2下載頁面,下載jakarta-struts-1.0.2.zip(3.4MB),然后將jakarta-struts-1.0.2.zip解壓。其中包含lib和webapps兩個子目錄。lib子目錄中是使用Struts需要的Jar文件、標簽庫定義文件(.tld),以及對一個Struts Web應用的web.xml和struts-config.xml配置文件的DTD定義(.dtd)。webapps子目錄中包含了幾個Struts的示例應用,都已打包為.war格式,這里主要介紹其中三個: 1. struts-example.war,一個采用Struts框架的簡單的示例程序Controller; 2. struts-documentation.war,Struts文檔的war包; 3. struts-blank.war,一個空白的Struts的應用,可以方便地修改,并且配置自己的應用。 下面運行struts-example這個示例程序。因為Struts是一個Web應用,所以要運行這個示例需要一個兼容Servlet 2.2、JSP 1.1以上規范的Web容器。本文以Tomcat 3.3a(對Tomcat 4.0也適用)為例進行介紹。首先保證Tomcat可以正常運行。而運行struts example不需要其它特殊配置的,只要把struts-example.war拷入Tomcat下的webapps目錄,Tomcat在啟動時就會自動解壓了。然后啟動Tomcat,在瀏覽器中輸入http://localhost:8080/struts-example,如果能看到如圖3頁面,就說明已經運行成功。 在圖3中你可以點擊“Register with the MailReader Demonstration Application”注冊一個MailReader用戶,或直接點擊“Log on to the MailReader Demonstration Application”,輸入用戶名和密碼(示例程序已經預置了一個用戶user/pass,配置在struts-example下的WEB-INF\database.xml文件中)登入。 web.xml 在圖3所示的頁面中,點擊“Log on to the MailReader Demonstration Application”鏈接,進入/logon.jsp頁面,輸入預定義的用戶名為user、密碼為pass,然后提交就進入了圖4的用戶主頁面。 ![]() ![]() 大家可能已經注意到了,這里的URL的后綴是.do。那么它有什么意義?服務器又是怎樣處理這樣的請求呢?下面我們看看{TOMCAT}\WEB-INF\web.xml文件,就會非常清楚。在web.xml中,你可以找到如下配置片斷:
從上面配置代碼中可以知道,以.do結尾的請求URL是由一個名為action的Servlet處理,實際上可以為應用取另一個后綴,只要修改
由此可見,action對應的類是org.apache.struts.action.ActionServlet。這是一個Struts提供的處于中心控制地位的Servlet,即圖2中的Controller Servlet,正是用它監聽所有的來自于用戶的以.do為后綴的請求。在上面的配置中,為ActionServlet配置了一個名為config的初始化參數,值為 /WEB-INF/struts-config.xml,struts-config.xml是一個基于Struts應用的最重要的配置文件,其中包含了所有的Action請求(指以.do結尾的請求)、相應的Action處理類、Form Bean,以及頁面的轉向等信息的配置。struts-config.xml在應用啟動時讀入,然后根據這些配置進行響應。下面以示例程序中的LogonAction的配置為例,對struts-config.xml進行分析。 struts-config.xml 下面是struts-config.xml中對LogonAction進行配置的部分代碼:
從上面可以看出,MailReader應用中對/logon.do的請求是由org.apache.struts.webapp.example. LogonAction類進行處理的,name屬性指定的是這個請求對應的表單。 logonForm也是在struts-config.xml中配置的,配置代碼為:
LogonForm類是一個普通的JavaBean,其中定義了幾個屬性及屬性的讀寫方法,而且這些屬性的名字要和頁面表單中的輸入域對應。比如LogonForm中定義了兩個屬性,代碼如下:
這兩個屬性分別對應于logon.jsp表單中的兩個輸入域,代碼如下:
|
Action
現在我們已經對Struts前端應用框架的整體結構、數據流轉有了一定的認識。也知道了Struts是怎樣從配置文件中獲取配置信息的,即先啟動,然后等待請求,再從前臺抓取數據,根據配置信息調用(或生成)Action類進行處理,最后根據處理的結果轉向到對應的頁面響應用戶。那么,現在就讓我們看看LogonAction是怎樣進行業務處理,并將處理結果顯示給用戶的。代碼如下:
|
LogonAction類繼承于org.apache.struts.action.Action,Action類是所有的Action的基類。其中定義的perform()方法完成對請求處理,并根據處理結果轉向到不同的頁面,然后顯示給用戶。Action類并不是Servlet,它不直接監聽來自客戶端的請求。上面所提到的中心控制器ActionServlet是一個Servlet,客戶端發出的Action請求,由ActionServlet接收,根據struts-config.xml中的配置,傳入對應的mapping、form、request、response對象,并調用對應的Action類的perform()方法進行處理(在第一次調用時,實例化一個Action,隨后的請求將直接調用已存在的Action類進行處理,所以Action類是共享的,編程中注意處理并發問題)。下面對上述的LogonAction的perform()方法進行簡單的分析。
1. 首先從傳入的form對象中獲取username和password。大家可能會奇怪這兩個屬性是在什么時候置入的?這是ActionServlet在調用LogonAction的perform()方法之前根據struts-config.xml中的配置及對應的LogonForm中的屬性從前端請求抓取數據,置入LogonForm對象的。然后進行用戶驗證。本例沒有使用數據庫進行存儲,用戶信息是存儲在database.xml文件中的。如果username/password在database.xml文件不存在或密碼錯誤,則生成一個ActionError對象,將錯誤信息存儲到該對象中,并把這個對象添加到ActionErrors中,其它發生的錯誤也類似處理。在隨后的程序中,首先校檢是否有錯誤發生,如果有錯誤發生,就把錯誤對象存儲到request中,使用的方法為saveErrors(request, errors)。該方法是在基類org.apache.struts.action.Action中實現的,它完成的功能很簡單,將errors對象通過setAttribute()方法存儲到request中即可。實現如下:
|
如果發生錯誤,將重定向到輸入頁面,同時自動完成輸入域的重填,代碼如下:
|
如果在圖5所示頁面輸入user/abc提示上面的錯誤,那么原來輸入的username域就會自動填充進來了。在一個有大量輸入域的表單會大大方便用戶。

2. 在上面的程序執行通過后,就說明這是一個合法登陸。我們要做的就是把當前用戶保存到session中,同時清除已經無效的Form Bean,最后轉向到success頁面,代碼為:
|
一個ActionMapping對象對應于struts-config.xml中的一個
|
這個Forward配置將對所有的Action都有效。但如果
延伸閱讀
文章來源于領測軟件測試網 http://www.kjueaiud.com/