struts-helloapp學習小記

<html:errors>:用於顯示Struts框架中其他組件產生的錯誤消息。

<html:form>:用於創建HTML表單,它能夠把HTML表單的字段和ActionForm Bean的屬性關聯起來。

<html:text>:該標籤是<html:form>的子標籤,用於創建HTML表單的文本框。它和ActionForm Bean的屬性相關聯。

<bean:message>:用於輸出本地化的文本內容,它的key屬性指定消息key,和消息key匹配的文本內容來自於專門的Resource Bundle

<bean:write>:用於輸出JavaBean的屬性值。本例中,它用於輸出personbean對象的userName屬性值:<bean:write name="personbean" property="userName" />

<logic:present>標籤用來判斷JavaBean在特定的範圍內是否存在,只有當JavaBean存在,纔會執行標籤主體中的內容。


控制器組件包括ActionServlet類和Action類。ActionServlet類是Struts框架自帶的,它是整個Struts框架的控制樞紐,通常不需要擴展。Struts框架提供了可供擴展的Action類,它用來處理特定的HTTP請求。


當用戶提交了HTML表單,Struts框架自動把表單數據組裝到ActionForm Bean中。ActionForm Bean中的屬性和HTML表單中的字段一一對應。接下來Struts框架會自動調用ActionForm Bean的validate()方法進行表單驗證。如果validate()方法返回的ActionErrors 對象爲null,或者不包含任何ActionMessage對象,就表示沒有錯誤,數據驗證通過。如果ActionErrors中包含ActionMessage對象,就表示發生了驗證錯誤,Struts框架會把ActionErrors對象保存到request範圍內,然後把請求轉發到恰當的視圖組件,視圖組件通過<html:errors>標籤把request範圍內的ActionErrors對象中包含的錯誤消息顯示出來,提示用戶修改錯誤。

Action類的工作機制:當ActionForm Bean被創建,並且表單驗證順利通過後, Struts框架就會調用Action類的execute()方法。execute()方法包含以下參數:

ActionMapping:包含了這個Action的配置信息,和struts-config.xml文件中的<action>元素對應。

ActionForm:包含了用戶的表單數據,當Struts框架調用execute()方法時,ActionForm中的數據已經通過了表單驗證。

HttpServletRequest:當前的HTTP請求對象

HttpServletResponse:當前的HTTP響應對象

Action類的execute()方法返回ActionForward對象,它包含了請求轉發路徑信息。


當HelloAction類調用HttpServletRequest的setAttribute()方法,向hello.jsp傳遞PersonBean對象時,需要提供一個名爲"personbean"的屬性key:

request.setAttribute("personbean",pb);

hello.jsp通過這個名爲"personbean"的屬性key來讀取PersonBean對象:

<logic:present name="personbean" scope="request">

 <h2>

       Hello <bean:write name="personbean" property="userName" />!<p>

 </h2>

</logic:present>


 


<action    path      = "/HelloWorld"       //指定請求訪問Action的路徑

          type      = "hello.HelloAction"  //指定Action的完整類名

          name     = "HelloForm"        //指定需要傳遞給Action的ActionForm Bean

          scope     = "request"           //指定ActionForm Bean的存放範圍

          validate   = "true"              //指定是否執行表單驗證

          input     = "/hello.jsp">         //指定當表單驗證失敗時的轉發路徑

<forward name="SayHello" path="/hello.jsp" /> //定義了一個請求轉發路徑

</action>

本例中的<action>元素配置了HelloAction組件,對應的類爲hello.HelloAction,請求訪問路徑爲"HelloWorld",當Action類被調用時,Struts框架應該把已經包含表單數據的HelloForm Bean傳給它。HelloForm Bean存放在request範圍內,並且在調用Action類之前,應該進行表單驗證。如果表單驗證失敗,請求將被轉發到接收用戶輸入的網頁hello.jsp,讓用戶糾正錯誤。

Struts工作機制<script language="javascript" type="text/javascript"> document.title="Struts是怎麼工作的(翻譯) - "+document.title </script>

Java的Servlets是用來處理Web瀏覽器的請求的,而JSP是用來建立動態網頁,使得網站成爲活動的應用的。Struts使用了一個特殊的Servlet作爲交換器,將Web瀏覽器的請求導向到適合的JSP頁面去。這使得Web應用的設計,創建和維護更加容易。

以下是Struts的一些詳細的機制和對其他技術的依賴:

  • 你開發的web應用必須要寫一個發佈描述文件(WEB-INF/web.xml),這個文件描述了你的web應用的配置,包括歡迎頁(當web請求是一個目錄而沒有指明具體的文件時,服務器顯示的文件),servlet的映象(路徑和擴展名)和這些servlet的參數。
    在這個文件中,你將Struts的ActionServlet配置爲處理所有映象(通常的擴展名爲.do)的請求的servlet。這就是上面提到的交換器。
    在這個文件中,你爲Struts本身設置ActionServlet使用一個或多個配置文件。
    本文檔中,假設我們把web應用安裝在服務器的/myapp目錄下,並從那裏使用最爲簡單的配置。
    如果你需要發佈描述文件的詳細信息,請閱讀Servlet Specification,它可以從Sun Microsystem的Java網站上得到。
  • 在Struts的配置文件中,你將路徑信息和你的應用中的控制組件相關聯,這些控制組件爲Action類(例如:“login”——>LoginAction類)。這就告訴Struts的ActionServet當收到的請求爲:http://myhost/myapp/login.do的時候,它應該調用你的LoginAction控制組件。
    注意在URL中的.do擴展名,這個擴展名使得你的Servlet容器(例如Tomcat)調用ActionServlet,ActionServlet知道這個單詞“login”就是你需要做的事情。然後從配置文件中查找對應的Action類,於是你的LoginAction將會被執行。
  • 對於每一個Action類,你也要爲Struts配置結果頁面的名字,這些結果頁面是該Action類執行的結果。一個Action可能會有多個執行結果的視圖(通常,至少有兩個:一個爲成功的,一個爲失敗的)。
    你的Action(你寫的控制組件)是基於這些邏輯結果頁面的名稱的。這些名稱會返回到ActionServlet類去,使用諸如“success”,“failure”,“ready”,“ok”,“UserIsIncompetent”一類的名稱。Struts系統(通過你寫的配置)知道怎樣找到適合的指定頁面。這就使得通過簡單的編輯Struts的XML配置文件,就能重新配置視圖層。
    在這一點上,Struts知道怎樣代表你的控制組件,顯示你的控制組件運行的結果。應用程序的模式層則完全取決於你,它會在你的控制組件中被調用。
  • 你也可以在Struts的配置文件中,將Java Bean作爲一個Action(或者一系列Action)。Java Bean被作爲表單或者顯示數據的容器,這些數據可以在視圖層和控制層中交流。
    這些Bean能被你的控制組件(例如LoginAction)和任何與該控制組件聯繫的視圖頁面自動的看到。
    這些Bean也能在Struts系統的幫助下被驗證,保證用戶在表單中錄入了正確的數據。它們能置入session中,使得表單能用多個視圖頁面來表示,以及在控制層表單能被多個Action處理。
    注意:你必須在視圖層(將會在客戶端顯示的)使用服務器端的技術(JSP,Velocity,XSLT)去得到這些數據。(純HTML是沒辦法得到的)。Struts在服務器上工作,所以客戶能看到的視圖必須也在服務器端被合成。
    客戶通過正常的表單提交(POST/GET)來反饋數據,Struts系統則在調用你的控制組件之前,更新在Bean中的這些數據。
    在你的web應用中,頁面將會代表用戶看到的視圖。這些頁面可以是JSP頁面,Velocity模板,XSLT頁面等等。一系列JSP標記同Struts一同發佈,因此你能馬上開始。但是你仍然可以在Struts中使用任何標準的展示技術。
    就算純HTML文件也能在你的Struts應用中使用,儘管他們不能使用動態技術的任何好處。
    下面是Struts的JSP標記的例子,你也可以獲得其他一些包使得Struts框架在你喜歡的展示技術中更加容易使用。在Velocity模板中,Velocity ViewTools支持Struts。如果你想使用XSLT,你能在stxx和StrutsCX中選擇。
    這些包使得標準的Struts框架元素看上去或者感覺上去像是這些展示技術無縫的一部分。Struts也使得它容易跟其他技術混合和結合。如果需要,你可以在同一個應用程序中一起使用JSP,Velocity模板和XSLT。
    因爲Struts是基於標準的Servlet技術,你應該能和Struts一起使用任何Java展示技術。
  • Struts框架主要集中在控制器,而展示層也是應用程序相當重要的一部分。Struts的JSP標記包括了一些通用和Struts專用的標記,它們能幫助你在你的視圖中使用動態的數據。
    定製的JSP標記是Struts代碼基礎中很大的一部分。注意到在版本1.1b3中,Struts內核的Java代碼大概有28,000行,而這些標記(包括tiles)的Java代碼大概是41,000行是非常有意義的。
    這些標記能使你將你的視圖層與控制層結合在一起,而不用在JSP頁面中嵌入很多的Java代碼。這使得頁面看上去象XML,這就能比純JSP更加容易的被web頁面設計者處理。它同時也能減少在控制層和視圖層之間的依賴關係。
    定製標記被用來建立表單(隱式的與前面提到的Bean相互作用),邏輯地轉向到其他頁面,調用web應用的其他Action。
    這些標記也能幫你進行國際化,錯誤信息處理等等。
    所有這些能力都是在一定程度上依賴於你提供給Struts的配置文件的。

當ActionServlet處理web請求的時候,所有在這裏描述的機制纔是有效的,請記住這點,這是很重要的。

因爲僅當一個請求提交時,你的容器(例如,Tomcat,WebShpere等)調用ActionServlet,所有這些纔會發生。你必須保證通過一個將會映象到ActionServlet的請求(例如,有一個.do的擴展名)得到的任何依賴於Struts的頁面都已經準備好了。

發佈了31 篇原創文章 · 獲贊 0 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章