转自http://blog.163.com/louwp/blog/static/38370029200975102845890/
Struts 中定义了一些JavaBeans,主要是以ActionForm为父类扩展开来的,如下图:
① org.apache.struts.action包中
public abstract class ActionForm implements Serializable
public class DynaActionForm extends ActionForm implements DynaBean
② org.apache.struts.validator包中
public class ValidatorForm extends ActionForm implements Serializable
public class DynaValidatorForm extends DynaActionForm
implements DynaBean, Serializable
③ org.apache.struts.validator包中
public class ValidatorActionForm extends ValidatorForm implements Serializable
public class DynaValidatorActionForm extends DynaValidatorForm
implements DynaBean, Serializable
1 . ActionForm中比较常用的两个方法是reset()和validator():
// 恢复ActionForm属性的默认值,如把boolean型设为true/false,字符串设为null。
public void reset( ActionMapping mapping, HttpServletRequest request ) { }
// validate 只检查数据格式和语法,不检查数据是否符合业务逻辑。
public ActionErrors validate( ActionMapping mapping, HttpServletRequest request ) { return (null); }
这两个方法的默认实现是不执行任何操作,我们可以重写这两个方法来实现相关逻辑。
注: 对于每个request,控制器都会先调用ActionForm的reset()方法,然后表单数据组装到ActionForm中。如ActionForm在request范围内,那么对于每个新的request请求都会创建新的ActionForm实例。新实例创建后,如果它的属性已经被初始化为默认值,那么接着再在reset()方法中把属性设为默认值不是很有必要,这时可以让reset()方法为空。
对于session范围内的ActionForm,同一ActionForm实例会被多个请求共享,reset()方法在这种情况下极为有用。
2 . 其中,ActionForm需要我们创建一个formbean类继承ActionForm,在ActionForm中可以定义一些property和get/set方法。
ActionForm 的property必须声明然后才可以使用,不过在查询时我们常常需要输入一些查询条件,这些查询条件(property)其实不需要在formbean中声明,这时可以使用Map对象来封装整个查询表单提交的数据,如下:
public class MapForm extends ActionForm {
private Map map = null;
public void setMap(Map map) {
this.map = map;
}
public Map getMap() {
return this.map;
}
// 增加查询条件(property)的get/set方法,并把数据放到Map中
public void setAttribute(String attributeKey, Object attributeValue) {
map.put(attributeKey, attributeValue);
}
public Object getAttribute(String attributeKey) {
Object keyValue = map.get(attributeKey);
return keyValue;
}
}
在页面上可以通过
<html:text property="attribute(id)"/>
来获取表单数据,这会调用getAttribute("id")方法。
3 . 其中,Dyna开头的动态ActionForm不需要创建具体的ActionForm类,只需通过Struts的配置文件就可以完成ActionForm的全部配置,如:
<form-bean name="optionsForm" type="org.apache.struts.action.DynaActionForm">
<form-property name="fruit1" type="java.lang.String" initial="Pear" />
<form-property name="fruit2" type="java.lang.String" initial="Apple" />
</form-bean>
4 . 其中,含有validator的ActionForm用来进行表单验证,验证方法有两种。
① 在struts-config.xml中设置action的validate属性为"true"(默认为"true"),
<action path="/updateUser"
type="com.cn.lively.action.UpdateUserAction"
name="userForm"
scope="request"
input="/jsp/updateUser.jsp"
cancellable="true"
validate="true" >
<forward name="success" path="/jsp/validator/updateUserResults.jsp"/>
</action>
并且在相应的formbean中重写其中的validate方法,在validate方法中实现自己的数据验证逻辑。
② 通过validation框架进行验证,这分为两步:
⑴ 在struts-config.xml中配置validation插件,
<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
<set-property property="pathnames"
value="/org/apache/struts/validator/validator-rules.xml,
/WEB-INF/validation.xml" />
</plug-in>
⑵ 配置formbean,有下面两种方法:
㈠ 使自己的formbean类继承含有validator的ActionForm
public class UserForm extends ValidatorForm{
private String userName;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
}
并配置struts-config.xml文件:
<form-bean name="userForm" type="com.cn.lively.formbean.UserForm">
</form-bean>
㈡ 使自己的formbean类继承含有validator的DynaValidatorForm
<form-bean name="userForm" type="org.apache.struts.validator.DynaValidatorForm">
<form-property name="userName" type="java.lang.String" />
</form-bean>
⑶ 配置validation.xml文件:
<formset>
<form name="userForm">
<field property="userName" depends="required">
<arg key="userForm.userName" />
</field>
</form>
</formset>
注: 注意 validation.xml文件中的userForm是struts-config.xml文件中formbean的名字。
关于arg的几个属性如下:
bundle :指定资源文件名,如不指定,则从默认资源文件中读取
key :从资源文件 ActionResources.properties 中得到的值
resource :key所指定的信息是否来自外部的资源文件,默认为true。如果为true,则代表key为buddle属性所指定的资源文件中的key。
position ,这个arg中的值用来替换信息中的哪一部分, 需要替换的部分以{n}标志。
5 . 关于ValidatorForm/DynaValidatorForm与ValidatorActionForm/DynaValidatorActionForm之间的区别
对于一个actionform,可以被多个action所使用,而每个action可能需要的验证字段都不一样,而validation.xml中配置的验证方式(如<form >)是对这个formbean进行的.
① 如果需要针对每个action来验证,则必须使formbean继承ValidatorActionForm(或者直接配置DynaValidatorActionForm)。如下两种方法:
㈠ 使自己的formbean类继承含有validator的ActionForm
public class UserForm extends ValidatorActionForm{
……
}
并配置struts-config.xml文件:
<form-bean name="userForm" type="com.cn.lively.formbean.UserForm">
</form-bean>
<action-mappings>
<action path="/createUser"
type="com.cn.lively.action.CreateUserAction"
name="userForm"/>
<action path="/updateUser"
type="com.cn.lively.action.UpdateUserAction"
name="userForm"/>
</action-mappings>
㈡ 使自己的formbean类继承含有validator的DynaValidatorActionForm
<form-bean name="userForm" type="org.apache.struts.validator.DynaValidatorActionForm">
<form-property name="userName" type="java.lang.String" />
</form-bean>
<action-mappings>
<action path="/createUser"
type="com.cn.lively.action.CreateUserAction"
name="userForm"/>
<action path="/updateUser"
type="com.cn.lively.action.UpdateUserAction"
name="userForm"/>
</action-mappings>
② 配置validation.xml文件:
<formset>
<form name="/createUser">
<field property="userName" depends="required">
<arg key="userForm.userName" />
</field>
</form>
<form name="/updateUser">
<field property="userName" depends="maxlength">
<arg key="userForm.userName" />
<arg key="prompt.max" position="0"/>
<arg name="maxlength" key="${var:maxlength}" resource="false" position="1" />
<var>
<var-name>maxlength</var-name>
<var-value>10</var-value>
</var>
</field>
</form>
</formset>
注: 注意validation.xml文件中的/createUser和/updateUser是struts-config.xml文件中action的path路径。
如果我们查看struts源码,可以很清楚的看到ValidatorForm/DynaValidatorForm与ValidatorActionForm/DynaValidatorActionForm之间的区别
ValidatorForm 中的方法
* @return validation key - the form element's name in this case
public String getValidationKey(ActionMapping mapping,
HttpServletRequest request) {
return mapping.getAttribute(); // 返回formbean的名字
}
ValidatorActionForm 中的方法
* @return validation key - the action element's 'path' attribute in this * case
public String getValidationKey(ActionMapping mapping,
HttpServletRequest request) {
return mapping.getPath(); // 返回action的路径
}
7 . 上面的验证是在服务器端进行,如需要在客户端进行js验证,需要在页面上配置:
① <html:form action="/ createUser" onsubmit="return validateUserForm(this);">
格式为 return validate + formbean名称(首字母大写) + (this)
用来在提交本页面时执行相应的js验证代码。
② 用来生成本页面的 js 验证代码。 有两种方法:
⑴ 一是 在页面上声明
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>
<html:javascript formName="userForm" dynamicJavascript="true" staticJavascript="true"/>
因为dynamicJavascript/staticJavascript在JavascriptValidatorTag.java中默认为true,所以上面也可以直接写:<html:javascript formName="userForm"/>
struts-html.tld
<tag>
<name>javascript</name>
<tag-class>org.apache.struts.taglib.html.JavascriptValidatorTag</tag-class>
</tag>
注: 在客户端执行的js验证如果不通过,会alert出对话框进行提示,服务器 端 的验证(在页面上可以用<html:errors/>来显示出错信息)就不会执行。
注意只有dynamicJavascript="true" + staticJavascript="true" 才能生成完整的 js 验证代码 ,如果把任何一个设为"false"提交页面时都会产生js错误,除非我们采用下面⑵的方法进行声明。
⑵
Ⅰ 在本页面上声明
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>
<html:javascript formName="userForm" dynamicJavascript="true" staticJavascript="false"/>
<script language="Javascript1.1" src="staticJavascript.jsp"/></script>
Ⅱ 定义staticJavascript.jsp的内容为
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>
<html:javascript dynamicJavascript="false" staticJavascript="true"/>
注: dynamicJavascript 表示是否在页面内生成动态的js,staticJavascript属性代表是否在页面内生成静态js。 如staticJavascript设为"true",则validator-rules.xml文件中的规则检查生成的js代码都会生成到本页面内。这样本页面会越来越大,一般最好是将staticJavascript设为"false", 将validator-rules.xml生成的js代码填充到一个指定的jsp页面(staticJavascript.jsp)中去。
附:
只有 dynamicJavascript="true" + staticJavascript="true" 才能生成完整的 js 验证代码 ,下面是⑵ Ⅰ 中dynamicJavascript="true"生成的参考代码:
var bCancel = false;
function validateUserForm(form) {
if (bCancel) {
return true;
} else {
var formValidationResult;
// 调用staticJavascript.jsp中staticJavascript="true"生成的js代码
formValidationResult = validateByte(form) && validateEmail(form);
return (formValidationResult);
}
}
// validator-rules.xml 中定义了<validator
// jsFunctionName=" ByteValidations "/>
// 则生成js函数名称为 formbean 名称 + 下划线 + jsFunctionName
function userForm_ByteValidations() {
this.a0 = new Array("byteValue", "Byte must be a byte.", new Function ("varName", " return this[varName];"));
}
// validator-rules.xml 文件中没有定义jsFunctionName,<validator BACKGROUND: silver; COLOR: red; FONT-FAMILY: 宋体; mso-bidi-font-family: Arial; mso-highlight: silver">email "/>
// 则生成js函数名称为 formbean 名称 + 下划线 + validator name
function userForm_email() {
this.a0 = new Array("email", "Email is an invalid e-mail address.", new Function ("varName", " return this[varName];"));
}
下面 是⑵ Ⅱ 中 staticJavascript.jsp 中 staticJavascript="true" 生成的参考代码:
function validateByte(form) {
// ……
// 调用 userForm_ ByteValidations ()
// ……
}
function validateEmail(form) {
// ……
// 调用 userForm_ email ()
// ……
}
分享到:
相关推荐
博客文章"Struts学习笔记之ActionForm - xiaodaoxiaodao——蓝小刀的自言自语 - BlogJava.mht"可能包含更深入的实践示例和经验分享,包括如何处理ActionForm的生命周期、动态Form Beans、国际化等话题。通过阅读这篇...
Struts学习笔记之ActionForm ActionForm是Struts框架中的一种重要组件,用于封装和处理用户的表单数据。在Struts中,ActionForm是继承自JavaBeans的,主要用于处理用户的表单数据和业务逻辑。下面是ActionForm的...
ValueStack是一个对象栈,它持有ActionContext上下文中的所有对象,包括Action实例、ActionForm、Session、Request等。OGNL通过ValueStack进行数据查找和操作,简化了视图层的数据绑定。 **五、Tags** Struts2提供...
在本“Struts学习笔记(四)”中,我们将会深入探讨Struts框架的核心概念、工作原理以及如何实际运用到项目开发中。 首先,Struts框架的核心目标是提供一个结构化的开发环境,将业务逻辑、数据处理和用户界面有效地...
Struts是Java EE平台上的一款流行开源MVC框架,...学习Struts不仅有助于理解MVC模式,也能为其他类似的Web框架打下坚实的基础。通过深入研究和实践,开发者可以充分利用Struts的特性,构建出高效、稳定的Web应用程序。
本学习笔记将对Struts1和Struts2进行详细解析。 **Struts1简介** Struts1是早期流行的MVC框架,它的核心是ActionServlet,负责处理HTTP请求,并通过ActionForm对象收集表单数据,然后调用Action类的方法进行业务...
`struts-config.xml` 是Struts的核心配置文件,定义了Action、ActionForm和ActionForward等信息。 **请求驱动的MVC框架**: 像Struts这样的框架是基于请求驱动的,根据URI决定调用哪个Action类来处理请求。Action...
"Struts学习笔记"显然是一个针对Struts框架深入学习的资料集合,旨在帮助初学者从基础开始,逐步掌握Struts的核心概念和实践技巧。 在学习Struts的过程中,有几个关键知识点是必须理解的: 1. **MVC模式**:MVC是...
本篇学习笔记将深入探讨Struts的核心概念、工作原理以及如何在实际项目中应用Struts来构建高效、可维护的Web应用程序。 一、Struts框架概述 Struts作为经典的MVC框架,它为Java开发者提供了一种组织应用程序逻辑的...
Struts是Java Web开发中的一个开源框架,它主要用于构建基于MVC(模型-视图-控制器)模式的应用程序。...不过,这只是Struts学习的一个起点,深入掌握还需要不断实践和探索更多的高级特性和最佳实践。
Struts1学习笔记总结 Struts1是一种基于MVC模式的Web应用框架,它可以帮助开发人员快速构建高效、可维护的Web应用程序。下面是对Struts1学习笔记的总结,涵盖了Struts1的基本概念、工作流程、标签、国际化等方面的...
这个版本的学习笔记主要集中在 Struts 框架的基础知识、架构和核心组件上,帮助开发者更好地理解和应用这个经典版本。在这个笔记中,我们将深入探讨 Struts 的工作原理、配置以及它如何简化 MVC(模型-视图-控制器)...
### Struts2学习笔记知识点详解 #### 一、基础知识 **1. Struts2核心组件** - **XWork-2.0.5.jar**: 引入WebWork框架的核心功能,这是Struts2的一个重要组成部分,提供了请求处理的核心逻辑。 - **Commons-...