入門 07 - 使用ActionForm類別
<script language=javascript> function toggle(id) { var oldAttachmentVersionsBlock = document.getElementById('attachment' + id); with (oldAttachmentVersionsBlock.style) { if ( display == "none" ) display = "" else display = "none" } var arrowIcon = document.getElementById('arrow' + id); with (arrowIcon) { if (src != null && (src.indexOf('/confluence/images/icons/arrow_closed_active_16.gif') != -1 || src.indexOf('/confluence/images/icons/arrow_closing_active_16.gif') != -1)) { src = '/confluence/images/icons/arrow_opening_active_16.gif'; } else { src = '/confluence/images/icons/arrow_closing_active_16.gif'; } } } </script>
當透過發送請求來到ActionServlet後,ActionServlet會從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 { 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.xml
<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類別如下:
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 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:
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,我們用之為登入表單:
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擔任以下的幾個職責: *表單欄位的耕耘者 *資料的緩衝區 *資料的驗證 *進行屬性值的轉換 *應用程式防火牆 |
使用ActionForm類別
最新推荐文章于 2017-12-18 18:36:00 发布