使用DynaActionForm類別

<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物件來應付表單的取值,對於一些表單來說,ActionForm只是單純的設值、取值行為,如果為每一個表單撰寫一個ActionForm,那麼會是一件單純重複且無趣的行為,而且在維護上會更加困難。
 對於一些單純的表單來說,您可以使用DynaActionForm類別,您只要在struct-config.xml中設定好相關的設定,就可以自動生成ActionForm物件,這麼一來您可以集中在struct-config.xml中管理表單物件,也可以省去不是編碼與編譯的工夫。
 下面是使用DynaActionForm的一個例子:
struts-config.xml
<struts-config>
    <form-beans>
        <form-bean
            name="userForm"
            type="org.apache.struts.action.DynaActionForm">
            <form-property
                name="name"
                type="java.lang.String"
                initial="nobody"/>
            <form-property
                name="password"
                type="java.lang.String"
                initial="nopass"/>
        </form-bean>
    </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>的type屬性,我們設定使用 org.apache.struts.action.DynaActionForm,而Form的屬性則使用<form-property> 標籤來設定,DymaActionForm的type屬性希望得到的一個Java類別名稱,所以對於基本資料型態如int,必須以 java.lang.Integer作為Wrapper類別包裝。
 ActionForm類別的reset()方法預設什麼事都不作,除非您重新定義它,DynaActionForm則預設會將所有的資料重設為Java型態的預設值,例如數字重設為0,而Object則重設為null,您也可以使用initial屬性來設定重設的值。
 DynaActionForm同樣也被當作參數傳遞給execute()方法,DynaActionForm使用Map型態的方法來取值,下面的Action類別示範了如何取得DynaActionForm的屬性值:
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 {
        DynaActionForm dynaForm = (DynaActionForm) form;
        String name = (String) dynaForm.get("name");
        String password = (String) dynaForm.get("password");
                                                                               
        if(name.equals("caterpillar") && password.equals("1234")) {
            request.setAttribute("valid_user", form);
            return mapping.findForward("greeting");
        }
                                                                               
        return mapping.findForward("welcome");
    }
}

 在視圖的取值上,DynaActionForm也可以使用<bean:write>來寫出其指定的屬性值,如果您要使用EL來取得屬性值,則必須先取得map物件再指定屬性名稱,例如 ${valid_user.map.name} ,下面是gretting.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"/>您好,這是您的神秘禮物!
    ${ valid_user.map.name }, ${ valid_user.map.password}
</logic:present>
                                                                               
<logic:notPresent scope="request" name="valid_user">
    <html:link forward="welcome">請先登入</html:link>
</logic:notPresent>
                                                                               
</body>
</html:html>

 Welcome.jsp的內容與之前的主題相同。
 DynaActionForm預設並沒有為validate()方法提供任何行為,如果需要的話,您可以透過繼承DynaActionForm來定義validate()方法,並於<form-bean>的type中設定為您所撰寫的類別。
 使用DynaActionForm相當方便,但也必須付出代價,不可避免的,您的strut-config.xml內容將變得冗長,而另一方面, DynaActionForm使用Map來查找屬性,所付出的是效能的降低,如果您的ActionForm經常使用,建議還是使用繼承 ActionForm的方法來使用表單物件。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值