ActionForm是表單的物件化表示,它本身其實是個JavaBean,除了標準的getter與setter等方法之外,還提供有reset()、validate()等方法供Struts組件呼叫。
當透過發送請求來到ActionServlet後,ActionServlet會從ActionMapping物件中得知所使用的ActionForm物件,這是在struts-config.xml中設定的,如果所需的ActionForm還不存在就生成一個,之後一直使用它,ActionMapping與ActionForm物件會被當作參數傳遞給Action物件。
在Struts 1.1中,ActionForm生成之後,會執行RequestProcessor的processPopulate()方法,首先它會呼叫ActionForm的reset()方法,您可以在當中作一些重清ActionForm屬性的動作,然而表單的參數值會與ActionForm的setter進行比對,如果有名稱符合的就將表單的參數值設定給對應的屬性。
我們透過繼承ActionForm類別來使用它,下面是一個簡單的例子:
ActionForm類別編譯後必須放置於WEB-INF中,並包括套件階層,我們必須在struts-config.xlm中定義Action物件使用哪一個ActionForm物件:
在這個例子中,<form-bean>標籤定義了所使用的ActionForm物件及名稱,而在<action>標籤的設定中,LoginAction指定了userForm作為其所使用的ActionForm,我們的LoginAction類別如下:
ActionForm被作為參數傳遞至execute()方法,我們必須轉換為其原來的形態UserForm,這樣才可以取出當中的屬性值,在驗證使用者的名稱與密碼無誤後,我們查找greeting的ActionForward對象並傳回,這會使得ActionServlet將請求forward至greeting.jsp:
<login:present>標籤會查看指定的範圍中是不是有指定名稱的JavaBean物件,如果有的話就使用<bean:write>寫出指定的屬性,而<login:notPresent>的作用恰恰相反,如果沒有指定名稱的JavaBean物件,就給出一個超連結要求先進行登入,<html:link>的forward屬性會查找struts-config.xml中的<global-forward>的welcome設定。
如果驗證失敗,則查找welcome的ActionForward對象並傳回,也就是Welcome.jsp,我們用之為登入表單:
<html:form>指定的LoginAction必須在struts-config.xml中有定義,<html:text>與<html:password>會取出對應的ActionForm物件中對應的屬性值,如果使用者填寫的內容不正確而被送回Welcome.jsp,使用者將可以看到先前所填寫的值,如果不想顯示先前所填寫的值,則將<html:text>與<html:password>的redisplay屬性設定為false即可,這幾個Struts標籤必須與Action物件及ActionForm物件搭配使用。
接下來您可以測試一下程式,連上http://localhost:8080/HelloStruts/,如果您填寫了正確的表單欄位並送出,則結果會如下:
ActionForm在Struts中是屬於視圖組件的一部份,它是表單的物件化表單,表單的參數會自動設定給ActionForm,無法對應的就加以忽略,您可以定義validate()方法來驗證表單設定的內容,這在下一個主題中將加以說明,在ActionForm中您可以填入表單值,作一些適當的值轉換,進行基本的資料驗證,ActionForm是表單資料發送至應用程式前的緩衝區,在某些程度上,它是應用程式的防火牆,您可以在ActionForm中避免不正確或不安全的資料進入應用程式。
綜合一下,ActionForm擔任以下的幾個職責:
*表單欄位的耕耘者
*資料的緩衝區
*資料的驗證
*進行屬性值的轉換
*應用程式防火牆
當透過發送請求來到ActionServlet後,ActionServlet會從ActionMapping物件中得知所使用的ActionForm物件,這是在struts-config.xml中設定的,如果所需的ActionForm還不存在就生成一個,之後一直使用它,ActionMapping與ActionForm物件會被當作參數傳遞給Action物件。
在Struts 1.1中,ActionForm生成之後,會執行RequestProcessor的processPopulate()方法,首先它會呼叫ActionForm的reset()方法,您可以在當中作一些重清ActionForm屬性的動作,然而表單的參數值會與ActionForm的setter進行比對,如果有名稱符合的就將表單的參數值設定給對應的屬性。
我們透過繼承ActionForm類別來使用它,下面是一個簡單的例子:
package onlyfun.caterpillar;
import javax.servlet.http.*;
import org.apache.struts.action.*;
public class UserForm extends ActionForm {
protected String name;
protected String password;
public void setName(String name) {
this.name = name;
}
public void setPassword(String password) {
this.password = password;
}
public String getName() {
return name;
}
public String getPassword() {
return password;
}
public void reset(ActionMapping mapping, HttpServletRequest req) {
name = null;
password = null;
}
}
ActionForm類別編譯後必須放置於WEB-INF中,並包括套件階層,我們必須在struts-config.xlm中定義Action物件使用哪一個ActionForm物件:
<struts-config>
<form-beans>
<form-bean
name="userForm"
type="onlyfun.caterpillar.UserForm"/>
</form-beans>
<global-forwards>
<forward
name="welcome"
path="/Welcome.do"/>
</global-forwards>
<action-mappings>
<action
path="/Welcome"
type="org.apache.struts.actions.ForwardAction"
parameter="/pages/Welcome.jsp"/>
<action
path="/LoginAction"
type="onlyfun.caterpillar.LoginAction"
name="userForm">
<forward
name="greeting"
path="/pages/greeting.jsp"/>
</action>
</action-mappings>
<message-resources parameter="resources.application"/>
</struts-config>
在這個例子中,<form-bean>標籤定義了所使用的ActionForm物件及名稱,而在<action>標籤的設定中,LoginAction指定了userForm作為其所使用的ActionForm,我們的LoginAction類別如下:
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 name = ((UserForm) form).getName();
String password = ((UserForm) form).getPassword();
if(name.equals("caterpillar") && password.equals("1234")) {
request.setAttribute("valid_user", form);
return mapping.findForward("greeting");
}
return mapping.findForward("welcome");
}
}
ActionForm被作為參數傳遞至execute()方法,我們必須轉換為其原來的形態UserForm,這樣才可以取出當中的屬性值,在驗證使用者的名稱與密碼無誤後,我們查找greeting的ActionForward對象並傳回,這會使得ActionServlet將請求forward至greeting.jsp:
<%@ taglib uri="/tags/struts-bean" prefix="bean" %>
<%@ taglib uri="/tags/struts-html" prefix="html" %>
<%@ taglib uri="/tags/struts-logic" prefix="logic" %>
<%@page contentType="text/html; charset=Big5"%>
<html:html locale="true">
<head>
<title><bean:message key="welcome.title"/></title>
<html:base/>
</head>
<body bgcolor="white">
<logic:present scope="request" name="valid_user">
<bean:write name="valid_user" property="name"/>您好,這是您的神秘禮物!
</logic:present>
<logic:notPresent scope="request" name="valid_user">
<html:link forward="welcome">請先登入</html:link>
</logic:notPresent>
</body>
</html:html>
<login:present>標籤會查看指定的範圍中是不是有指定名稱的JavaBean物件,如果有的話就使用<bean:write>寫出指定的屬性,而<login:notPresent>的作用恰恰相反,如果沒有指定名稱的JavaBean物件,就給出一個超連結要求先進行登入,<html:link>的forward屬性會查找struts-config.xml中的<global-forward>的welcome設定。
如果驗證失敗,則查找welcome的ActionForward對象並傳回,也就是Welcome.jsp,我們用之為登入表單:
<%@ taglib uri="/tags/struts-bean" prefix="bean" %>
<%@ taglib uri="/tags/struts-html" prefix="html" %>
<%@page contentType="text/html; charset=Big5"%>
<html:html locale="true">
<head>
<title><bean:message key="welcome.title"/></title>
<html:base/>
</head>
<body bgcolor="white">
<html:form action="/LoginAction" focus="name">
名稱:<html:text property="name" size="20"/><br>
密碼:<html:password property="password" size="20"/><br>
<html:submit/> <html:reset/>
</html:form>
</body>
</html:html>
<html:form>指定的LoginAction必須在struts-config.xml中有定義,<html:text>與<html:password>會取出對應的ActionForm物件中對應的屬性值,如果使用者填寫的內容不正確而被送回Welcome.jsp,使用者將可以看到先前所填寫的值,如果不想顯示先前所填寫的值,則將<html:text>與<html:password>的redisplay屬性設定為false即可,這幾個Struts標籤必須與Action物件及ActionForm物件搭配使用。
接下來您可以測試一下程式,連上http://localhost:8080/HelloStruts/,如果您填寫了正確的表單欄位並送出,則結果會如下:
<html lang="zh">
<head>
<title>哈囉!Struts!</title>
<base href="http://localhost:8080/HelloStruts/pages/greeting.jsp">
</head>
<body bgcolor="white">
caterpillar您好,這是您的神秘禮物!
</body>
</html>
ActionForm在Struts中是屬於視圖組件的一部份,它是表單的物件化表單,表單的參數會自動設定給ActionForm,無法對應的就加以忽略,您可以定義validate()方法來驗證表單設定的內容,這在下一個主題中將加以說明,在ActionForm中您可以填入表單值,作一些適當的值轉換,進行基本的資料驗證,ActionForm是表單資料發送至應用程式前的緩衝區,在某些程度上,它是應用程式的防火牆,您可以在ActionForm中避免不正確或不安全的資料進入應用程式。
綜合一下,ActionForm擔任以下的幾個職責:
*表單欄位的耕耘者
*資料的緩衝區
*資料的驗證
*進行屬性值的轉換
*應用程式防火牆
浙公网安备 33010602011771号