1.Action類
org.apache.action.Action類是Struts的心臟,也是客戶請求和業務操作間的橋梁。每個Action類通常涉及為代替客戶完成某種操作。
一旦正確的Action實例確定,就會調用RequestProcessor類的processActionPerform()方法,processActionPerform()方法,負責調用Action實例的execute()方法。
execute()方法有4個參數:ActionMapping對象、ActionForm對象 、HttpServletRequest對象和HttpServletResponse對象。ActionForm對象封裝了表單數據,因此Action類可以通過getter方法從該對象中獲得表單數據,然后調用模型組件處理這些數據。Action類又通過ActionMapping對象的findForward()方法獲得一個ActionForward對象,然后把處理結果轉發到ActionForward對象所指的目標。
其具體的實現過程如下代碼所示:
package login;
import org.apache.struts.action.*;
import javax.servlet.http.*;
import java.util.*;
publlic class loginAction extends Action{
public ActionForward execute(ActionMapping actionmapping, ActionForm actionForm,
HttpServletRequest request, HttpServletResponse response )
{
loginActionForm loginForm=(loginActionForm) actionForm;
//從form bean中取出表單數據
String username=loginForm.getUsername();
String password=loginForm.getPassword();
//生成一個Session對象
HttpSession session=request.getSession(true);
session.removeAttribute("username");
session.setAttribute("username",username);
//生成一個ArrayList對象,并把用戶名和密碼的值寸入該對象中
ArrayList arr=new ArrayList();
arr.add(username);
arr.add(password);
String prompt;
//調用模型組件loginHandler,檢查該用戶是否已經注冊
loginHandler login=new loginHandler();
boolean mark=login.checkLogin(arr);
if(mark) prompt="Success";
else prompt="Fail";
return actionMapping.findForward(prompt);
}
}
2.ActionMapping類 ActionMapping存儲了與特定用戶請求對應的特定Action的相關信息,例如輸入頁面、轉發頁面等。ActionServlet將ActionMapping傳送到Action類的execute()方法,然后Action將調用ActionMapping的findForward()方法,此方法返回一個指定名稱的ActionForward,這樣Action就完成了本地轉發。若沒有找到具體的ActionForward,就返回一個null。
3.ActionForward類 Action類中的execute()方法返回一個ActionForward對象。ActionForward對象代表一個Web資源的邏輯抽象表示形式。這里的Web資源通常就是JSP頁面或Java Servlet。
ActionForward是該資源的包裝類,所以應用程序和實際資源之間并無多少瓜葛。實際的Web資源只在配置文件struts-config.xml中指定(如forward元素的name,path和redirect屬性),并非在程序代碼中寫入。RequestDispatch會根據redirect屬性的值,來決定ActionForward實例要進行轉發還是重定向。
要從一個Action實例返回一個ActionForward實例,可以在Action類內動態地創建一個ActionForward實例,或者更常見的做法是使用ActionMapping的findForward()方法找出配置文件中預先配置的一個ActionForward實例,如下所示:
return mapping.findForward("Success");
其中,mapping是一個ActionMapping實例,該程序片斷能夠返回一個參數“Success”對應的ActionForward實例,以下代碼是在配置文件struts-config.xml中定義的forward元素:
<action name="loginActionForm" type="login.loginAction"
validate="false" input="/login.jsp"
scope="request" path="/loginAction">
<forward name="Success" path="/main.jsp" redirect="true"/>
<forward name="Fail" path="/register.jsp" redirect="true"/>
<action/>
ActionMapping類的findForward()方法首先會調用findForwardConfig()方法,以查看在<action>元素中是否包含<forward>子元素,如果有,就會檢查<global-forwards>元素片段。一旦找到匹配的ActionForward實例,就會從execute()方法將其返回給RequestProcessor。下面是ActionMapping類的findForward()方法:
public ActionForward findForward(String name)
{
ForwardConfig config=findForwardConfig(name);
if(config==null)
{
config=getModuleConfig().findForwardConfig(name);
}
return ( (ActionForward) config );
}