我们来看看struts-config.xml的配置信息
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 1.1//EN"
"http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">
<struts-config>
<!-- 配置所有的formbean,每个formbean都可以用一个<form-bean>类指定-->
<form-beans>
<form-bean name="Student_Bean" type="org.apache.struts.action.DynaActionForm">
<form-property name="username" type="java.lang.String"></form-property>
<form-property name="password" type="java.lang.String"></form-property>
</form-bean>
</form-beans>
<!-- 配置具体接受action请求的信息,每一个action请求都可以用一个<action>来指定 -->
<action-mappings>
<!-- 配置action信息,其中
path表示用户form请求路径;
type表示服务器组件action的类;
name表示formBean组件;
scope表示将FormBean封装到那个域中
validate表示是否要验证该formBean
-->
<action path="/login" type="com.xingyao.action.LoginAction" attribute="Student_Bean1"
name="Student_Bean" scope="request" validate="false">
<!-- 具体请求的时候,得到返回结果,需要跳转(转发)的页面 -->
<forward name="success" path="/WEB-INF/JSP/success.jsp"></forward>
<forward name="error" path="/WEB-INF/JSP/error.jsp"></forward>
</action>
</action-mappings>
</struts-config>
这里我们主要是注意
<form-beans>
<form-bean name="Student_Bean" type="org.apache.struts.action.DynaActionForm">
<form-property name="username" type="java.lang.String"></form-property>
<form-property name="password" type="java.lang.String"></form-property>
</form-bean>
</form-beans>
这段信息,这里的name与要对应起来,type=”的值是固定的:org.apache.struts.action.DynaActionForm”,然后form表单有几个值这里就配置几个标签
使用Action接受表单参数的方法为
这样就能再后台完成表单的数据收集
使用jsp接受表单参数的方法为
其中Student_bean1为action配置信息里面的,如果没有定义这个标签,则等于,也就是说表单数据收集的方法为${ | .map.表单字段名}
那么这个DynaActionForm是怎么进行表单数据收集的呢?让我们查看该类的源码码
public class DynaActionForm extends ActionForm implements DynaBean {
protected DynaActionFormClass dynaClass = null;
保存了表单数据的信息,所以我们需要在jsp页面使用.map才能得到表单的数据
protected HashMap dynaValues = new HashMap();
public void initialize(ActionMapping mapping) {
String name = mapping.getName();
if (name == null) {
return;
}
//封装了配置信息里面的<form-Bean>的信息,也就是:<form-bean name="Student_Bean"
type=”org.apache.struts.action.DynaActionForm”> —————这里进行详细讲解1
FormBeanConfig config =
mapping.getModuleConfig().findFormBeanConfig(name);
if (config == null) {
return;
}
//然后对这个
public class FormBeanConfig implements Serializable {
/**
* Return the form property configurations for this module. If there
* are none, a zero-length array is returned.
*/
public FormPropertyConfig[] findFormPropertyConfigs() {
FormPropertyConfig results[] =
new FormPropertyConfig[formProperties.size()];
//这里将表单结果信息封装成一个结果数组对象
return ((FormPropertyConfig[]) formProperties.values().toArray(results));
}
}
上面已经可以得到所有的表单名和表单数据了,调用这个set(props[i].getName(), props[i].initial());方法只不过是将这些数据封装到这个DynaActionFrom里面的属性 protected HashMap dynaValues = new HashMap();里面设值
/**
*/
public void set(String name, Object value) {
dynaValues.put(name, value);
}
通过上面的方法就能得到该请求需要的formbean信息,然后交给父类ActionForm进行数据的收集,具体的收集步骤请参考:整理笔记二里面的processPopulate方法
总结
1、DynaActionForm调用 public void initialize(ActionMapping mapping) 方法,得到一个FormBeanConfig对象
2、FormBeanConfig里面有一个属性值为 protected HashMap formProperties = new HashMap();,这个属性值里面封装了所有的DynaAction动态数据的信息
3、通过参数name得到该请求对应的的类型,其中name的值为
4、调用public void initialize(FormBeanConfig config)方法
5、该方法再调用findFormPropertyConfigs()方法,里面其实就是返回了FormBeanConfig里面的属性 protected HashMap formProperties = new HashMap();,里面封装了该里面的所有属性与其对应的值
6、然后再遍历formProperties集合在调用set(props[i].getName(), props[i].initial());,往DynaActionForm里面的属性 protected HashMap dynaValues = new HashMap();设值,这个属性就完成了对页面表单的收集
7、在后台得到参数,是作为一个map集合存在的,所以不能使用对里面的属性值进行赋值给po(结果Bean)
另:
附件里面有我一个最简单关于DynaActionForm的实现
转载请标明出处
感谢苏波老师的指导
个人见解、错误请指出!请莫怪