ITEEDU

Struts Gossip: 使用 DynaActionForm

一个网站中会有许多的窗体以供使用者填写数据,越大型的网站越需要更多的 ActionForm 对象来应付窗体的取值,对于一些窗体来说,ActionForm只是单纯的设值、取值行为,如果为每一个窗体撰写一个ActionForm,那么会是一件单纯重复且无趣的行为,而且在维护上会更加困难。

对于一些单纯的窗体来说,您可以使用DynaActionForm类别,您只要在struct-config.xml中设定好相关的设定,就可以自动生成 ActionForm对象,这么一来您可以集中在struct-config.xml中管理窗体对象,也可以省去不是编码与编译的工夫。

下面是使用DynaActionForm的一个例子:
struts-config.xml
 ....
<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>

<action-mappings>
<action
path="/LoginAction"
type="onlyfun.caterpillar.LoginAction"
name="userForm">
<forward
name="helloUser"
path="/WEB-INF/pages/hello.jsp"/>
....
</action>
</action-mappings>
....
注意在<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");
....
}
}
DynaActionForm预设并没有为validate()方法提供任何行为,如果需要的话,您可以透过继承DynaActionForm来定义 validate()方法,并于<form-bean>的type中设定为您所撰写的类别。