Struts 的ActionForm 虽然比较简单,但也是异常烦琐的类。说简单,是因为每个类的写法非常简单,只需要为每个表单域提供对应的setter 和getter 方法即可。说烦琐,是因为必须大量书写这种简单的类。
好在Struts 提供了动态ActionForm ,通过使用动态ActionForm ,可以完全不用书写ActionForm ,只需在struts-config.xml 文件中配置即可。
一、配置动态ActionForm
所有的动态ActionForm 的实现类都必须是org.apache.struts.action.DynaActionForm类,或者是它的子类。
使用动态ActionForm 与前面不同的是:因为系统不清楚动态ActionForm 的属性,所以必须在配置文件中配置对应的属性。可以使用form-property 元素来配置动态ActionForm 的属性。
下面是使用动态ActionForm 的struts-config.xml 文件的源代码:
<?xml version="1.0" encoding="UTF-8"?>
<!-- Struts 配置文件的文件头,包含DTD 等信息 -->
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd">
<!-- Struts 配置文件的根元素 -->
<struts-config>
<form-beans>
<!-- 配置动态ActionForm,动态Aciton 必须使用DynaActionForm -->
<form-bean name="loginForm" type="org.apache.struts.action.DynaActionForm">
<!-- 配置ActionForm的属性: username -->
<form-property name="username" type="java.lang.String" />
<!-- 配置ActionForm的属性: pass -->
<form-property name="pass" type="java.lang.String" />
</form-bean>
</form-beans>
<!-- 配置全局Forward -->
<global-forwards>
<forward name="error" path="/WEB-INF/jsp/error.jsp" />
</global-forwards>
<!-- 配置action 映射 -->
<action-mappings>
<!-- 配置Action的path , type , name 属性 -->
<action path="/login" type="lee.LoginAction" name="loginForm">
<!-- 配置两个局部Forward -->
<forward name="welcome" path="/WEB-INF/jsp/welcome.jsp" />
<forward name="input" path="/login.jsp" />
</action>
</action-mappings>
<!-- parameter属性确定资源文件的文件名,默认在WEB-INF/classes下查找文件 -->
<message-resources parameter="messages" />
</struts-config>
从上面的配置文件可看出,动态ActionForm 的配置必须增加form-property 元素,每个属性必须对应一个form-property元素。
form-property元素包含两个属性。
• name: 属性的名字,必须与JSP 页面的表单域的名字相同。
• type: 属性的类型。
二、使用动态ActionForm
动态ActionForm 同样用于封装用户请求参数,但该ActionForm 没有各属性的getter及setter 方法,因此无法调用对应的getter 方法来解析请求参数。
幸好DynaActionForm 提供了多个重载的getter 方法用于获取请求参数,下面的
Action 使用DynaActionForm,该Action 的源代码如下:
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.DynaActionForm;
//Action 必须继承Action 类
public class logicAction extends Action {
// 必须重写该核心方法,该方法actionForm 将表单的请求参数封装成值对象
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
// 将ActionForm强制类型转换为DynaActionForm
DynaActionForm loginForm = (DynaActionForm) form;
// 从ActionForm中解析出请求参数: username
String username = (String) loginForm.get("username");
// 从ActionForm中解析出请求参数: password
String pass = (String) loginForm.get("pass");
// 后面的处理与前一个示例的Action 相同。
...
}
}
使用动态ActionForm 时,请求参数必须使用DynaActionForm的getter 方法获取。DynaActionForm 的getter 方法主要有如下三个。
• Object get(java.lang.String name): 根据属性名返回对应的值。
• Object get(java.lang.String name, int index): 对于有多个重名表单域的情况, Struts将其当成数组处理,此处根据表面域名和索引获取对应值。
• Object get(java.lang.String name, java.lang.String key): 对于使用Map 属性的情况,根据属性名及对应key. 获取对应的值。
使用动态ActionForm 的目的是为了减少代码的书写量。但有些IDE 工具可以自动生成ActionForm. 则可以使用普通ActionForm。
动态ActionForm 与普通ActionForm 并没有太大的区别。动态ActionForm 避免了书写ActionForm,但配置变得更复杂了。而普通ActionForm 使解析请求参数变得更直观。
分享到:
相关推荐
它可能涵盖了如何创建和使用动态ActionForm,如何实现和调用reset()方法,以及如何利用ValidatorForm进行数据验证等内容。通过实际操作这个项目,开发者可以更好地理解和掌握Struts中控制器的工作原理和动态表单的...
动态ActionForm则旨在解决这个问题,它允许我们在运行时动态地创建和绑定ActionForm,而不是预先定义固定的ActionForm类。 在讲解动态ActionForm的过程中,通常会涵盖以下几个关键点: 1. **ActionForm接口**:...
在"第五章(动态ActionForm与控制器)"的课堂资料中,我们将深入理解Struts框架中的关键概念,特别是ActionForm和控制器的动态使用。 一、ActionForm类 ActionForm是Struts框架中的表单bean类,用于接收用户在JSP页面...
#### 二、动态ActionForm的配置与使用 ##### 1. 配置动态ActionForm 配置动态ActionForm的关键在于Struts的配置文件(通常为struts-config.xml)。首先,我们需要定义一个`<form-bean>`元素,并将其`type`属性设置...
ActionForm的property必须声明然后才可以使用,不过在查询时我们常常需要输入一些查询条件,这些查询条件(property)其实不需要在formbean中声明,可以使用Map对象来封装整个查询表单提交的数据。 4. ActionForm的...
- 当需要根据用户输入动态生成表单字段时,可以使用动态ActionForm。 - 动态ActionForm也可以用来处理复杂数量不确定的数据结构,如表格中的行数据。 #### 六、重复提交问题 表单的重复提交是一个常见的问题,特别...
最近自学java中的框架-struts写了一些小例子,这都是很经典的程序,如果大家瞧得起要下载去看看,顺便给俺找找不足的地方。我的qq 821865130 email qingtian_hechen@163.com 希望大家能多多给我帮助...在此谢谢各位!!
- **使用动态ActionForm:** 动态ActionForm可以根据用户请求动态生成表单字段。 - **Struts的数据校验** - **ActionForm的代码校验:** 通过重写`validate()`方法实现。 - **Action的代码校验:** 直接在Action...
随着技术的发展,很多现代Web框架,如Spring MVC,已经不再直接使用ActionForm,而是推荐使用模型驱动(Model Driven)或命令对象(Command Object)模式。这些模式同样利用get和set方法来绑定表单数据,但提供了更...
案例5-5 使用动态ActionForm实现身份验证中的新用户注册 193 5.4.3 Validator验证框架 197 案例5-6 使用Validator验证框架实现注册表单的数据验证 201 5.4.4 Struts标记库 206 案例5-7 采用Struts标记库...
这里,我们为每个表单字段定义了一个动态的属性名,如`items[0].name`和`items[1].description`,这使得Struts在处理POST请求时能够将这些值映射到一个List类型的属性上。假设我们有一个名为Item的类,它有name和...
博客文章"Struts学习笔记之ActionForm - xiaodaoxiaodao——蓝小刀的自言自语 - BlogJava.mht"可能包含更深入的实践示例和经验分享,包括如何处理ActionForm的生命周期、动态Form Beans、国际化等话题。通过阅读这篇...
本篇将深入探讨Struts1的控制器组件以及动态ActionForm的概念。 **Struts1控制器组件** 1. **ActionServlet组件**: ActionServlet是Struts1框架的中心控制器。它接收HTTP请求,通过doGet或doPost方法处理这些请求...
3. 在JSP页面中动态创建表单,使用数组索引引用对象属性。 4. 在Action类中从ActionForm中获取对象数组,并进行进一步处理。 通过这种方式,Struts框架能够处理ActionForm中包含对象数组的场景,允许用户在一次表单...
5. **JSP页面**: 在JSP页面中,你可以使用`<html:form>`标签来创建表单,通过指定DynaActionForm的名称,可以动态地生成表单元素。`<html:dynamic>`标签用于根据ActionForm的属性动态生成输入控件。 6. **控制器层...
可以通过在ActionForm中使用ArrayList或Map来存储这些动态字段。当表单提交时,Struts框架会自动将表单数据填充到ActionForm中。 3. **表单验证**:Struts提供了强大的验证机制,可以在ActionForm类中定义校验规则...
在本文中,我们将深入探讨Struts的一些关键概念,如ActionForm、动态ActionForm、DispatchAction以及Validator验证框架。 ActionForm是Struts框架中用于接收用户输入并传递给Action处理的关键组件。它存储了HTTP...
动态验证意味着验证规则不是硬编码在ActionForm或Validation.xml中,而是根据用户的操作或者业务逻辑动态生成。这可以提高代码的可维护性和灵活性。例如,某些字段可能只在特定条件下才需要验证,或者验证规则会...