Struts 学习笔记之ActionForm

转自http://blog.163.com/louwp/blog/static/38370029200975102845890/
Struts 中定义了一些JavaBeans,主要是以ActionForm为父类扩展开来的,如下图:


[img]http://www.blogjava.net/images/blogjava_net/xiaodaoxiaodao/actionform.JPG[/img]



① 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 ()

// ……

}
内容概要:本文档提供了关于“微型车间生产线的设计与生产数据采集试验研究”的毕业设计复现代码,涵盖从论文结构生成、机械结构设计、PLC控制系统设计、生产数据采集与分析系统、有限元分析、进度管理、文献管理和论文排版系统的完整实现。通过Python代码和API调用,详细展示了各个模块的功能实现和相互协作。例如,利用SolidWorks API设计机械结构,通过PLC控制系统模拟生产流程,使用数据分析工具进行生产数据的采集和异常检测,以及利用进度管理系统规划项目时间表。 适合人群:具有机械工程、自动化控制或计算机编程基础的学生或研究人员,尤其是从事智能制造领域相关工作的人员。 使用场景及目标:①帮助学生或研究人员快速搭建和理解微型车间生产线的设计与实现;②提供完整的代码框架,便于修改和扩展以适应不同的应用场景;③作为教学或科研项目的参考资料,用于学习和研究智能制造技术。 阅读建议:此资源不仅包含详细的代码实现,还涉及多个学科领域的知识,如机械设计、电气控制、数据分析等。因此,在学习过程中,建议读者结合实际操作,逐步理解每个模块的功能和原理,并尝试调整参数以观察不同设置下的系统表现。同时,可以参考提供的文献资料,深入研究相关理论和技术背景。
本次的学生体质健康信息管理网站,按照用户的角色可以分为教师与学生,后台设置管理员角色来对学生的信息进行管理。,设计如下: 1、后台管理系统 后台管理系统主要是为该系统的管理员提供信息管理服务的系统,具体包括的功能模块如下: (1)管理员信息管理 (2)教师信息管理 (3)学生信息管理 (4)健康信息统计(图形化进行健康,亚健康等学生的信息数量统计) 2、教师角色的功能模块设计 教师角色所需要的功能模块主要包括了如下的一些内容: (1)个人资料修改 (2)学生体质健康管理:录入相关数据,包括但不限于身高、体重、肺活量、视力等生理指标以及运动能力、身体成分、骨密度等健康指标,并且设置健康,亚健康状态 (3)学生健康建议:根据体质信息,进行学生健康的建议 (4)健康预警:对健康出问题的学生,进行健康预警 (5)饮食和锻炼情况管理,查看 3、学生角色 学生角色可以通过该信息网站看到个人的基本信息,能够看到教师给与学生的健康建议等,功能模块设计如下: (1)个人资料修改 (2)我的健康建议查看 (3)我的健康预警 (4)饮食和锻炼情况管理,记录平时的饮食和锻炼情况 完整前后端源码,部署后可正常运行! 环境说明 开发语言:Java后端 框架:ssm,mybatis JDK版本:JDK1.8+ 数据库:mysql 5.7+ 数据库工具:Navicat11+ 开发软件:eclipse/idea Maven包:Maven3.3+ 部署容器:tomcat7.5+
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值