Struts作業指導手冊

來源:互聯網
上載者:User

作者:Junsan Jin

日期:2005-4-4

版本:1.0

信箱:junsan21@126.com ; junnef21@sohu.com

聲明:本人保留本文的所有權利。


第一部分:簡介
Struts開始於2000年3月,是採用Java Servlet/JavaServer Pages技術,開發Web應用程式的開放源碼的架構。




 


採用Struts能開發出基於MVC(Model-View-Controller)設計模式的Java Web前端應用。通常MVC設計模式把一個系統劃分為相互協作的三個部分:




 


1、  Model(模型),模型用於封裝系統的狀態,比如業務資料;




 


2、  View(視圖),視圖是模型的表示,提供使用者互動介面。當模型狀態發生變化時,視圖應該得到通知,以便更新模型的變化;




 


3、  Controller(控制器),接受來自視圖的請求,修改模型的狀態。




 


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、系統內容
作業系統:Windows XP SP1

WEB伺服器:TOMCAT 5.0.14


 

2、Struts版本
本文使用jakarta-struts-20031118版本(隸屬1.1版本系列),下載地址:

http://jakarta.apache.org/builds/jakarta-struts/release/



我們得到安裝包jakarta-struts-20031118.zip。


 

第三部分:安裝配置Struts1、安裝Struts
解壓縮jakarta-struts-20031118.zip包到E:\mylib\jakarta-struts中。其中包含有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的應用,可以方便地修改,並且配置自己的應用。




 


我們如果要建立新的應用,就使用第三個作為基本架構就行了。




 

2、運行struts-example.war
把struts-example.war拷入Tomcat下的webapps目錄。然後啟動Tomcat,Tomcat在啟動時就會自動解壓war包了(如果沒有自動解壓,察看你的tomcat伺服器是否配製成了直接運行war文檔的模式),在瀏覽器中輸入http://localhost:8080/struts-example,如果能看到如下圖所示頁面,就說明已經運行成功。




 









 


在上圖中你可以點擊“Register with the MailReader Demonstration Application”註冊一個MailReader使用者,或直接點擊“Log on to the MailReader Demonstration Application”,輸入使用者名稱和密碼(樣本程式已經預置了一個使用者user/pass,配置在struts-example下的WEB-INF\database.xml檔案中)登入。


3、對常式的分析(1)web.xml分析


在上圖所示的頁面中,點擊“Log on to the MailReader Demonstration Application”連結,進入/logon.jsp頁面,輸入預定義的使用者名稱為user、密碼為pass,然後提交就進入了下圖所示的使用者首頁面。




 







 


注意,這裡的URL的尾碼是.do。那麼它有什麼意義?伺服器又是怎樣處理這樣的請求呢?看看{TOMCAT}\WEB-INF\web.xml檔案,就會非常清楚。在web.xml中,可以找到如下配置片斷:




 


<!-- Action Servlet Mapping -->

<servlet-mapping>

<servlet-name>action</servlet-name>

<url-pattern>*.do</url-pattern>

</servlet-mapping>


 


從上面配置代碼中可以知道,以.do結尾的請求URL是由一個名為action的Servlet處理,實際上可以為應用取另一個尾碼,只要修改這裡就行了。




 


再看下面的一段配置摘要:




 


<!-- Action Servlet Configuration -->



<servlet>



<servlet-name>action</servlet-name>



<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>



<init-param>



<param-name>application</param-name>



<param-value>



org.apache.struts.webapp.example.ApplicationResources



</param-value>



</init-param>



<init-param>



<param-name>config</param-name>



<param-value>/WEB-INF/struts-config.xml</param-value>



</init-param>



……



<load-on-startup>2</load-on-startup>



</servlet>


 


由上可見,action對應的類是org.apache.struts.action.ActionServlet。這是一個Struts提供的處於中心控制地位的Servlet,即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進行分析。




 

(2)Struts-config.xml分析
下面是struts-config.xml中對LogonAction進行配置的部分代碼:




 


<action



 path="/logon"



 type="org.apache.struts.webapp.example.LogonAction"



 name="logonForm"



 scope="request"



 input="/logon.jsp">



</action>


 


從上面可以看出,MailReader應用中對應/logon.do的請求是由org.apache.struts.webapp.example. LogonAction類進行處理的,name屬性指定的是這個請求對應的表單所對應的模型組件。




 


logonForm也是在struts-config.xml中配置的,下面是其配置的部分代碼:




 


<form-bean  name="logonForm"



           type="org.apache.struts.validator.DynaValidatorForm">    



</form-bean>




 


LogonForm類是一個普通的JavaBean,其中定義了幾個屬性及屬性的讀寫方法,而且這些屬性的名字要和頁面表單中的輸入欄位對應。比如LogonForm中定義了兩個屬性,代碼如下:




 


private String username = null;



private String password = null;




 


這兩個屬性分別對應於logon.jsp表單中的兩個輸入欄位,代碼如下:




 


<html:form action="/logon" focus="username">



<html:text property="username" />



<html:password property="password" redisplay="false"/>



</html:form>




 


這裡要注意一點,LogonForm中的屬性名稱一定要和logon.jsp中的表單網域名稱完全對應起來。Struts就是由此從瀏覽器端抓取提交的資料,並填充到LogonForm對象中,再傳送給LogonAction類進行處理的。Struts實現的表單驗證和重填技術也是這樣實現的。在上面的頁面代碼中我們使用了Struts的HTML定製標籤庫,這些標籤都定義在Struts的標籤庫中,有意研究的可以看一下,不過建議大家最好少用,因為這些標籤支援的Javascript事件很少,而且失去了自動回填的支援,所以,還是自己做擴充標籤比較好。還可以直接使用類似<input type="text" name="username" />的HTML代碼,去Struts的標籤庫中找吧。




 

(3)Action分析
上面我們已經對Struts前端應用程式框架的整體結構、資料流轉有了一定的認識。也知道了Struts是怎樣從設定檔中擷取配置資訊的,即先啟動,然後等待請求,再從前台抓取資料,根據配置資訊調用(或產生)Action類進行處理,最後根據處理的結果轉向到對應的頁面響應使用者。那麼,現在就讓我們看看LogonAction是怎樣進行業務處理,並將處理結果顯示給使用者的。主要代碼如下:




 


package org.apache.struts.webapp.example;



import org.apache.struts.action.Action;



......



public final class LogonAction extends Action {



     public ActionForward perform(ActionMapping mapping,



                                  ActionForm form,



                                  HttpServletRequest request,



                                  HttpServletResponse response)



throws IOException, ServletException {



......



ActionErrors errors = new ActionErrors();



String username = ((LogonForm) form).getUsername();



String password = ((LogonForm) form).getPassword();



......



// 進行使用者驗證



// 如果不存在此使用者,或密碼錯誤,則將錯誤添加到errors中



if (!errors.empty()) {



saveErrors(request, errors);



return (new ActionForward(mapping.getInput()));



}



HttpSession session = request.getSession();



session.setAttribute(Constants.USER_KEY, user);



//刪除到期的form bean



......



if (mapping.getAttribute() != null) {



if ("request".equals(mapping.getScope()))



request.removeAttribute(mapping.getAttribute());



else



session.removeAttribute(mapping.getAttribute());



}



//定位到成功頁面



return (mapping.findForward("success"));



       }



     }



}




 


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中,其它發生的錯誤也類似處理。在隨後的程式中,首先校檢是否有錯誤發生,如果有錯誤發生,就把錯誤Object Storage Service到request中,使用的方法為saveErrors(request, errors)。該方法是在基類org.apache.struts.action.Action中實現的,它完成的功能很簡單,將errors對象通過setAttribute()方法儲存到request中即可。實現如下:




 


protected void saveErrors(HttpServletRequest request,ActionErrors errors) {



   //刪除掉不需要的錯誤資訊



   if ((errors == null) || errors.empty()) {



      request.removeAttribute(ERROR_KEY);



      return;



   }



   //儲存我們需要的錯誤對象



   request.setAttribute(ERROR_KEY, errors);



}




 


如果發生錯誤,將重新導向到輸入頁面,同時自動完成輸入欄位的重填,代碼如下:


 


return (new ActionForward(mapping.getInput()));



如果在登陸頁面輸入user/abc將提示上面的錯誤,那麼原來輸入的username域就會自動填滿進來了,在一個有大量輸入欄位的表單會大大方便使用者。




 


2.在上面的程式執行通過後,就說明這是一個合法登陸。我們要做的就是把目前使用者儲存到session中,同時清除已經無效的Form Bean,最後轉向到success頁面,代碼為:




 


return (mapping.findForward("success"));




 


一個ActionMapping對象對應於struts-config.xml中的一個<action/>的配置。如果你很細心的話,可能已經發現了,在struts-config.xml中舉例的/logon Action的配置中,並沒有Forward配置,但在它的開始部分卻有一個全域的Forward配置。配置代碼如下:




 


<global-forwards>



<forward   name="logoff"  path="/logoff.do"/>



<forward   name="logon"   path="/logon.jsp"/>



<forward   name="success" path="/mainMenu.jsp"/>



</global-forwards>




 


這個Forward配置將對所有的Action都有效。但如果中已經有和這些全域Forward配置同名的項,那麼它將覆蓋全域配置。所以你登入成功後,將轉向到/mainMenu.jsp頁面。當然,如果你想定義只對一個action起作用的forward,那麼就把他們放到<action/>中去吧。




 

第四部分:空模板的使用
在struts的webapps目錄下包含有struts-blank.war包,這個是struts的一個空白架構。我們可以直接使用WinRAR等工具將struts-blank.war包解開,或者是放到tomcat 5.0.14的webapps下,啟動tomcat,讓tomcat將包解開,然後刪掉struts-blank.war就可以了。


 


該目錄下有三個檔案夾和一個jsp檔案,下面的工作就簡單了。META-INF我們可以不予理會,在不涉及到進階組件技術或者要打成ear或是jar包發布的話,這個檔案夾是多餘的,因為在打war包時,打包器會搞定一切的;而page檔案夾下可以放置所有的jsp檔案,按照項目需要組織目錄就行了;而WEB-INF下放什麼,不用說也知道了,但是為了以後項目維護的方便,你需要組織好類包的結構,Struts的設定檔還是struts-conf.xml,而項目產生的java檔案最好放到src檔案夾下,這樣的話就可以使用ant來編譯了,也就是說,你的開發工具只需要一個文字編輯器就可以了,編譯工作可以交給ant了,它會幫你完成一切的。使用ant編譯後在classes下存有編譯好的類檔案,當然,它也同時產生了組件包,你可以選擇部署一個;至於index.jsp檔案則完全可以被項目的首頁面代替。


 


OK,Struts的配置就這麼簡單,上面講的已經足夠一個項目的使用了。當然,Struts還有更多進階的應用,這些可以去看struts的協助文檔,就是那個struts-documentation.war,部署到tomcat上就可以瀏覽了。


 


備忘:本文檔為初稿,如果有什麼補充或發現什麼錯誤,請及時聯絡,以便補充或更正。




相關文章

Beyond APAC's No.1 Cloud

19.6% IaaS Market Share in Asia Pacific - Gartner IT Service report, 2018

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。