- 浏览: 111790 次
- 性别:
- 来自: 成都
文章分类
- 全部博客 (134)
- java (134)
- [转]sqlserver 数据类型 及使用考虑 (1)
- 保存、读取、删除到sdcard图片 (1)
- hashcode 重写 (1)
- sql2008导出数据 (1)
- Android开发(1):随机绘制彩色实心圆 (1)
- JPA 应用技巧 1:实体类和实体 DAO 模板 (1)
- 狩魂之神即将开测 - 2012年最值得期待的网页游戏 (1)
- mantis (1)
- MediaWiki (1)
- ExtMail (1)
- MDaemon搭建公司项目环境 (1)
- NIO 之 选择就绪模式 (1)
- web应用系统架构设计 (1)
- XML CDATA (1)
- firefox+Firebug调试JavaScript、HTML和CSS (1)
- 在SUSE 11中安装Windows虚拟机 (1)
- 将字节流(byte[])转换成文件 (1)
- HTML5网站 (1)
- 在Android中自定义IOS风格的按钮 (1)
- 基于SVG的WebGIS的一个雏形 (1)
- 程序名称DreamIT(梦想IT)提供许多IT公司的面试和笔试试题 (1)
- 介绍一个ASP.NET开发工具Web Matrix (1)
- C#信息采集工具实现 (1)
- Qt 4.7.4 完美动态编译发布动态调试,以及静态编译发布 (1)
- 2011面试题目之猴子偷桃 (1)
- Linux tar压缩时排除某个目录或文件的参数 (1)
- Crack JRebel 4.0,无需重启JVM,热部署解决方案 (1)
- Groovy Sql使用Spring的事务管理 (1)
- <<让oracle跑的更快1>>读书笔记2 (1)
- 不要再浪费时间 (1)
- JSP (1)
- PHP (1)
- Python (1)
- Ruby (1)
- Perl概要及各自特点 (1)
- JVM 内存结构(转) (1)
- [转载]JPA 批注参考(1) (1)
- Hadoop配置部分内容 (1)
- HD2刷机的基础知识 HD2的radio、HSPL、ROM三种组合 (1)
最新评论
-
alexyao8:
顶起
[G4Studio开源平台]如何搭建G4开发环境 -
greatghoul:
太二了。
不要再浪费时间 -
wengbo316:
它们一定是花果山的猴子,数数能数到3K多呢。。。
2011面试题目之猴子偷桃 -
mycar:
额.待补充...........
保存、读取、删除到sdcard图片 -
沙舟狼客:
这太折磨人了, 还有人要看吗?
[] javaeye rss抓取
<h2>验证器:</h2>从0.5版,验证器在一些form中就已经实现了,他最初包含在开发人员包中,后来核心代码挪到jakarta commons包中和struts特别扩展中作为 struts 1.1的一部分。许多开发者为方便一直使用struts验证器,这篇文档首先概述验证器的核心功能性,然后大概介绍在 struts1.1中的变化和新增功能。
如果你配置好验证器插件,你应该扩展validatorform而不是actionform,以便它能加载你的validator资源。他根据struts-config.xml文件中的action的name属性为当前form的调用相应的验证器,因此在validator-rules.xml中的form元素的名称属性应该与action的name属性值相匹配。
另外一种选择是扩展validatoractionform 而不是validatorform,validatoractionform使用struts-config.xml中action的path属性,所以path属性的值相应的应该与validator-rules.xml中的form的name属性匹配。
一个分离的action可以定义给多页form的每个页面,而且验证规则可以与action关联而不是与页码,就像验证范例中的多页form范例那样。
<h2>国际化</h2>在validator-rules.xml 文件中form的验证规则可以组织为formset。formset 有与java.util.locale 类相应的属性:如语言, 国家以及变量型属性,如果他们未定义,formset 将把它设置为默认值。一个formset 也可以有关联的常量。另外还可以定义与formset 同一级别的全局global元素,他与formset同样也有常量。
注意:你必须在国际化的formset前声明一个没有国际化的默认formset。这样如果validator没有找到locale时可以有一个默认版本。
可插入验证器的默认错误信息值可以被msg元素覆盖。所以为mask验证器生成错误信息的替代方法就是使用msg属性,如果字段的name属性与验证器的name属性匹配,那末将使用字段的msg属性。
error messages的可以设置arg0-arg3 等参数元素。如果没有设置arg0-arg3的name属性, error messages将使用他们作为默认的构建参数值。如果设置了name属性,你就可以把参数指定给一特定的可插入验证器,然后这些参数将在构造错误信息时被使用。
<field
property="lastname"
depends="required,mask">
<msg
name="mask"
key="registrationform.lastname.maskmsg"/>
<arg0 key="registrationform.lastname.displayname"/>
<var>
<var-name>mask</var-name>
<var-value>^[a-za-z]*$</var-value>
</var>
</field>
默认的arg0-arg3元素将在消息资源中查找相应的key,如果资源属性设为false,她将把值直接传进去,而不从消息资源中查找。注意1.1版本中,你必须为每个模块中明确地定义在验证中用到的消息资源,否则将使用top-level资源。
<field
property="integer"
depends="required,integer,intrange">
<arg0 key="typeform.integer.displayname"/>
<arg1
name="range"
key="${var:min}"
resource="false"/>
<arg2
name="range"
key="${var:max}"
resource="false"/>
<var>
<var-name>min</var-name>
<var-value>10</var-value>
</var>
<var>
<var-name>max</var-name>
<var-value>20</var-value>
</var>
</field>
<h2>常量<span>/</span>变量</h2>全局的常量可以在全局标签中定义,formset/本地常量能在formset 标签中创建。常量当前仅仅是代替字段的property属性,字段的var 元素的 value属性,字段的msg 元素的 key属性,字段的arg0-arg3 元素的 key属性。字段的变量也可以在arg0-arg3 元素中被代替(例如:${var:min}))。替换的顺序是formset/locale常量第一,全局的常量第二,
arg elements 变量最后。
<global>
<constant>
<constant-name>zip</constant-name>
<constant-value>^\d{5}(-\d{4})?$</constant-value>
</constant>
</global>
<field
property="zip"
depends="required,mask">
<arg0 key="registrationform.zippostal.displayname"/>
<var>
<var-name>mask</var-name>
<var-value>${zip}</var-value>
</var>
</field>
验证器可以使用字段下面的变量部分来存储变量,这些变量通过字段的getvar((string key)方法取得。
<field
property="integer"
depends="required,integer,intrange">
<arg0 key="typeform.integer.displayname"/>
<arg1
name="range"
key="${var:min}" resource="false"/>
<arg2
name="range"
key="${var:max}" resource="false"/>
<var>
<var-name>min</var-name>
<var-value>10</var-value>
</var>
<var>
<var-name>max</var-name>
<var-value>20</var-value>
</var>
</field>
<h2>使用<span>validwhen</span>设计复杂的验证</h2>使用validwhen来设计复杂验证的一个经常的要求就是根据一个字段验证另外一个字段(比如, 如果你要用户两次输入口令来确认值口令一致),另外一个就是表单中的一个字段只有另外一个字段有确定值的时候才是必须输入的。新的validwhen验证规则将很快被包含在1.1后的struts版本中,她就是用来处理这种情况的。
validwhen 规则处理单个的变量字段,叫测试。这变量的值是一个布尔的表达式,如果验证有效则它必须为真。可以包含这种变量的表达式有:
u 单引号或双引号字符串literals,
u 十进制、十六进制、八进制的integer literals,
u null与null和空字符串匹配,
u 其它可以用属性名引用的form字段,例如customerage,
u 可以在外部因用得索引字段, 例如childlastname[2],
u 可以默认implicit因用得索引字段, 例如childlastname[], 她将作为被索引的字段使用同样的索引到数组中,
the literal *这里指它包含当前测试字段的值,
作为例子,考虑一个包含通讯地址和邮箱字段的form。如果通讯地址不为空则邮箱字段是必须的required。你能这样定义validwhen 规则:
<field property="emailaddress" depends="validwhen">
<arg0 key="userinfo.emailaddress.label"/>
<var>
<var-name>test</var-name>
<var-value>((sendnewsletter == null) or (*this* != null))</var-value>
</var>
</field>
上面定义的意思是:如果通讯地址是空或不空时这个字段时有效的。
这里有个稍微复杂的例子,它使用了索引字段。假定有一个表单,允许用户输入他们希望定购的部件号和数量。类orderline 的bean的一数组被用来在称为orderlines 的一属性保持输入项。
if you wished to verify that every line with part number also had a quantity entered, you could do it with:
如果你希望校验订单中有数量输入得每一行,你可以这样:
<field
property="quantity"
indexedlistproperty="orderlines"
depends="validwhen">
<arg0 key="orderform.quantity.label"/>
<var>
<var-name>test</var-name>
<var-value>((orderlines[].partnumber == null) or (*this* != null))</var-value>
</var>
</field>
这里的意思是:如果相应的partnumber 字段是空, 或这字段是不空的,则这字段是有效的。
最后一个例子,想象一表单,用户必须输入他们的以英寸为单位的高度,如果他们在高度在60英寸以下,则出一错误。(it is an error to have checked off nbapointguard as a career.)
<field property="nbapointguard" depends="validwhen">
<arg0 key="careers.nbapointguard.label"/>
<var>
<var-name>test</var-name>
<var-value>((heightininches >= 60) or (*this* == null))</var-value>
</var>
</field>
给程序员的简单说明:
所有的比较关系必须在parens 封装。all comparisons must be enclosed in parens.
只有两个itme时可以and或or链接。
如果比较的两item都可以转为整数,则使用numeric比较,否则使用字符串比较。
<h2>可插入验证器</h2>验证是从validation.xml 文件中加载的,默认的验证规则定义在validation.xml 文件中,默认定义了required, mask ,byte, short, int, long, float, double, date (没有本地支持), and a numeric range。
" mask "方式依赖于默认值安装要求,那意味着"required "可以完成,在"'mask "将运行以前"required "和" mask "方式被默认包含进框架中了。任何字段如果不是"required "而且是空或有零长度将跳过其他验证。
如果使用了javascript 标签,客户端javascript在validator's javascript 属性中查找值而且产生一个有验证form方法的对象,要得到更多的关于javascript validator 标签工作细节的详细的解释,参阅html标签api参考。
"'mask' "方式让你用一正则表达式掩码验证字段,它使用jakarta的正规表达式包,所有的有效性规则存储在validator-rules.xml 文件,使用的主类是org.apache.regexp.re。
validation.xml文件中的验证器配置范例:
<validator name="required"
classname="org.apache.struts.validator.fieldchecks"
method="validaterequired"
methodparams="java.lang.object,
org.apache.commons.validator.validatoraction,
org.apache.commons.validator.field,
org.apache.struts.action.actionerrors,
javax.servlet.http.httpservletrequest"
msg="errors.required">
<validator name="mask"
classname="org.apache.struts.validator.fieldchecks"
method="validatemask"
methodparams="java.lang.object,
org.apache.commons.validator.validatoraction,
org.apache.commons.validator.field,
org.apache.struts.action.actionerrors,
javax.servlet.http.httpservletrequest"
msg="errors.invalid">
<h3><span>定义可插入验证器</span></h3>方法的参数是用逗号分隔的一些类名称列表,方法属性需要有一个符合上面的列表的签名。列表由以下组合而成:
java.lang.object - 要验证的bean。
org.apache.commons.validator.validatoraction - 当前validatoraction。
org.apache.commons.validator.field - 要验证的字段
org.apache.struts.action.actionerrors - 如果验证错误将加入actionerror的错误对象javax.servlet.http.httpservletrequest -当前request 对象。
javax.servlet.servletcontext - 应用的servletcontext。
org.apache.commons.validator.validator-当前的org.apache.commons.validator.validator实例。
java.util.locale - 当前用户的locale。
<h3><span>多页面form</span></h3>字段部分有一可选的页面属性,它可以被设为整数,页上字段的所有验证小于或等于服务器端验证的当前页,页上字段的所有验证小于或等于客户端页上所有字段的验证小于或等于服务器端验证的当前页验证的当前页。一个mutli-part表单需要定义页面属性:
<html:hidden property="page" value="1"/>。
<h3><span>比较两个字段</span></h3>这是一个展示你怎样才能比较两个字段是否有一样的值的例子。比如"用户改变他们的口令"一般会有口令字段和一确认字段。
<validator name="twofields"
classname="com.mysite.strutsvalidator"
method="validatetwofields"
msg="errors.twofields"/>
<field property="password" depends="required,twofields">
<arg0 key="typeform.password.displayname"/>
<var>
<var-name>secondproperty</var-name>
<var-value>password2</var-value>
</var>
</field>
public static boolean validatetwofields(
object bean, validatoraction va,
field field, actionerrors errors, httpservletrequest request,
servletcontext application) {
string value = validatorutils.getvalueasstring( bean, field.getproperty());
string sproperty2 = field.getvarvalue("secondproperty");
string value2 = validatorutils.getvalueasstring( bean, sproperty2);
if (!genericvalidator.isblankornull(value)) {
try {
if (!value.equals(value2)) {
errors.add(field.getkey(),
resources.getactionerror( application, request, va, field));
return false;
}
} catch (exception e) {
errors.add(field.getkey(), resources.getactionerror( application, request, va, field));
return false;
}
}
}
<h2>已知的<span>bug</span></h2>struts validator依赖于commons validator包,所以问题报告和增强需求可能在两个产品中列出。
· <span style="color: #023264;">struts validator bugzilla reports </span>
· <span style="color: #023264;">commons validator bugzilla reports</span>
<h2>变更和<span>deprecations </span></h2>新建的标记属性。<br>
<html:javascript>标记有新的属性定义.
使用commons-validator.jar中的dtd验证。<br>
当前使用的验证xml文件是根据commons-validator.jar中的dtd。struts不在为validator-rules.xml and validator.xml.单独维护一个分离的dtd,另外,commons-validator 现在维护一个统一的validator.dtd。修改所有validator.xml文件的dtd引用为
<!doctype form-validation public
"-//apache software foundation//dtd commons validator rules configuration 1.0//en"
"http://jakarta.apache.org/commons/dtds/validator_1_0.dtd">
空字段。<br>
当前默认在所有得基础验证类型中忽略空白的字段,如果你要求一个字段必须输入,那末在你的应用的validator.xml 文件相应的字段定义的depends属性中添加 " required "。
新建的范围range方法.<br>
javascript 和java中都添加了intrange & floatrange 方法。
有条件地required字段.<br>
最大的修改是添加了基于其她字段的值的有条件地require验证的能力。它允许你定义逻辑如:"只有x字段非空的时候y字段为'male'才有效",这是实现上述逻辑的推荐方法,这种方法在1.1版后的第一版将实现。在1.1版中添加的requiredif验证规则,将在新版中去掉。不过,如果你正准备使用requiredif,这里有一个简短的教程。
让我们假定你有一个有3个字段的医药的信息表单,性别sex,怀孕测试pregnancytest,测试结果testresult,如果性别为'f' or 'f',则怀孕测试pregnancytest是required,如果pregnancytest不是空,测试结果testresult是required。
你的validation.xml 文件的输入项应该是这样的:
<form name="medicalstatusform">
<field property="pregnancytest" depends="requiredif">
<arg0 key="medicalstatusform.pregnancytest.label"/>
<var>
<var-name>field[0]</var-name>
<var-value>sex</var-value>
</var>
<var>
<var-name>fieldtest[0]</var-name>
<var-value>equal</var-value>
</var>
<var>
<var-name>fieldvalue[0]</var-name>
<var-value>f</var-value>
</var>
<var>
<var-name>field[1]</var-name>
<var-value>sex</var-value>
</var>
<var>
<var-name>fieldtest[1]</var-name>
<var-value>equal</var-value>
</var>
<var>
<var-name>fieldvalue[1]</var-name>
<var-value>f</var-value>
</var>
<var>
<var-name>fieldjoin</var-name>
<var-value>or</var-value>
</var>
</field>
<field property="testresult" depends="requiredif">
<arg0 key="medicalstatusform.testresult.label"/>
<var>
<var-name>field[0]</var-name>
<var-value>pregnancytest</var-value>
</var>
<var>
<var-name>fieldtest[0]</var-name>
<var-value>notnull</var-value>
</var>
</field>
</form>
这里有一个使用索引的属性更复杂的例子,如果你的struts-config.xml 有这下面:
<form-bean name="dependentlistform"
type="org.apache.struts.webapp.validator.forms.validatorform">
<form-property
name="dependents"
type="org.apache.struts.webapp.validator.dependent[]" size="10"/>
<form-property name="insuredependents" type="java.lang.boolean" initial="false"/>
</form-bean>
这里dependentlistform bean有lastname,firstname,dob,coveragetype四个属性,你可以这样定义一验证规则:
<form name="dependentlistform">
<field
property="firstname" indexedlistproperty="dependents" depends="requiredif">
<arg0 key="dependentlistform.firstname.label"/>
<var>
<var-name>field[0]</var-name>
<var-value>lastname</var-value>
</var>
<var>
<var-name>fieldindexed[0]</var-name>
<var-value>true</var-value>
</var>
<var>
<var-name>fieldtest[0]</var-name>
<var-value>notnull</var-value>
</var>
</field>
<field
property="dob" indexedlistproperty="dependents" depends="requiredif,date">
<arg0 key="dependentlistform.dob.label"/>
<var>
<var-name>field[0]</var-name>
<var-value>lastname</var-value>
</var>
<var>
<var-name>fieldindexed[0]</var-name>
<var-value>true</var-value>
</var>
<var>
<var-name>fieldtest[0]</var-name>
<var-value>notnull</var-value>
</var>
</field>
<field
property="coveragetype" indexedlistproperty="dependents" depends="requiredif">
<arg0 key="dependentlistform.coveragetype.label"/>
<var>
<var-name>field[0]</var-name>
<var-value>lastname</var-value>
</var>
<var>
<var-name>fieldindexed[0]</var-name>
<var-value>true</var-value>
</var>
<var>
<var-name>fieldtest[0]</var-name>
<var-value>notnull</var-value>
</var>
<var>
<var-name>field[1]</var-name>
<var-value>insuredependents</var-value>
</var>
<var>
<var-name>fieldtest[1]</var-name>
<var-value>equal</var-value>
</var>
<var>
<var-name>fieldvalue[1]</var-name>
<var-value>true</var-value>
</var>
<var>
<var-name>fieldjoin</var-name>
<var-value>and</var-value>
</var>
</field>
</form>
这里的意思是:
如果lastname 字段是非空的,firstname 字段required。因为字段indexed 为真,这它意味着lastname的indexed 必须与firstname 的索引的一样,dob同理,除非date不为空。
如果lastname 用样索引时的值不空, 而且非索引字段insuredependents为真,则coveragetype 是only require。
你可以对字段在[n]中使用任意数字,唯一的限制是他们必须都是and或or,你无法混合使用。
deprecation:<br>
u javascript 和java的range方法.
u strutsvalidator &strutsvalidatorutil 类中的deprecation方法
<h2>验证器<span>api</span>指南</h2>一个简明的<span style="color: #023264;">struts验证器api指南</span> 可以帮助你开始。
<h2>验证器资源</h2><span style="color: #023264;">struts validator: validating two fields match</span><span> 作者matt raible。(两个字段匹配验证)关于使用方法的文章。(范例部分为翻译此文内容)</span>
<span style="color: #023264;">dynaforms and the validator</span><span> 作者james turner and kevin bedell。</span><span style="color: #023264;">struts kickstart</span><span>的其中一章(动态form和验证器),可以自由下载pdf). </span>
<span style="color: #023264;">validating user input</span><span> 作者 david winterfeldt and ted husted。</span><span style="color: #023264;">struts in action</span><span>的其中一章,可以自由下载(pdf)。</span>
<br>
<h1>使用方法</h1>作者:
丑陋 && snowtears:经过2周的不懈努力,阅读了大量的资料,终于对validator有了个初步的认识,整理了一下,浅浅的谈了谈写法,希望能有一定的帮助,其中肯定有许多说的不对不准确的地方,还请多指教 <span style="color: #023264;">real_herozx@163.net</span>
王艺:
根据以上两位的文章正理而成
<h2>配置<span>ruts-config.xml</span>:</h2><h3><span>1、</span> <span>添加applicationresources配置文件。</span></h3>如:
<!-- ========== message resources definitions =========================== -->
<message-resources parameter="com.dc.sibss.om.struts.applicationresources" />
其中com.sibss.om.struts.applicationresources"的部分是资源文件的路径,此文件的作用是提供错误信息的非编程定制化和多语言支持。如果我们使用中文平台操作系统,则默认情况下将首先查找applicationresource_zh_cn.properties文件,然后是applicationresources_zh.properties,如果前两个文件没有被找到则将查找applicationresources.properties文件。
为了能够在页面上显示错误提示信息,我们还需要将以下内容添加到applicationresources.properties文件的末尾:
errors.required={0} is required.
errors.minlength={0} cannot be less than {1} characters.
errors.maxlength={0} cannot be greater than {2} characters.
errors.invalid={0} is invalid.
errors.byte={0} must be an byte.
errors.short={0} must be an short.
errors.integer={0} must be an integer.
errors.long={0} must be an long.
errors.float={0} must be an float.
errors.double={0} must be an double.
errors.date={0} is not a date.
errors.range={0} is not in the range {1} through {2}.
errors.creditcard={0} is not a valid credit card number.
errors.email={0} is an invalid e-mail address.
以上仅是struts现在支持的错误类型的错误提示信息,如果你自定义了新类型的错误验证,则还需要在此加上你自己的内容。
以上内容中的{0}指的是错误提交的参数。比如:当你需要页面上的"用户名"不能为空时(也就是上面的errors.required),这个{0}就代表"用户名",所以如果你没有填写用户名将抛出如下错误:
用户名 is required.(你可以根据需要修改称中文)
我们可能已经注意到了,既然错误提示信息需要配置,那么上例中"用户名"系统是如何得到的呢?没错!也是通过修改此配置文件,内容如下:
visitcust.error.name.required=<br>用户名
这样当"用户名"为空时,struts后台程序将联合以上两处定义显示错误信息。
另外,上面的"visitcust.error.name.required"是在validation.xml配置验证内容时指定的。<span style="color: #155067;">具体见以下介绍</span>。
注意:一般情况下,你的系统只需要一个applicationresources文件,所以开发组的成员不要添加自己的resource文件。只有在你的项目分组开发时才需要使用多个applicationresources文件,但是,同时你的struts-config.xml文件也会有相同的数量对应。
<h3><span>2、</span> <span>在struts-config.xml文件中加入validator插件:</span></h3>加入这个插件后你的应用就具备使用validator的环境,如:
<!-- ========== plug ins configuration ================================== --><br><plug-in classname="org.apache.struts.validator.validatorplugin"><br><set-property value="/web-inf/validator-rules.xml,/web-inf/validation.xml" property="pathnames" />
</plug-in>
这里如果是想使用多个***.xml文件的话,value部分写法如下value="/web-inf/validator-rules.xml,/web-inf/validation.xml, /web-inf/validation1.xml , /web-inf/validation2.xml "
在<action-mappings>里,定义需要验证的画面对应的action的时候要加上validate="true"
<h2>四种使用方法</h2><h3><span>1、</span> <span>用javascript在客户端进行验证 </span></h3>配置:在需要验证的jsp文件中写入
<html:form action="/xxx" onsubmit="return validatexxxx(this);"><br>
这里的xxx 是与要进行验证的 forward name,validatexxxx (this);里面的xxxx是需要进行验证的actionform名。
<html:javascript formname="mytestform"/><br>
在validation.xml文件中写入验证代码就可以进行基本的验证了。这种方法是在客户端进行验证,客户端可以看到javascript部分的全代码。安全性不高
<h3><span>2、</span> <span>validatorform的validate方法</span></h3>1、validate()方法:使自己的actionform继承validatorform类,在里面编写自己的方法:
public actionerrors validate (actionmapping mapping,httpservletrequest request) {
actionerrors errors = new actionerrors();<br>
。。。。。。
if ( mytext.equals("aaa") ) {
//my exampleerrors.add("mytext",new actionerror("mytext.error"));
}
。。。。。。
return errors;<br>
}
此时,如果写了这个方法,就会屏蔽掉在validation.xml中定义的验证部分,换句话说就是系统运行时,validation.xml里对应此actionform的定义的错误验证部分不实行,如果不写这个方法的话,系统运行时会进行validation.xml里对应此actionform的定义的错误验证部分的操作。此类方法是在服务器端进行验证,验证部分代码客户端不可见。
2、创建你的actionform并让它继承org.apache.struts.validator.validatorform类。创建你的action实现,并和上面定义的actionform关联。这里需要注意的是,在定义此action时一定将validate属性设置为true,并且在你定义的actionform中不要实现它的validate方法――这就意味着你将使用validatorform的validate方法,这样才能保证你的错误验证正常进行。配置validation.xml文件。基本内容如下:
<form-validation>
<!-- ========== default language form definitions ===================== -->
<formset>
<form name="custgnewform">需要验证页面上form的名字
<field property="certificode"需要校验的属性
depends="required,maxlength">校验内容
<arg0 key="prompt.certificode"/><a><span style="color: #155067;">applicationresource</span></a>文件中对应
<arg1 key="${var:maxlength}" name="maxlength" resouce="false"/>
<var>确定最长限制的长度
<var-name>maxlength</var-name>
<var-value>20</var-value>
</var>
</field>
注意:此处的arg0和arg1就代表了applicationresources文件中使用"{}"括起来的参数。比如:<br>errors.range={0} is not in the range {1} through {2}.<br>定义了三个参数,所以你这里也要定义<arg0>、<arg1>、<arg2>三个参数才能完整的显示错误信息。<br>errors.maxlength={0} cannot be greater than {2} characters.<br>定义了0、2两个参数,所以你就需要定义<arg0>和<arg2>两个参数。
<field property="username"
depends="required,maxlength">
<arg0 key="prompt.username"/>
<arg2 key="${var:maxlength}" name="maxlength" resouce="false"/>
<var>
<var-name>maxlength</var-name>
<var-value>80</var-value>
</var>
</field>
<field property="email"
depends="email">
<arg0 key="prompt.email"/>
</field>
</form>
<form name="custgnewcheckform">
<field property="certificode"
depends="required">
<arg0 key="prompt.certificode"/>
</field>
</form>
</formset>
</form-validation>
在校验页面的<body>前添加如下内容:<html:errors/>
<h3><span>3、</span> <span>dynavalidatorform</span></h3>不需要再写对应的actionform,只需在struts-config.xml里把自己的actionform进行配置:
<form-bean name="testform" type="org.apache.struts.validator. dynavalidatorform">
<form-property name="mytext" type="java.lang.string"/>
<form-property name="mytextarea" type="java.lang.string"/>
<form-property name="mydatetext" type="java.lang.string"/>
</form-bean>
在form-property里设置相应的项目,比如说mytext,mytextarea什么的,执行的时候会动态生成actionform,再在validation.xml里写入所希望的验证代码,就可以了。jsp文件里不需要写入任何东西,验证也是在服务器端进行,验证部分代码在jsp中不可见。
<h3><span>4、</span> <span>组合验证</span></h3>如果使用动态验证dynavalidatorform的话,不许编写自己的对应的actionform,相应的特殊验证会受到相当程度的限制。这个时候,需要将特殊验证部分写入对应的action,
if(mytext.equals("aaa")){//my example
actionerrors errors = new actionerrors();
errors.add("***",new actionerror("***.error"));
saveerrors(request,errors);<br>
return (mapping.findforward("false"));
}
就可以实现特殊验证了。
实际上你的form还可以继承validatoractionform和dynavalidatoractionform,这两种与他们对应的validatorform和dynavalidatorform的唯一区别正如开篇就讲到的:在struts-config.xml中查找对应的form类时,前者根据action的path值,而后者使用name值。
<h1>范例:</h1>struts <span>验证器:验证两个字段匹配<br></span><span>在使用指南中,有一节讲述怎样创建验证器来验证两个字段匹配,我用这个服务器端验证器(象例子中显示的那样)做口令,确定口令验证。这个已经可以正常工作了;但我还想用客户端的</span>javascript<span>验证器来试一试。我写了自己的程序来比较两个字段,但他们和推荐给你的那个不同(</span>from validator-rules.xml)。所以昨天,我补充了怎样添加javascript<span>方法到</span>validator-rules.xml。 <span>这里就是怎样配置的的整个过程(大部分在使用指南中已经包含了,保存</span>javascript<span>)。<br></span><span>怎样添加两个字段的验证器<br></span>
step 1: 生成一个包含<span>validatetwofields</span>方法的类。在我的代码重,我的类定义为<span>validationutil</span>,他有下列方法:
public static boolean validatetwofields(
object bean,
validatoraction va,
field field,
actionerrors errors,
httpservletrequest request) {
string value = validatorutil.getvalueasstring(bean, field.getproperty());
string sproperty2 = field.getvarvalue("secondproperty");
string value2 = validatorutil.getvalueasstring(bean, sproperty2);
if (!genericvalidator.isblankornull(value)) {
try {
if (!value.equals(value2)) {
errors.add(field.getkey(),
resources.getactionerror(request, va, field));
return false;
}
} catch (exception e) {
errors.add(field.getkey(),
resources.getactionerror(request, va, field));
return false;
}
}
return true;
}
step 2: 编辑 <span>validator-rules.xml</span> ,加入"twofields" 规则。
<validator name="twofields" classname="org.appfuse.webapp.util.validationutil"
method="validatetwofields"
methodparams="java.lang.object,
org.apache.commons.validator.validatoraction,
org.apache.commons.validator.field,
org.apache.struts.action.actionerrors,
javax.servlet.http.httpservletrequest"
depends="required" msg="errors.twofields">
<javascript><![cdata[
function validatetwofields(form) {
var bvalid = true;
var focusfield = null;
var i = 0;
var fields = new array();
otwofields = new twofields();
for (x in otwofields) {
var field = form[otwofields[x][0]];
var secondfield = form[otwofields[x][2]("secondproperty")];
if (field.type == 'text' ||
field.type == 'textarea' ||
field.type == 'select-one' ||
field.type == 'radio' ||
field.type == 'password') {
var value;
var secondvalue;
// get field's value
if (field.type == "select-one") {
var si = field.selectedindex;
value = field.options[si].value;
secondvalue = secondfield.options[si].value;
} else {
value = field.value;
secondvalue = secondfield.value;
}
if (value != secondvalue) {
if (i == 0) {
focusfield = field;
}
fields[i++] = otwofields[x][1];
bvalid = false;
}
}
}
if (fields.length > 0) {
focusfield.focus();
alert(fields.join('\n'));
}
return bvalid;
}]]></javascript>
</validator>
step 3: 在<span>validation.xml</span>中为你的表单配置验证:
<field property="password" depends="required,twofields">
<msg name="required" key="errors.required"/>
<msg name="twofields" key="errors.twofields"/>
<arg0 key="userform.password"/>
<arg1 key="userform.confirmpassword"/>
<var>
<var-name>secondproperty</var-name>
<var-value>confirmpassword</var-value>
</var>
</field>
这里errors.twofields的字段 '{0}'必须与字段'{1}' 的值相同。第三步的一个可选的工作就时使用 <span style="color: #023264;">xdoclet</span> 来生成<span>validation.xml</span>。requires (1) 配置xdoclet (当然)和(2) 在你的表单中添加添加一些<span>@struts</span> 标签<span>setpassword</span>方法。
/**
* returns the password.
* @return string
*
* @struts.validator type="required" msgkey="errors.required"
* @struts.validator type="twofields" msgkey="errors.twofields"
* @struts.validator-args arg1resource="userform.password"
* @struts.validator-args arg1resource="userform.confirmpassword"
* @struts.validator-var name="secondproperty" value="confirmpassword"
*/
public string setpassword() {
return password;
}
<div><h5><img src="http://blog.blogchina.com/template/common/img/array.gif" alt=""><span style="color: #155067;">struts提供的和form相关的标签</span> </h5><div style="display: block;">一些struts的表单标签总结。<br><span> <span style="color: #a52a2a;">与form相关的标签包括<form>标签本身以及所有必须包含在其中的标签。比如,<text>和<password>标签就是和form相关的标签,因为如果不把它们放到一个form中它们就没有意义。</span>
<br><span style="color: #a52a2a;"><form>标签<br><form>标签用于生成一个html form。使用该标签时必须遵循许多规则。</span>
<br><span style="color: #a52a2a;">首先,<form>标签中必须包含一个action属性,它是这个标签中唯一必需的属性。如果不具备该属性则jsp页面会抛出一个异常。之后你必须给这个action属性指定一个有效值。一个有效值是指应用程序的struts配置文件中<action-mappings>元素里的任何一个<action>子元素的访问路径。而且相应的<action>元素中必须有一个name属性,它的值是form bean的名称。</span>
<br><span style="color: #a52a2a;">例如,如果你有这样一个<form>标签: <html:form action="/login" > </span>
<br><span style="color: #a52a2a;">那么你的struts配置文件的<action-mappings>元素中必须有一个如下显示为粗体的<action>元素: <br> <action-mappings> <br> <action path="/login" <br> type="com.javapro.struts.loginaction" <br> name="loginform"<br> scope="request"<br> input="/login.jsp"><br> <forward name="success" path="/mainmenu.jsp"/><br> </action><br> .<br> .<br> .<br> </action-mappings><br>这就是说一个form标签是和form bean相关联的。</span>
<br><span style="color: #a52a2a;">另一个要遵循的规则是:任何包含在<form>中用来接收用户输入的标签(<text>、<password>、<hidden>、<textarea>、<radio>、<checkbox>、<select>)必须在相关的form bean中有一个指定的属性值。比如,如果你有一个属性值被指定为"username"的<text>标签,那么相关的form bean中也必须有一个名为"username"的属性。输入<text>标签中的值会被用于生成form bean的username属性。</span>
<br><span style="color: #a52a2a;">除了上面所讲的属性之外,<form>标签还有一些不是必须但加上更好的"次要"的属性。比如,你可以用focus属性来生成javascript,它会"定焦"(focus)到该form所包含的一个元素上。使用focus属性时你需要给它指定元素的名称。比如,以下代码是定焦在第二个text元素上的: <body><br><html:form action="/login" focus="password"><br>user name: <html:text property="username"/><br><br>password: <html:text property="password"/><br><br><html:submit/><br></html:form><br></body><br>该段代码会被转换成: <br><body><br><form name="loginform" method="post" <br> action="/mystrutsapp6/login.do"><br>user name: <input type="text" name="username" <br> value=""><br><br>password: <input type="text" <br> name="password" value=""><br><br><input type="submit" <br> value="submit"><br></form><br><script language="javascript" <br> type="text/javascript"><br> <!--<br> if (document.forms["loginform"].elements[<br> "password"].type != "hidden") <br> document.forms["loginform"].elements[<br> "password"].focus()<br> // --><br></script></span>
<br><span style="color: #a52a2a;"></body><br>注意,<form>标签中method属性的缺省值是post。另外,有没有看到这个标签库是如何建立javascript来定焦到password元素上的? 这也是该库让人着迷的地方之一。你不用担心如何在客户端进行编程,它会帮你自动生成。</span>
<br><span style="color: #a52a2a;">在运行前面的例子时还要注意,你必须有一个包含username和password属性的相关form。你可以参考本文第三部分中的login程序。</span>
<br><span style="color: #a52a2a;"><text>标签<br><text>标签用于生成一个文本的输入区域。它必须包含和相关form bean中的相同属性对应的"property"属性。该标签只有在嵌入到一个<form>标签中时才有效。<br>例如: <html:text property="username"/><br>会被转换成: <input type="text" name="username" value=""></span>
<br><span style="color: #a52a2a;"><password>标签<br><password>标签用于生成一个口令字(type password)的输入区域。它必须包含和相关form bean中的相同属性对应的"property"属性。该标签只有在嵌入到一个<form>标签中时才有效。该标签中的一个很重要的属性是"redisplay",它用于重新显示以前输入到这个区域中的值。该属性的缺省值为true。然而,为了使password不能被重新显示,你或许希望将该属性的值设为false。<br>例如: <html:password property="password" redisplay="false"/><br>会被转换成: <input type="password" name="password" value=""></span>
<br><span style="color: #a52a2a;"><hidden>标签<br><hidden>标签用于生成一个隐藏文本的输入区域。它必须包含和相关form bean中的相同属性对应的"property"属性。该标签只有在嵌入到一个<form>标签中时才有效:<br>例如: <html:hidden property="username"/><br>会被转换成: <input type="hidden" name="username" value=""></span>
<br><span style="color: #a52a2a;"><textarea>标签<br><textarea>标签用于生成一个文本区元素(text area element)。它必须包含和相关form bean中的相同属性对应的"property"属性。</span>
<br><span style="color: #a52a2a;">比如:<br><html:textarea property="details" cols="80" rows="20" value="enter details here"/><br>会被转换成: <br><textarea name="details" cols="80" rows="20">enter details here</textarea></span>
<br><span style="color: #a52a2a;"><radio>标签<br><radio>标签用于显示一个单选按钮(radio button)。它必须包含"value"属性。比如这段代码: <html:radio property="title" value="1"/>mr.<br><html:radio property="title" value="2"/>ms.<br><html:radio property="title" value="3"/>dr.<br>会被转换成这样的html: <br><input type="radio" name="title" value="1">mr.<br><input type="radio" name="title" value="2">ms.<br><input type="radio" name="title" value="3">dr.</span>
<br><span style="color: #a52a2a;"><checkbox>标签<br><checkbox>标签用于显示checkbox类型的输入区域。比如: <br><html:checkbox property="notify"/>please send me notification<br>会被转换成: <br><input type="checkbox" name="notify" value="on">please send me notification</span>
<br><span style="color: #a52a2a;"><submit>标签<br><submit>标签用于生成提交类型(type submit)的输入区域。<br>比如: <html:submit value="login"/><br>会被转换成: <input type="submit" value="login"><br> </span>
<br><br><span style="color: #a52a2a;"><reset>标签<br><reset>标签用于生成重置类型(type reset)的输入区域。比如: <br><html:reset/><br>会被转换成: <input type="reset" value="reset"></span>
<br><span style="color: #a52a2a;"><option>标签<br><option>标签用于显示select box中的一个选项。参照下面的<select>标签。</span>
<br><span style="color: #a52a2a;"><select>标签 <br><select>标签用于显示一个包含零个或更多选项的html选择元素。它必须被嵌入一个<form>标签中才有效。下面这个例子将说明如何使用该标签: <html:select property="color" size="3"><br> <html:option value=<br> "r">red</html:option><br> <html:option value=<br> "g">green</html:option><br> <html:option value=<br> "b">blue</html:option><br></html:select></span>
<br><span style="color: #a52a2a;">会被转换成: <br><select name="color" size="3"><option <br> value="r">red</option><br> <option value="g">green</option><br> <option value="b">blue</option><br></select></span>
</span>
如果你配置好验证器插件,你应该扩展validatorform而不是actionform,以便它能加载你的validator资源。他根据struts-config.xml文件中的action的name属性为当前form的调用相应的验证器,因此在validator-rules.xml中的form元素的名称属性应该与action的name属性值相匹配。
另外一种选择是扩展validatoractionform 而不是validatorform,validatoractionform使用struts-config.xml中action的path属性,所以path属性的值相应的应该与validator-rules.xml中的form的name属性匹配。
一个分离的action可以定义给多页form的每个页面,而且验证规则可以与action关联而不是与页码,就像验证范例中的多页form范例那样。
<h2>国际化</h2>在validator-rules.xml 文件中form的验证规则可以组织为formset。formset 有与java.util.locale 类相应的属性:如语言, 国家以及变量型属性,如果他们未定义,formset 将把它设置为默认值。一个formset 也可以有关联的常量。另外还可以定义与formset 同一级别的全局global元素,他与formset同样也有常量。
注意:你必须在国际化的formset前声明一个没有国际化的默认formset。这样如果validator没有找到locale时可以有一个默认版本。
可插入验证器的默认错误信息值可以被msg元素覆盖。所以为mask验证器生成错误信息的替代方法就是使用msg属性,如果字段的name属性与验证器的name属性匹配,那末将使用字段的msg属性。
error messages的可以设置arg0-arg3 等参数元素。如果没有设置arg0-arg3的name属性, error messages将使用他们作为默认的构建参数值。如果设置了name属性,你就可以把参数指定给一特定的可插入验证器,然后这些参数将在构造错误信息时被使用。
<field
property="lastname"
depends="required,mask">
<msg
name="mask"
key="registrationform.lastname.maskmsg"/>
<arg0 key="registrationform.lastname.displayname"/>
<var>
<var-name>mask</var-name>
<var-value>^[a-za-z]*$</var-value>
</var>
</field>
默认的arg0-arg3元素将在消息资源中查找相应的key,如果资源属性设为false,她将把值直接传进去,而不从消息资源中查找。注意1.1版本中,你必须为每个模块中明确地定义在验证中用到的消息资源,否则将使用top-level资源。
<field
property="integer"
depends="required,integer,intrange">
<arg0 key="typeform.integer.displayname"/>
<arg1
name="range"
key="${var:min}"
resource="false"/>
<arg2
name="range"
key="${var:max}"
resource="false"/>
<var>
<var-name>min</var-name>
<var-value>10</var-value>
</var>
<var>
<var-name>max</var-name>
<var-value>20</var-value>
</var>
</field>
<h2>常量<span>/</span>变量</h2>全局的常量可以在全局标签中定义,formset/本地常量能在formset 标签中创建。常量当前仅仅是代替字段的property属性,字段的var 元素的 value属性,字段的msg 元素的 key属性,字段的arg0-arg3 元素的 key属性。字段的变量也可以在arg0-arg3 元素中被代替(例如:${var:min}))。替换的顺序是formset/locale常量第一,全局的常量第二,
arg elements 变量最后。
<global>
<constant>
<constant-name>zip</constant-name>
<constant-value>^\d{5}(-\d{4})?$</constant-value>
</constant>
</global>
<field
property="zip"
depends="required,mask">
<arg0 key="registrationform.zippostal.displayname"/>
<var>
<var-name>mask</var-name>
<var-value>${zip}</var-value>
</var>
</field>
验证器可以使用字段下面的变量部分来存储变量,这些变量通过字段的getvar((string key)方法取得。
<field
property="integer"
depends="required,integer,intrange">
<arg0 key="typeform.integer.displayname"/>
<arg1
name="range"
key="${var:min}" resource="false"/>
<arg2
name="range"
key="${var:max}" resource="false"/>
<var>
<var-name>min</var-name>
<var-value>10</var-value>
</var>
<var>
<var-name>max</var-name>
<var-value>20</var-value>
</var>
</field>
<h2>使用<span>validwhen</span>设计复杂的验证</h2>使用validwhen来设计复杂验证的一个经常的要求就是根据一个字段验证另外一个字段(比如, 如果你要用户两次输入口令来确认值口令一致),另外一个就是表单中的一个字段只有另外一个字段有确定值的时候才是必须输入的。新的validwhen验证规则将很快被包含在1.1后的struts版本中,她就是用来处理这种情况的。
validwhen 规则处理单个的变量字段,叫测试。这变量的值是一个布尔的表达式,如果验证有效则它必须为真。可以包含这种变量的表达式有:
u 单引号或双引号字符串literals,
u 十进制、十六进制、八进制的integer literals,
u null与null和空字符串匹配,
u 其它可以用属性名引用的form字段,例如customerage,
u 可以在外部因用得索引字段, 例如childlastname[2],
u 可以默认implicit因用得索引字段, 例如childlastname[], 她将作为被索引的字段使用同样的索引到数组中,
the literal *这里指它包含当前测试字段的值,
作为例子,考虑一个包含通讯地址和邮箱字段的form。如果通讯地址不为空则邮箱字段是必须的required。你能这样定义validwhen 规则:
<field property="emailaddress" depends="validwhen">
<arg0 key="userinfo.emailaddress.label"/>
<var>
<var-name>test</var-name>
<var-value>((sendnewsletter == null) or (*this* != null))</var-value>
</var>
</field>
上面定义的意思是:如果通讯地址是空或不空时这个字段时有效的。
这里有个稍微复杂的例子,它使用了索引字段。假定有一个表单,允许用户输入他们希望定购的部件号和数量。类orderline 的bean的一数组被用来在称为orderlines 的一属性保持输入项。
if you wished to verify that every line with part number also had a quantity entered, you could do it with:
如果你希望校验订单中有数量输入得每一行,你可以这样:
<field
property="quantity"
indexedlistproperty="orderlines"
depends="validwhen">
<arg0 key="orderform.quantity.label"/>
<var>
<var-name>test</var-name>
<var-value>((orderlines[].partnumber == null) or (*this* != null))</var-value>
</var>
</field>
这里的意思是:如果相应的partnumber 字段是空, 或这字段是不空的,则这字段是有效的。
最后一个例子,想象一表单,用户必须输入他们的以英寸为单位的高度,如果他们在高度在60英寸以下,则出一错误。(it is an error to have checked off nbapointguard as a career.)
<field property="nbapointguard" depends="validwhen">
<arg0 key="careers.nbapointguard.label"/>
<var>
<var-name>test</var-name>
<var-value>((heightininches >= 60) or (*this* == null))</var-value>
</var>
</field>
给程序员的简单说明:
所有的比较关系必须在parens 封装。all comparisons must be enclosed in parens.
只有两个itme时可以and或or链接。
如果比较的两item都可以转为整数,则使用numeric比较,否则使用字符串比较。
<h2>可插入验证器</h2>验证是从validation.xml 文件中加载的,默认的验证规则定义在validation.xml 文件中,默认定义了required, mask ,byte, short, int, long, float, double, date (没有本地支持), and a numeric range。
" mask "方式依赖于默认值安装要求,那意味着"required "可以完成,在"'mask "将运行以前"required "和" mask "方式被默认包含进框架中了。任何字段如果不是"required "而且是空或有零长度将跳过其他验证。
如果使用了javascript 标签,客户端javascript在validator's javascript 属性中查找值而且产生一个有验证form方法的对象,要得到更多的关于javascript validator 标签工作细节的详细的解释,参阅html标签api参考。
"'mask' "方式让你用一正则表达式掩码验证字段,它使用jakarta的正规表达式包,所有的有效性规则存储在validator-rules.xml 文件,使用的主类是org.apache.regexp.re。
validation.xml文件中的验证器配置范例:
<validator name="required"
classname="org.apache.struts.validator.fieldchecks"
method="validaterequired"
methodparams="java.lang.object,
org.apache.commons.validator.validatoraction,
org.apache.commons.validator.field,
org.apache.struts.action.actionerrors,
javax.servlet.http.httpservletrequest"
msg="errors.required">
<validator name="mask"
classname="org.apache.struts.validator.fieldchecks"
method="validatemask"
methodparams="java.lang.object,
org.apache.commons.validator.validatoraction,
org.apache.commons.validator.field,
org.apache.struts.action.actionerrors,
javax.servlet.http.httpservletrequest"
msg="errors.invalid">
<h3><span>定义可插入验证器</span></h3>方法的参数是用逗号分隔的一些类名称列表,方法属性需要有一个符合上面的列表的签名。列表由以下组合而成:
java.lang.object - 要验证的bean。
org.apache.commons.validator.validatoraction - 当前validatoraction。
org.apache.commons.validator.field - 要验证的字段
org.apache.struts.action.actionerrors - 如果验证错误将加入actionerror的错误对象javax.servlet.http.httpservletrequest -当前request 对象。
javax.servlet.servletcontext - 应用的servletcontext。
org.apache.commons.validator.validator-当前的org.apache.commons.validator.validator实例。
java.util.locale - 当前用户的locale。
<h3><span>多页面form</span></h3>字段部分有一可选的页面属性,它可以被设为整数,页上字段的所有验证小于或等于服务器端验证的当前页,页上字段的所有验证小于或等于客户端页上所有字段的验证小于或等于服务器端验证的当前页验证的当前页。一个mutli-part表单需要定义页面属性:
<html:hidden property="page" value="1"/>。
<h3><span>比较两个字段</span></h3>这是一个展示你怎样才能比较两个字段是否有一样的值的例子。比如"用户改变他们的口令"一般会有口令字段和一确认字段。
<validator name="twofields"
classname="com.mysite.strutsvalidator"
method="validatetwofields"
msg="errors.twofields"/>
<field property="password" depends="required,twofields">
<arg0 key="typeform.password.displayname"/>
<var>
<var-name>secondproperty</var-name>
<var-value>password2</var-value>
</var>
</field>
public static boolean validatetwofields(
object bean, validatoraction va,
field field, actionerrors errors, httpservletrequest request,
servletcontext application) {
string value = validatorutils.getvalueasstring( bean, field.getproperty());
string sproperty2 = field.getvarvalue("secondproperty");
string value2 = validatorutils.getvalueasstring( bean, sproperty2);
if (!genericvalidator.isblankornull(value)) {
try {
if (!value.equals(value2)) {
errors.add(field.getkey(),
resources.getactionerror( application, request, va, field));
return false;
}
} catch (exception e) {
errors.add(field.getkey(), resources.getactionerror( application, request, va, field));
return false;
}
}
}
<h2>已知的<span>bug</span></h2>struts validator依赖于commons validator包,所以问题报告和增强需求可能在两个产品中列出。
· <span style="color: #023264;">struts validator bugzilla reports </span>
· <span style="color: #023264;">commons validator bugzilla reports</span>
<h2>变更和<span>deprecations </span></h2>新建的标记属性。<br>
<html:javascript>标记有新的属性定义.
使用commons-validator.jar中的dtd验证。<br>
当前使用的验证xml文件是根据commons-validator.jar中的dtd。struts不在为validator-rules.xml and validator.xml.单独维护一个分离的dtd,另外,commons-validator 现在维护一个统一的validator.dtd。修改所有validator.xml文件的dtd引用为
<!doctype form-validation public
"-//apache software foundation//dtd commons validator rules configuration 1.0//en"
"http://jakarta.apache.org/commons/dtds/validator_1_0.dtd">
空字段。<br>
当前默认在所有得基础验证类型中忽略空白的字段,如果你要求一个字段必须输入,那末在你的应用的validator.xml 文件相应的字段定义的depends属性中添加 " required "。
新建的范围range方法.<br>
javascript 和java中都添加了intrange & floatrange 方法。
有条件地required字段.<br>
最大的修改是添加了基于其她字段的值的有条件地require验证的能力。它允许你定义逻辑如:"只有x字段非空的时候y字段为'male'才有效",这是实现上述逻辑的推荐方法,这种方法在1.1版后的第一版将实现。在1.1版中添加的requiredif验证规则,将在新版中去掉。不过,如果你正准备使用requiredif,这里有一个简短的教程。
让我们假定你有一个有3个字段的医药的信息表单,性别sex,怀孕测试pregnancytest,测试结果testresult,如果性别为'f' or 'f',则怀孕测试pregnancytest是required,如果pregnancytest不是空,测试结果testresult是required。
你的validation.xml 文件的输入项应该是这样的:
<form name="medicalstatusform">
<field property="pregnancytest" depends="requiredif">
<arg0 key="medicalstatusform.pregnancytest.label"/>
<var>
<var-name>field[0]</var-name>
<var-value>sex</var-value>
</var>
<var>
<var-name>fieldtest[0]</var-name>
<var-value>equal</var-value>
</var>
<var>
<var-name>fieldvalue[0]</var-name>
<var-value>f</var-value>
</var>
<var>
<var-name>field[1]</var-name>
<var-value>sex</var-value>
</var>
<var>
<var-name>fieldtest[1]</var-name>
<var-value>equal</var-value>
</var>
<var>
<var-name>fieldvalue[1]</var-name>
<var-value>f</var-value>
</var>
<var>
<var-name>fieldjoin</var-name>
<var-value>or</var-value>
</var>
</field>
<field property="testresult" depends="requiredif">
<arg0 key="medicalstatusform.testresult.label"/>
<var>
<var-name>field[0]</var-name>
<var-value>pregnancytest</var-value>
</var>
<var>
<var-name>fieldtest[0]</var-name>
<var-value>notnull</var-value>
</var>
</field>
</form>
这里有一个使用索引的属性更复杂的例子,如果你的struts-config.xml 有这下面:
<form-bean name="dependentlistform"
type="org.apache.struts.webapp.validator.forms.validatorform">
<form-property
name="dependents"
type="org.apache.struts.webapp.validator.dependent[]" size="10"/>
<form-property name="insuredependents" type="java.lang.boolean" initial="false"/>
</form-bean>
这里dependentlistform bean有lastname,firstname,dob,coveragetype四个属性,你可以这样定义一验证规则:
<form name="dependentlistform">
<field
property="firstname" indexedlistproperty="dependents" depends="requiredif">
<arg0 key="dependentlistform.firstname.label"/>
<var>
<var-name>field[0]</var-name>
<var-value>lastname</var-value>
</var>
<var>
<var-name>fieldindexed[0]</var-name>
<var-value>true</var-value>
</var>
<var>
<var-name>fieldtest[0]</var-name>
<var-value>notnull</var-value>
</var>
</field>
<field
property="dob" indexedlistproperty="dependents" depends="requiredif,date">
<arg0 key="dependentlistform.dob.label"/>
<var>
<var-name>field[0]</var-name>
<var-value>lastname</var-value>
</var>
<var>
<var-name>fieldindexed[0]</var-name>
<var-value>true</var-value>
</var>
<var>
<var-name>fieldtest[0]</var-name>
<var-value>notnull</var-value>
</var>
</field>
<field
property="coveragetype" indexedlistproperty="dependents" depends="requiredif">
<arg0 key="dependentlistform.coveragetype.label"/>
<var>
<var-name>field[0]</var-name>
<var-value>lastname</var-value>
</var>
<var>
<var-name>fieldindexed[0]</var-name>
<var-value>true</var-value>
</var>
<var>
<var-name>fieldtest[0]</var-name>
<var-value>notnull</var-value>
</var>
<var>
<var-name>field[1]</var-name>
<var-value>insuredependents</var-value>
</var>
<var>
<var-name>fieldtest[1]</var-name>
<var-value>equal</var-value>
</var>
<var>
<var-name>fieldvalue[1]</var-name>
<var-value>true</var-value>
</var>
<var>
<var-name>fieldjoin</var-name>
<var-value>and</var-value>
</var>
</field>
</form>
这里的意思是:
如果lastname 字段是非空的,firstname 字段required。因为字段indexed 为真,这它意味着lastname的indexed 必须与firstname 的索引的一样,dob同理,除非date不为空。
如果lastname 用样索引时的值不空, 而且非索引字段insuredependents为真,则coveragetype 是only require。
你可以对字段在[n]中使用任意数字,唯一的限制是他们必须都是and或or,你无法混合使用。
deprecation:<br>
u javascript 和java的range方法.
u strutsvalidator &strutsvalidatorutil 类中的deprecation方法
<h2>验证器<span>api</span>指南</h2>一个简明的<span style="color: #023264;">struts验证器api指南</span> 可以帮助你开始。
<h2>验证器资源</h2><span style="color: #023264;">struts validator: validating two fields match</span><span> 作者matt raible。(两个字段匹配验证)关于使用方法的文章。(范例部分为翻译此文内容)</span>
<span style="color: #023264;">dynaforms and the validator</span><span> 作者james turner and kevin bedell。</span><span style="color: #023264;">struts kickstart</span><span>的其中一章(动态form和验证器),可以自由下载pdf). </span>
<span style="color: #023264;">validating user input</span><span> 作者 david winterfeldt and ted husted。</span><span style="color: #023264;">struts in action</span><span>的其中一章,可以自由下载(pdf)。</span>
<br>
<h1>使用方法</h1>作者:
丑陋 && snowtears:经过2周的不懈努力,阅读了大量的资料,终于对validator有了个初步的认识,整理了一下,浅浅的谈了谈写法,希望能有一定的帮助,其中肯定有许多说的不对不准确的地方,还请多指教 <span style="color: #023264;">real_herozx@163.net</span>
王艺:
根据以上两位的文章正理而成
<h2>配置<span>ruts-config.xml</span>:</h2><h3><span>1、</span> <span>添加applicationresources配置文件。</span></h3>如:
<!-- ========== message resources definitions =========================== -->
<message-resources parameter="com.dc.sibss.om.struts.applicationresources" />
其中com.sibss.om.struts.applicationresources"的部分是资源文件的路径,此文件的作用是提供错误信息的非编程定制化和多语言支持。如果我们使用中文平台操作系统,则默认情况下将首先查找applicationresource_zh_cn.properties文件,然后是applicationresources_zh.properties,如果前两个文件没有被找到则将查找applicationresources.properties文件。
为了能够在页面上显示错误提示信息,我们还需要将以下内容添加到applicationresources.properties文件的末尾:
errors.required={0} is required.
errors.minlength={0} cannot be less than {1} characters.
errors.maxlength={0} cannot be greater than {2} characters.
errors.invalid={0} is invalid.
errors.byte={0} must be an byte.
errors.short={0} must be an short.
errors.integer={0} must be an integer.
errors.long={0} must be an long.
errors.float={0} must be an float.
errors.double={0} must be an double.
errors.date={0} is not a date.
errors.range={0} is not in the range {1} through {2}.
errors.creditcard={0} is not a valid credit card number.
errors.email={0} is an invalid e-mail address.
以上仅是struts现在支持的错误类型的错误提示信息,如果你自定义了新类型的错误验证,则还需要在此加上你自己的内容。
以上内容中的{0}指的是错误提交的参数。比如:当你需要页面上的"用户名"不能为空时(也就是上面的errors.required),这个{0}就代表"用户名",所以如果你没有填写用户名将抛出如下错误:
用户名 is required.(你可以根据需要修改称中文)
我们可能已经注意到了,既然错误提示信息需要配置,那么上例中"用户名"系统是如何得到的呢?没错!也是通过修改此配置文件,内容如下:
visitcust.error.name.required=<br>用户名
这样当"用户名"为空时,struts后台程序将联合以上两处定义显示错误信息。
另外,上面的"visitcust.error.name.required"是在validation.xml配置验证内容时指定的。<span style="color: #155067;">具体见以下介绍</span>。
注意:一般情况下,你的系统只需要一个applicationresources文件,所以开发组的成员不要添加自己的resource文件。只有在你的项目分组开发时才需要使用多个applicationresources文件,但是,同时你的struts-config.xml文件也会有相同的数量对应。
<h3><span>2、</span> <span>在struts-config.xml文件中加入validator插件:</span></h3>加入这个插件后你的应用就具备使用validator的环境,如:
<!-- ========== plug ins configuration ================================== --><br><plug-in classname="org.apache.struts.validator.validatorplugin"><br><set-property value="/web-inf/validator-rules.xml,/web-inf/validation.xml" property="pathnames" />
</plug-in>
这里如果是想使用多个***.xml文件的话,value部分写法如下value="/web-inf/validator-rules.xml,/web-inf/validation.xml, /web-inf/validation1.xml , /web-inf/validation2.xml "
在<action-mappings>里,定义需要验证的画面对应的action的时候要加上validate="true"
<h2>四种使用方法</h2><h3><span>1、</span> <span>用javascript在客户端进行验证 </span></h3>配置:在需要验证的jsp文件中写入
<html:form action="/xxx" onsubmit="return validatexxxx(this);"><br>
这里的xxx 是与要进行验证的 forward name,validatexxxx (this);里面的xxxx是需要进行验证的actionform名。
<html:javascript formname="mytestform"/><br>
在validation.xml文件中写入验证代码就可以进行基本的验证了。这种方法是在客户端进行验证,客户端可以看到javascript部分的全代码。安全性不高
<h3><span>2、</span> <span>validatorform的validate方法</span></h3>1、validate()方法:使自己的actionform继承validatorform类,在里面编写自己的方法:
public actionerrors validate (actionmapping mapping,httpservletrequest request) {
actionerrors errors = new actionerrors();<br>
。。。。。。
if ( mytext.equals("aaa") ) {
//my exampleerrors.add("mytext",new actionerror("mytext.error"));
}
。。。。。。
return errors;<br>
}
此时,如果写了这个方法,就会屏蔽掉在validation.xml中定义的验证部分,换句话说就是系统运行时,validation.xml里对应此actionform的定义的错误验证部分不实行,如果不写这个方法的话,系统运行时会进行validation.xml里对应此actionform的定义的错误验证部分的操作。此类方法是在服务器端进行验证,验证部分代码客户端不可见。
2、创建你的actionform并让它继承org.apache.struts.validator.validatorform类。创建你的action实现,并和上面定义的actionform关联。这里需要注意的是,在定义此action时一定将validate属性设置为true,并且在你定义的actionform中不要实现它的validate方法――这就意味着你将使用validatorform的validate方法,这样才能保证你的错误验证正常进行。配置validation.xml文件。基本内容如下:
<form-validation>
<!-- ========== default language form definitions ===================== -->
<formset>
<form name="custgnewform">需要验证页面上form的名字
<field property="certificode"需要校验的属性
depends="required,maxlength">校验内容
<arg0 key="prompt.certificode"/><a><span style="color: #155067;">applicationresource</span></a>文件中对应
<arg1 key="${var:maxlength}" name="maxlength" resouce="false"/>
<var>确定最长限制的长度
<var-name>maxlength</var-name>
<var-value>20</var-value>
</var>
</field>
注意:此处的arg0和arg1就代表了applicationresources文件中使用"{}"括起来的参数。比如:<br>errors.range={0} is not in the range {1} through {2}.<br>定义了三个参数,所以你这里也要定义<arg0>、<arg1>、<arg2>三个参数才能完整的显示错误信息。<br>errors.maxlength={0} cannot be greater than {2} characters.<br>定义了0、2两个参数,所以你就需要定义<arg0>和<arg2>两个参数。
<field property="username"
depends="required,maxlength">
<arg0 key="prompt.username"/>
<arg2 key="${var:maxlength}" name="maxlength" resouce="false"/>
<var>
<var-name>maxlength</var-name>
<var-value>80</var-value>
</var>
</field>
<field property="email"
depends="email">
<arg0 key="prompt.email"/>
</field>
</form>
<form name="custgnewcheckform">
<field property="certificode"
depends="required">
<arg0 key="prompt.certificode"/>
</field>
</form>
</formset>
</form-validation>
在校验页面的<body>前添加如下内容:<html:errors/>
<h3><span>3、</span> <span>dynavalidatorform</span></h3>不需要再写对应的actionform,只需在struts-config.xml里把自己的actionform进行配置:
<form-bean name="testform" type="org.apache.struts.validator. dynavalidatorform">
<form-property name="mytext" type="java.lang.string"/>
<form-property name="mytextarea" type="java.lang.string"/>
<form-property name="mydatetext" type="java.lang.string"/>
</form-bean>
在form-property里设置相应的项目,比如说mytext,mytextarea什么的,执行的时候会动态生成actionform,再在validation.xml里写入所希望的验证代码,就可以了。jsp文件里不需要写入任何东西,验证也是在服务器端进行,验证部分代码在jsp中不可见。
<h3><span>4、</span> <span>组合验证</span></h3>如果使用动态验证dynavalidatorform的话,不许编写自己的对应的actionform,相应的特殊验证会受到相当程度的限制。这个时候,需要将特殊验证部分写入对应的action,
if(mytext.equals("aaa")){//my example
actionerrors errors = new actionerrors();
errors.add("***",new actionerror("***.error"));
saveerrors(request,errors);<br>
return (mapping.findforward("false"));
}
就可以实现特殊验证了。
实际上你的form还可以继承validatoractionform和dynavalidatoractionform,这两种与他们对应的validatorform和dynavalidatorform的唯一区别正如开篇就讲到的:在struts-config.xml中查找对应的form类时,前者根据action的path值,而后者使用name值。
<h1>范例:</h1>struts <span>验证器:验证两个字段匹配<br></span><span>在使用指南中,有一节讲述怎样创建验证器来验证两个字段匹配,我用这个服务器端验证器(象例子中显示的那样)做口令,确定口令验证。这个已经可以正常工作了;但我还想用客户端的</span>javascript<span>验证器来试一试。我写了自己的程序来比较两个字段,但他们和推荐给你的那个不同(</span>from validator-rules.xml)。所以昨天,我补充了怎样添加javascript<span>方法到</span>validator-rules.xml。 <span>这里就是怎样配置的的整个过程(大部分在使用指南中已经包含了,保存</span>javascript<span>)。<br></span><span>怎样添加两个字段的验证器<br></span>
step 1: 生成一个包含<span>validatetwofields</span>方法的类。在我的代码重,我的类定义为<span>validationutil</span>,他有下列方法:
public static boolean validatetwofields(
object bean,
validatoraction va,
field field,
actionerrors errors,
httpservletrequest request) {
string value = validatorutil.getvalueasstring(bean, field.getproperty());
string sproperty2 = field.getvarvalue("secondproperty");
string value2 = validatorutil.getvalueasstring(bean, sproperty2);
if (!genericvalidator.isblankornull(value)) {
try {
if (!value.equals(value2)) {
errors.add(field.getkey(),
resources.getactionerror(request, va, field));
return false;
}
} catch (exception e) {
errors.add(field.getkey(),
resources.getactionerror(request, va, field));
return false;
}
}
return true;
}
step 2: 编辑 <span>validator-rules.xml</span> ,加入"twofields" 规则。
<validator name="twofields" classname="org.appfuse.webapp.util.validationutil"
method="validatetwofields"
methodparams="java.lang.object,
org.apache.commons.validator.validatoraction,
org.apache.commons.validator.field,
org.apache.struts.action.actionerrors,
javax.servlet.http.httpservletrequest"
depends="required" msg="errors.twofields">
<javascript><![cdata[
function validatetwofields(form) {
var bvalid = true;
var focusfield = null;
var i = 0;
var fields = new array();
otwofields = new twofields();
for (x in otwofields) {
var field = form[otwofields[x][0]];
var secondfield = form[otwofields[x][2]("secondproperty")];
if (field.type == 'text' ||
field.type == 'textarea' ||
field.type == 'select-one' ||
field.type == 'radio' ||
field.type == 'password') {
var value;
var secondvalue;
// get field's value
if (field.type == "select-one") {
var si = field.selectedindex;
value = field.options[si].value;
secondvalue = secondfield.options[si].value;
} else {
value = field.value;
secondvalue = secondfield.value;
}
if (value != secondvalue) {
if (i == 0) {
focusfield = field;
}
fields[i++] = otwofields[x][1];
bvalid = false;
}
}
}
if (fields.length > 0) {
focusfield.focus();
alert(fields.join('\n'));
}
return bvalid;
}]]></javascript>
</validator>
step 3: 在<span>validation.xml</span>中为你的表单配置验证:
<field property="password" depends="required,twofields">
<msg name="required" key="errors.required"/>
<msg name="twofields" key="errors.twofields"/>
<arg0 key="userform.password"/>
<arg1 key="userform.confirmpassword"/>
<var>
<var-name>secondproperty</var-name>
<var-value>confirmpassword</var-value>
</var>
</field>
这里errors.twofields的字段 '{0}'必须与字段'{1}' 的值相同。第三步的一个可选的工作就时使用 <span style="color: #023264;">xdoclet</span> 来生成<span>validation.xml</span>。requires (1) 配置xdoclet (当然)和(2) 在你的表单中添加添加一些<span>@struts</span> 标签<span>setpassword</span>方法。
/**
* returns the password.
* @return string
*
* @struts.validator type="required" msgkey="errors.required"
* @struts.validator type="twofields" msgkey="errors.twofields"
* @struts.validator-args arg1resource="userform.password"
* @struts.validator-args arg1resource="userform.confirmpassword"
* @struts.validator-var name="secondproperty" value="confirmpassword"
*/
public string setpassword() {
return password;
}
<div><h5><img src="http://blog.blogchina.com/template/common/img/array.gif" alt=""><span style="color: #155067;">struts提供的和form相关的标签</span> </h5><div style="display: block;">一些struts的表单标签总结。<br><span> <span style="color: #a52a2a;">与form相关的标签包括<form>标签本身以及所有必须包含在其中的标签。比如,<text>和<password>标签就是和form相关的标签,因为如果不把它们放到一个form中它们就没有意义。</span>
<br><span style="color: #a52a2a;"><form>标签<br><form>标签用于生成一个html form。使用该标签时必须遵循许多规则。</span>
<br><span style="color: #a52a2a;">首先,<form>标签中必须包含一个action属性,它是这个标签中唯一必需的属性。如果不具备该属性则jsp页面会抛出一个异常。之后你必须给这个action属性指定一个有效值。一个有效值是指应用程序的struts配置文件中<action-mappings>元素里的任何一个<action>子元素的访问路径。而且相应的<action>元素中必须有一个name属性,它的值是form bean的名称。</span>
<br><span style="color: #a52a2a;">例如,如果你有这样一个<form>标签: <html:form action="/login" > </span>
<br><span style="color: #a52a2a;">那么你的struts配置文件的<action-mappings>元素中必须有一个如下显示为粗体的<action>元素: <br> <action-mappings> <br> <action path="/login" <br> type="com.javapro.struts.loginaction" <br> name="loginform"<br> scope="request"<br> input="/login.jsp"><br> <forward name="success" path="/mainmenu.jsp"/><br> </action><br> .<br> .<br> .<br> </action-mappings><br>这就是说一个form标签是和form bean相关联的。</span>
<br><span style="color: #a52a2a;">另一个要遵循的规则是:任何包含在<form>中用来接收用户输入的标签(<text>、<password>、<hidden>、<textarea>、<radio>、<checkbox>、<select>)必须在相关的form bean中有一个指定的属性值。比如,如果你有一个属性值被指定为"username"的<text>标签,那么相关的form bean中也必须有一个名为"username"的属性。输入<text>标签中的值会被用于生成form bean的username属性。</span>
<br><span style="color: #a52a2a;">除了上面所讲的属性之外,<form>标签还有一些不是必须但加上更好的"次要"的属性。比如,你可以用focus属性来生成javascript,它会"定焦"(focus)到该form所包含的一个元素上。使用focus属性时你需要给它指定元素的名称。比如,以下代码是定焦在第二个text元素上的: <body><br><html:form action="/login" focus="password"><br>user name: <html:text property="username"/><br><br>password: <html:text property="password"/><br><br><html:submit/><br></html:form><br></body><br>该段代码会被转换成: <br><body><br><form name="loginform" method="post" <br> action="/mystrutsapp6/login.do"><br>user name: <input type="text" name="username" <br> value=""><br><br>password: <input type="text" <br> name="password" value=""><br><br><input type="submit" <br> value="submit"><br></form><br><script language="javascript" <br> type="text/javascript"><br> <!--<br> if (document.forms["loginform"].elements[<br> "password"].type != "hidden") <br> document.forms["loginform"].elements[<br> "password"].focus()<br> // --><br></script></span>
<br><span style="color: #a52a2a;"></body><br>注意,<form>标签中method属性的缺省值是post。另外,有没有看到这个标签库是如何建立javascript来定焦到password元素上的? 这也是该库让人着迷的地方之一。你不用担心如何在客户端进行编程,它会帮你自动生成。</span>
<br><span style="color: #a52a2a;">在运行前面的例子时还要注意,你必须有一个包含username和password属性的相关form。你可以参考本文第三部分中的login程序。</span>
<br><span style="color: #a52a2a;"><text>标签<br><text>标签用于生成一个文本的输入区域。它必须包含和相关form bean中的相同属性对应的"property"属性。该标签只有在嵌入到一个<form>标签中时才有效。<br>例如: <html:text property="username"/><br>会被转换成: <input type="text" name="username" value=""></span>
<br><span style="color: #a52a2a;"><password>标签<br><password>标签用于生成一个口令字(type password)的输入区域。它必须包含和相关form bean中的相同属性对应的"property"属性。该标签只有在嵌入到一个<form>标签中时才有效。该标签中的一个很重要的属性是"redisplay",它用于重新显示以前输入到这个区域中的值。该属性的缺省值为true。然而,为了使password不能被重新显示,你或许希望将该属性的值设为false。<br>例如: <html:password property="password" redisplay="false"/><br>会被转换成: <input type="password" name="password" value=""></span>
<br><span style="color: #a52a2a;"><hidden>标签<br><hidden>标签用于生成一个隐藏文本的输入区域。它必须包含和相关form bean中的相同属性对应的"property"属性。该标签只有在嵌入到一个<form>标签中时才有效:<br>例如: <html:hidden property="username"/><br>会被转换成: <input type="hidden" name="username" value=""></span>
<br><span style="color: #a52a2a;"><textarea>标签<br><textarea>标签用于生成一个文本区元素(text area element)。它必须包含和相关form bean中的相同属性对应的"property"属性。</span>
<br><span style="color: #a52a2a;">比如:<br><html:textarea property="details" cols="80" rows="20" value="enter details here"/><br>会被转换成: <br><textarea name="details" cols="80" rows="20">enter details here</textarea></span>
<br><span style="color: #a52a2a;"><radio>标签<br><radio>标签用于显示一个单选按钮(radio button)。它必须包含"value"属性。比如这段代码: <html:radio property="title" value="1"/>mr.<br><html:radio property="title" value="2"/>ms.<br><html:radio property="title" value="3"/>dr.<br>会被转换成这样的html: <br><input type="radio" name="title" value="1">mr.<br><input type="radio" name="title" value="2">ms.<br><input type="radio" name="title" value="3">dr.</span>
<br><span style="color: #a52a2a;"><checkbox>标签<br><checkbox>标签用于显示checkbox类型的输入区域。比如: <br><html:checkbox property="notify"/>please send me notification<br>会被转换成: <br><input type="checkbox" name="notify" value="on">please send me notification</span>
<br><span style="color: #a52a2a;"><submit>标签<br><submit>标签用于生成提交类型(type submit)的输入区域。<br>比如: <html:submit value="login"/><br>会被转换成: <input type="submit" value="login"><br> </span>
<br><br><span style="color: #a52a2a;"><reset>标签<br><reset>标签用于生成重置类型(type reset)的输入区域。比如: <br><html:reset/><br>会被转换成: <input type="reset" value="reset"></span>
<br><span style="color: #a52a2a;"><option>标签<br><option>标签用于显示select box中的一个选项。参照下面的<select>标签。</span>
<br><span style="color: #a52a2a;"><select>标签 <br><select>标签用于显示一个包含零个或更多选项的html选择元素。它必须被嵌入一个<form>标签中才有效。下面这个例子将说明如何使用该标签: <html:select property="color" size="3"><br> <html:option value=<br> "r">red</html:option><br> <html:option value=<br> "g">green</html:option><br> <html:option value=<br> "b">blue</html:option><br></html:select></span>
<br><span style="color: #a52a2a;">会被转换成: <br><select name="color" size="3"><option <br> value="r">red</option><br> <option value="g">green</option><br> <option value="b">blue</option><br></select></span>
</span>
发表评论
-
HD2刷机的基础知识 HD2的radio、HSPL、ROM三种组合
2012-02-07 15:13 1100今天看着教程刚刷了台HD2,觉得有用的文章顺便转载过来 ... -
Hadoop配置部分内容
2012-02-04 15:29 741[size=medium;]Hadoop配置部分内容[ ... -
[转载]JPA 批注参考(1)
2012-02-04 11:39 725作为 Java 企业版 5 ... -
JVM 内存结构(转)
2012-02-03 14:49 899http://www.4ucode.com/Study ... -
JSP,PHP,Python,Ruby,Perl概要及各自特点
2012-01-31 15:18 994互联网技术日新月异,编程的语言层出不穷,原本稍微平静了 ... -
不要再浪费时间
2012-01-31 15:08 910不要再浪费时间 &l ... -
<<让oracle跑的更快1>>读书笔记2
2012-01-11 13:24 10231 绑定变量 1 ... -
Groovy Sql使用Spring的事务管理
2011-12-28 18:43 1287Grails如果不想用Hibernate的东东,可以直 ... -
Crack JRebel 4.0,无需重启JVM,热部署解决方案
2011-12-28 18:28 1170http://dl.dropbox.com/u/229 ... -
Linux tar压缩时排除某个目录或文件的参数
2011-12-21 13:48 1303在对某个目录进行压缩的时候,有时候想排除掉某个目录,例 ... -
2011面试题目之猴子偷桃
2011-12-21 11:14 1508<span style="" ... -
Qt 4.7.4 完美动态编译发布动态调试,以及静态编译发布
2011-12-20 14:53 1602首先是准备工作 ... -
C#信息采集工具实现
2011-12-20 12:34 918简单C#信息采集工具实现 最近想整只爬虫玩玩,顺便熟 ... -
介绍一个ASP.NET开发工具Web Matrix
2011-12-19 09:49 966想学习或者开发个小型的ASP.NET程序,装个VS.N ... -
程序名称DreamIT(梦想IT)提供许多IT公司的面试和笔试试题
2011-12-19 09:24 916<font style="bac ... -
基于SVG的WebGIS的一个雏形
2011-12-14 13:19 680我和一位师弟,经过了很多天的努力,终于做出了一个简单的 ... -
在Android中自定义IOS风格的按钮
2011-12-12 10:09 1096<p class="MsoNorm ... -
HTML5网站
2011-12-12 08:55 809记得刚来现在公司的时候,老大就说,作为移动平台部门的员 ... -
将字节流(byte[])转换成文件
2011-12-09 08:25 1523/** * 将字节流转换成文件 * @par ... -
在SUSE 11中安装Windows虚拟机
2011-12-09 01:29 899Novell公司最近推出 ...
相关推荐
总结,Struts2的输入校验机制提供了手动和自动两种方式,结合配置文件和内置校验器,能够实现灵活且强大的数据校验,有效地防止了非法数据的流入,提升了系统的安全性。在实际开发中,开发者可以根据业务需求选择...
5. **内置校验器**:Struts2提供了丰富的内置校验器,覆盖了从简单的类型检查到复杂的数据验证。例如`required`用于检查字段是否为空,`int`和`double`用于数值类型检查,`email`用于电子邮件地址验证等。 综上所述...
### 常用Struts校验器解析 在Java Web开发中,Struts框架因其强大的MVC架构支持而被广泛采用。其中,表单验证是Web应用开发中的一个关键环节,Struts通过其内置的验证机制提供了丰富的校验功能。本文将详细介绍...
在用户注册登录的场景中,Struts 提供了强大的验证功能,通过校验器(Validator)来确保用户输入的数据符合预设的规则,从而提高应用的安全性和用户体验。 在这个例子中,我们关注的是如何使用Struts的校验框架来...
除了使用内置的校验规则外,Struts2还支持自定义校验器。开发者可以创建实现`Validator`接口的类,定义自己的校验逻辑,并在struts.xml中配置使用。 六、校验结果处理 当输入校验失败时,Struts2会将错误信息存储在...
总结,这个“struts2的自定义校验器例子”展示了如何在Struts2中为特定需求创建自定义验证逻辑,确保服务器端数据的有效性和安全性。通过实现自定义校验器,开发者可以灵活地控制输入数据的验证规则,提高应用程序的...
### Struts2校验器类型详解 #### 一、Struts2内建校验器 在探讨Struts2校验器之前,我们首先需要了解这些校验器是如何被定义和集成到框架中的。如文中所述,Struts2的内建校验器主要位于`xwork-2.0.4.jar`压缩包中...
如果默认的校验器不能满足需求,Struts2还允许开发者创建自定义的校验器。这需要实现`Validator`接口并配置在`struts.xml`中。 5. **结果处理**: 校验失败后,Struts2会根据配置的`action`标签中的`input`属性值...
总结来说,Struts2的自定义校验器使得开发者能够灵活地扩展框架的验证功能,以适应各种复杂的业务场景。通过创建自定义校验器类、配置校验规则以及处理验证结果,可以确保应用程序的数据质量,从而提高系统的稳定性...
- XML配置:在`struts.xml`或相应的Action配置文件中,使用`<validators>`标签定义自定义校验器,通过`<field-validator>`指定需要应用该校验器的字段。 - 注解配置:在Action类的属性上使用自定义注解,通过注解...
除了内置的校验器之外,Struts2还允许开发者自定义校验器,以实现更复杂的校验逻辑。自定义校验器可以通过继承`com.opensymphony.xwork2.validator.validators.AbstractValidator`类来实现,并覆盖`validate`方法来...
总结,Struts2的数据校验机制提供了强大的工具来确保用户输入的有效性,通过注解、XML配置或自定义校验器实现灵活的校验规则。通过正确处理校验错误并利用国际化功能,开发者可以创建出健壮且用户体验良好的Web应用...
### Struts2校验框架使用心得 #### 一、Struts2校验框架概述 Struts2是一款基于Java的企业级Web应用开发框架,它能够帮助开发者构建出结构清晰、易于维护的应用程序。其中,Struts2提供的校验框架是其核心特性之一...
本总结将深入探讨Struts2的核心概念、关键功能和实用技术,以帮助开发者全面理解并熟练运用这一框架。 一、Servlet模板 在Struts2中,Servlet模板是一种处理请求和响应的方式。它通过拦截器链对请求进行处理,然后...
总结来说,Struts2作为一款强大的MVC框架,通过其无侵入式设计、拦截器、类型转换、多样化的视图支持和灵活的数据校验,极大地提升了Java web开发的效率和质量。对于初学者来说,理解和掌握这些核心特性是学习Struts...
总结来说,"struts拦截器jar包"是指专门为Struts 1.x框架提供拦截器功能的第三方库,`saif-0.1.jar`和`saif-spring.jar`可能是用于实现特定拦截逻辑或整合Spring框架的扩展库。了解并正确使用这些jar包能够有效地...