控制器組件包括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范圍內,然後把請求轉發到恰當的視圖組件,視圖組件通過
Action類的工作機制:當ActionForm Bean被創建,並且表單驗證順利通過後, Struts框架就會調用Action類的execute()方法。execute()方法包含以下參數:
ActionMapping:包含了這個Action的配置信息,和struts-config.XML文件中的元素對應。
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對象:
Hello
type = "hello.HelloAction" //指定Action的完整類名
name = "HelloForm" //指定需要傳遞給Action的ActionForm Bean
scope = "request" //指定ActionForm Bean的存放范圍
validate = "true" //指定是否執行表單驗證
input = "/hello.JSP"> //指定當表單驗證失敗時的轉發路徑
本例中的元素配置了HelloAction組件,對應的類為hello.HelloAction,請求訪問路徑為“HelloWorld”,當Action類被調用時,Struts框架應該把已經包含表單數據的HelloForm Bean傳給它。HelloForm Bean存放在request范圍內,並且在調用Action類之前,應該進行表單驗證。如果表單驗證失敗,請求將被轉發到接收用戶輸入的網頁hello.jsp,讓用戶糾正錯誤。