JavaBean的子类 可以自动的对输入进行效验 Struts标签也允许任何javabean来填充某个Html组件
1 ActionForm的创建
1 由于ActionForm本身不能实例化 所以必须是ActionForm的子类
2 必须对每个Html控件定义一个公共的属性
另外 如果想发给Action之前就进行效验 可以实现validate方法 如果想重置数据可以实现reset方法 这两个方法都会在ActionForm填充前被调用
void |
reset(ActionMapping mapping, javax.servlet.http.HttpServletRequest request) Reset bean properties to their default state, as needed. |
void |
reset(ActionMapping mapping, javax.servlet.ServletRequest request) Reset all bean properties to their default state. |
ActionErrors |
validate(ActionMapping mapping, javax.servlet.http.HttpServletRequest request) Validate the properties that have been set for this HTTP request, and return an ActionErrors object that encapsulates any validation errors that have been found. |
ActionErrors |
validate(ActionMapping mapping, javax.servlet.ServletRequest request) Validate the properties that have been set for this non-HTTP request, and return an ActionErrors object that encapsulates any validation errors that have been found. |
例子 Action 1 里的LogonForm.java
... {
ActionErrors errors = new ActionErrors();
if ((username == null) || (username.length() < 1))
errors.add("username",
new ActionError("error.username.required"));
if ((password == null) || (password.length() < 1))
errors.add("password",
new ActionError("error.password.required"));
return errors;
}
那么它在struts-config.xml中的映射就比较简单
< form-bean name ="logonForm" type ="ergal.LogonForm" />
</ form-beans >
另外还有一个DynaActionForm是ActionForm的子类 它是通过配置文件来定义属性的
type ="org.apache.struts.action.ActionForm" >
< form-property name ="name"
type ="java.long.string" />
< form-property name ="password
type=" java.long.string" />
</ form-bean >
这样不需要编码来实现JavaBean可以更快更安全
2 ActionForm的主要工作
填充自己的域 数据缓存 数据效验 类型转换和对象传递
填充自己的域
html表单通过web传到服务器时是 文本格式 表单里的元素变成了 名字-数值 对 都是字符串 而不是二进制
html上传文件和附件也都是经过转化成文本数据 然后再转化回去的方法
那么Struts是将输入域转化成javabean的属性 当ActionForm的某个属性和请求中的某个参数名一致时 Struts会自动的将参数值赋给javabean的相应的属性
数据缓存
ActionForm可以充当HTML控件中缺少的缓存区 在传给其他的域之前 ActionForm会保存数据 还可以进行简单的验证
数据效验
前面所讲的validate方法可以简单效验是否符合基本标准 如果不对可以全部返回 让用户修改 也就时效验类型是否符合真正的业务层的需求
类型转换
可以在ActionForm内部进行一些类型转换 但是ActionForm只能使用string和boolean属性的值 所以可以附加一些函数来对数据进行转换
简单的例子
public String getKeyDisplay()
... {
return keyDisplay;
}
public Integer getKey()
... {
return new Integer(getKeyDisplay());
}
然后业务层就可以使用getKey()方法来得到需要的数据类型
ActionForm可以内含其他bean
Struts标签和自动填充机制可以支持用点分隔语法来访问ActionForm中的其他bean
如:
size ="4"
maxlength ="14" >
可以使用ActionServlet的包装类ActionServletWrapper来进行保护 这个包装类里面的
protected ActionServlet |
servlet The servlet instance to which we are attached. |
受到保护
3 使用ActionForm
1 实现业务逻辑
如果业务层有接口可用 可以实现这个接口 这样就可以直接传递给业务层
2 当内含bean数据对象时 属性可以用点分隔来引用
3 设置不可改变的数据对象
暂略...
4 设置可改变的数据对象
暂略...
5 使用工厂方法
要在ActionForm中来完成这个转换过程 如果必须创建数据对象 好方法就是工厂方法
例子:
... {
A bean=new A(this.getA1(), this.getA2(), this.getA3())
return bean;
}
还可以传递一个存在的数据对象
6 传递一个Map对象
首先将一个属性添加到ActionForm中
public void setMap(Map map)
... {
this.map=map;
}
public Map getMap()
... {
return this.map;
}
然后添加一个属性来访问Map
... {
getMap().put(key, value);
}
public Object getValue(String key) throws Exception
... {
return getMap.get(Key);
}
在Struts标签中可以用下面方法来访问Map的元素
< bean:write name ="formbean" property ="value(key)" />