使用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>
 
 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類別來使用它,下面是一個簡單的例子:
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擔任以下的幾個職責:
*表單欄位的耕耘者
*資料的緩衝區
*資料的驗證
*進行屬性值的轉換
*應用程式防火牆
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值