ActionForm是表單的物件化表示,它本身設計為JavaBean,您要繼承org.apache.struts.action.ActionForm來設計一個表單物件,並提供標準的getter與setter方法,必要時可以使用繼承下來的reset()、validate()等方法供 Struts 組件呼叫。
當客戶請求交給了 RequestProcessor 後,RequestProcessor會從 ActionMapping 中得知所使用的ActionForm物件,這是在struts-config.xml中設定的,如果所需的ActionForm還不存在就生成一個,之後一直使用它,ActionMapping與ActionForm物件會被當作參數傳遞給 Action。
在Struts 1.1中,ActionForm生成之後,會執行RequestProcessor的processPopulate()方法,首先它會呼叫 ActionForm的reset()方法,您可以在當中作一些重清ActionForm屬性的動作,然後表單的參數值會與ActionForm的 setter進行比對,如果有名稱符合的就將表單的參數值設定給對應的屬性。
透過繼承ActionForm類別來使用它,下面是一個簡單的例子:
- UserForm.java
package onlyfun.caterpillar; 
 
import javax.servlet.http.*; 
import org.apache.struts.action.*; 
 
public class UserForm extends ActionForm {
    private String username; 
    private String password;
     
    public void setUsername(String username) { 
        this.username = username; 
    } 
    
    public void setPassword(String password) { 
        this.password = password; 
    } 
    
    public String getUsername() { 
        return username; 
    }
    
    public String getPassword() {
        return password;
    } 
    
    public void reset(ActionMapping mapping,
                      HttpServletRequest request) {
        username = null;
        password = null;
    } 
}必須在struts-config.xml中定義Action物件使用哪一個ActionForm物件:
- struts-config.xml
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE struts-config PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
"http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd">
<struts-config>
    <form-beans> 
        <form-bean 
            name="userForm" 
            type="onlyfun.caterpillar.UserForm"/> 
    </form-beans>
    <action-mappings> 
        <action 
            path="/login" 
            type="onlyfun.caterpillar.LoginAction"
            name="userForm"> 
            <forward
                name="helloUser" 
                path="/WEB-INF/pages/hello.jsp"/>
            <forward
                name="loginFail" 
                path="/WEB-INF/pages/fail.jsp"/>
        </action> 
    </action-mappings> 
</struts-config> 在這個例子中,<form-bean>標籤定義了所使用的ActionForm物件及其名稱userForm,而在< action>標籤的設定中,LoginAction指定了userForm作為其所使用的ActionForm, LoginAction類別如下:
- LoginAction.java
package onlyfun.caterpillar;
import javax.servlet.http.*; 
import org.apache.struts.action.*; 
public class LoginAction extends Action {
    public ActionForward execute(
                             ActionMapping mapping,
                             ActionForm form,
                             HttpServletRequest request, 
                             HttpServletResponse response) 
                                    throws Exception { 
        String username = ((UserForm) form).getUsername(); 
        String password = ((UserForm) form).getPassword(); 
        
        request.setAttribute("username", username);
        
        if(username.equals("caterpillar") && 
                  password.equals("1234")) {
            return mapping.findForward("helloUser"); 
        }
        
        return mapping.findForward("loginFail"); 
    } 
}ActionForm被作為參數傳遞至execute()方法,在驗證使用者的名稱與密碼無誤後,查找helloUser的 ActionForward對象並傳回,這會使得RequestProcessor將請求轉發至hello.jsp:
- hello.jsp
<html> 
<head> 
<title>Hello, \${username} !</title> 
</head> 
<body>
     <H1>Hello, \${username} !</H1>
     <H1>This is your secret gift!!</H1>
</body> 
</html>如果驗證失敗,則查找loginFail的ActionForward對象並傳回,也就是fail.jsp:
- fail.jsp
<html> 
<head> 
<title>Sorry!</title> 
</head> 
<body>
    <H1>Sorry, \${username} !</H1> 
    <H1>You must provide correct login information!!</H1>
    <p>
    <a href='/strutsapp/html/form.htm'>Login</a>
</body> 
</html>最後是一個簡單的登入表單,這是個靜態HTML,放在/strutsapp/html下就可以了:
- form.htm
<html> 
<head><title>Login</title></head> 
<body> 
   Please login:<p> 
    <form name="userForm" action="/strutsapp/login.do" method="post"> 
   username <input type="text" name="username"/><br> 
   password <input type="password" name="password"/><p> 
        <input type="submit"/> 
    </form>
</body> 
</html>ActionForm在Struts中是屬於View組件的一部份,它是物件化的表單,表單的參數會自動設定給 ActionForm,無法對應的就加以忽略,在ActionForm中您可以填入表單值,作一些適當的值轉換,進行基本的資料驗證, ActionForm可以作為表單資料發送至應用程式前的緩衝區,在某些程度上,它是應用程式的防火牆,您可以在ActionForm中避免不正確或不安 全的資料進入應用程式。
綜合一下,ActionForm擔任以下的幾個職責:
- 填寫表單欄位至表單物件屬性中
- 客戶資料的緩衝區
- 進行資料完整性、格式驗證
- 進行屬性值的轉換
- 進行資料安全性驗證,阻止惡意資料進入應用程式

