XML 1

有个难点便是
<validator name=”required”
class=”com.opensymphony.xwork2.validator.validators.RequiredFieldValidator”/>
<validator name=”requiredstring”
class=”com.opensymphony.xwork2.validator.validators.RequiredStringValidator”/>
required和requiredstring有啥样分别呢?
requiredstring是指那么些字符串是必须的,而required表示那个字段是必须的,而尚未指明那几个字段是还是不是必须是字符串。
就此对此字符串,能够利用requiredstring,而对于非字符串类型就亟须选取required了。如在这些示例中的age,birthday。注意birthday是Date类型的,不是String。
只怕回看一下register2.jsp的页面内容。
body中的内容为:
<s:actionerror />
<s:form action=”register2″ theme=”simple”>
……
……
</s:form>
可是输入数据交由后,还是突显的是在此以前的失误音讯,并不是今日所设置的音信。
那就提到到某个知识点了,因为校验框架产生的不当是田野(field)error,不会在actionerror中展现。
由此,须求将
theme=”simple”去掉,并把那几个表格标签页去掉,然后实施时会看到在username上方的错误信息。
还有叁个标题正是validate校验框架和Action中validate方法是不是争辨。
实质上固然会动用框架验证,但是也会调用Action的validate方法,通过上面的显示结果应当能够精通的看出,在表单下面集中的显示了actionerror。
不过只要把Action中的validate方法的失误消息add到田野中会有如何意义啊??
修改RegisterAction中validate方法,将 addActionError改为addFieldError。
当没有输入用户名时,会展现如下错误音讯:
username should not be blank!
username invalid
缘何会议及展览示那样的结果吧???
第①肯定的是在validate中增添的田野同志error,和xml中不会争执
即错误新闻不会被遮住,而是两者都有,而且先展现xml中定义的错误新闻,然后才是validate中定义的错误音讯。实际上是具备的xml执行达成后,在实践validate。
为什么会生出那样的效应啊???那么你就亟须驾驭田野error到底是哪些!继续查看源代码。
因为RegisterAction是一连的
ActionSupport,addFieldError是继承自ActionSupport,所以先看看ActionSupport中
addFieldError的贯彻方式。
在 ActionSupport中add菲尔德Error是这么达成的,
public void addActionError(String anErrorMessage) {
validationAware.addActionError(anErrorMessage);
}
即通过调用validationAware对象的addActionError,而validationAware是
ValidationAwareSupport的3个实例,在ValidationAwareSupport中定义了田野先生error是何等。

*****************************************************

 

 

其间tyoe=”田野(field)Name”是不变的。至于其他细节不在那里详细描述。

再有好多概念好的type值,那里不一一列举
在validator成分中,name属性表示能够定义的type值,class
表示用哪个类来举行校验,那是struts2私下认可设置好的校验器,大家得以直接接纳。
在那么些例子中,我们将type设置为requiredstring

 

 

<validator type="requiredstring">
<param name="fieldName">username</param>
<message></message>
</validator>

 

字段校验
字段校验代表着田野,标签有个name属性石必填的,它和表单中的name属性值是一致的。
此处本身填入username。
<validators>
<field name=”username”>
</field>
</validators>
田野下边有个子成分叫田野同志-validator,代表着要用什么方式来展开校验,其有个本性叫
type,也是必填的。

trim代表是还是不是忽略空格,默许是true,因而在此也得以总结掉param成分。
事实上在
田野先生-validator成分中还有多天性质short-circuit,其私下认可值是false,表示的意趣是短路,即眼下验证战败,后面就不做验证了。
只是这仅仅只是三个校验条件,如故以
username为例,在上次的事例中,还需要username的尺寸要在6到10期间,因而,继续看default.xml文件
在内部找到那样一个成分
<validator name=”stringlength”
class=”com.opensymphony.xwork2.validator.validators.StringLengthFieldValidator”/>
从字面上能够看出是限量字符串长度的,由此查看那个实现类
它有三个分子变量:
private boolean doTrim = true;
private int maxLength = -1;
private int minLength = -1;
中间最重点的是maxLength和minLength分别表示最大尺寸和纤维长度
为此在这一个校验器中内容应该如下:

private Map>String, List<String>> fieldErrors;
public synchronized void addFieldError(String fieldName, String errorMessage) {
final Map<String, List<String>> errors = internalGetFieldErrors();
List<String> thisFieldErrors = errors.get(fieldName);
if (thisFieldErrors == null) {
thisFieldErrors = new ArrayList<String>();
errors.put(fieldName, thisFieldErrors);
}
thisFieldErrors.add(errorMessage);
}

 

<validators>
<field name=”username”>
<field-validator type=””>
</field-validator>
</field>
</validators>
type应该填入什么内容吧?
可以查阅xwork的源文件,在包
com.opensymphony.xwork2.validator.validators下有个公文default.xml,在这么些文件中定义了
type属性值。

 

<validators>
    <validator name="required" class="com.opensymphony.xwork2.validator.validators.RequiredFieldValidator"/>
    <validator name="requiredstring" class="com.opensymphony.xwork2.validator.validators.RequiredStringValidator"/>
    <validator name="int" class="com.opensymphony.xwork2.validator.validators.IntRangeFieldValidator"/>
    <validator name="long" class="com.opensymphony.xwork2.validator.validators.LongRangeFieldValidator"/>
    <validator name="short" class="com.opensymphony.xwork2.validator.validators.ShortRangeFieldValidator"/>
    <validator name="double" class="com.opensymphony.xwork2.validator.validators.DoubleRangeFieldValidator"/>
    <validator name="date" class="com.opensymphony.xwork2.validator.validators.DateRangeFieldValidator"/>
    <validator name="expression" class="com.opensymphony.xwork2.validator.validators.ExpressionValidator"/>
    <validator name="fieldexpression" class="com.opensymphony.xwork2.validator.validators.FieldExpressionValidator"/>
    <validator name="email" class="com.opensymphony.xwork2.validator.validators.EmailValidator"/>
    <validator name="url" class="com.opensymphony.xwork2.validator.validators.URLValidator"/>
    <validator name="visitor" class="com.opensymphony.xwork2.validator.validators.VisitorFieldValidator"/>
    <validator name="conversion" class="com.opensymphony.xwork2.validator.validators.ConversionErrorFieldValidator"/>
    <validator name="stringlength" class="com.opensymphony.xwork2.validator.validators.StringLengthFieldValidator"/>
    <validator name="regex" class="com.opensymphony.xwork2.validator.validators.RegexFieldValidator"/>
    <validator name="conditionalvisitor" class="com.opensymphony.xwork2.validator.validators.ConditionalVisitorFieldValidator"/>
</validators>

那种方法正是利用validate框架来兑现输入校验,这种措施是基于XML的表明。
文件名为XXXAction-validation.xml。
那么校验xml文件格式该怎么着写吧?
可以选择firefox查看此xml的DTD定义,地址为http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd
在此列出此DTD的内容
<?xml version=”1.0″ encoding=”UTF-8″?>
<!–
XWork Validators DTD.
Used the following DOCTYPE.
<!DOCTYPE validators PUBLIC
“-//OpenSymphony Group//XWork Validator 1.0.2//EN”
http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd"&gt;
–>
<!ELEMENT validators (field|validator)+>
<!ELEMENT field (field-validator+)>
<!ATTLIST field
name CDATA #REQUIRED
>
<!ELEMENT field-validator (param*, message)>
<!ATTLIST field-validator
type CDATA #REQUIRED
short-circuit (true|false) “false”
>
<!ELEMENT validator (param*, message)>
<!ATTLIST validator
type CDATA #REQUIRED
short-circuit (true|false) “false”
>
<!ELEMENT param (#PCDATA)>
<!ATTLIST param
name CDATA #REQUIRED
>
<!ELEMENT message (#PCDATA)>
<!ATTLIST message
key CDATA #IMPLIED
>
通过DTD的定义可见,此XML文件的根成分为validators。
在根成分下能够有多少个田野先生或validator子成分,即分别表示着字段校验和非字段校验,它们的界别将在前边介绍。

由此源代码,能够看看田野(field)Errors实际上是二个Map>String,
List<String>>。key是String类型的,而value是List<String>
而实在那么些List是经过ArrayList<String>来兑现的,也正是说,key是String类型的,而value是ArrayList<String>。
就算二个key只好对应贰个value,不过在此地value并不是一个字符串,而是1个数组。所以错误消息不会被遮盖掉。
在ActionSupport类中存在1个办法getFieldErrors,遵照章程名能够猜的出该办法再次回到的是田野同志Error那一个数组,既然如此那么是不是足以由此getFieldErrors直接抬高呢??
List<String> list = new ArrayList<String>();
list.add(“username should be between 6 and 10”);
this.getFieldErrors().put(“username”,list);
就算编写翻译器没有报错,不过事实上是可怜的。查看API文书档案:
get菲尔德Errors,其阐述如下:
public Map<String,List<String>> getFieldErrors()
Description copied from interface: ValidationAware
Get the field specific errors associated with this action. Error
messages should not be added directly here, as implementations are free
to return a new Collection or an
Unmodifiable Collection.
注释:
其一法子再次来到与那几个action相关的有血有肉的田野先生errors,错误新闻不能够直接从此处丰富,执行结果再次回到三个新的聚合或多少个不得修改的会师
那是何等看头呢?看源代码,那几个办法同样是在
ValidationAwareSupport中贯彻的。
public synchronized Map<String, List<String>>
getFieldErrors() {
return new LinkedHashMap<String,
List<String>>(internalGetFieldErrors());
}
透过能够见见该措施重临的是三个新的LinkedHashMap,只是一个正片,而不是原集合,所以那样一贯助长是力不从心出示出来的。
那么曾几何时使用validate验证框架,哪一天利用action中的 validate方法呢?
相似的话,简单表达能够应用 xml,复杂时用validate
后面讲到了
struts2的数据校验,那么为啥要有服务器校验??拥有了客户端校验不是也行呢??
服务端校验是必须的,尽管有客户端校验。因为能够不经过browser访问web服务器!!强健的web应用要有客户端和劳动器端的表达。
理所当然,struts2同一支撑客户端验证。
要选用struts2的客户端校验,必须满意一下尺码:
1.form的焦点(theme)一定不能够安装为simple
2.将struts2 form标签中validate属性设置为true
可是看到小时效果后就会意识,struts2生成的也是js代码,可是效果却很差,所以一般的话,使用struts2的服务器端校验,而客户端校验本人写。
struts2标签扶助事件,可以像使用html标签一样使用。
一律用validate校验框架也应当可以采用一些校验:
当action中有三个措施时,须要在和action同目录下新建文件
XXXAction-XXX(方法名)-validation.xml
在实例化子类对象时,会先执行父类的全局校验,然后是某个校验,接着是子类的大局校验,然后是子类的有的校验,由此不用提供全局校验。
字段校验和非字段校验的分化
通俗点讲:
字段校验:校验哪个人,用什么措施
非字段校验:用什么样校验,校验什么人
非字段校验示例:

<field name="username">
<field-validator type="stringlength">
<param name="minLength">6</param>
<param name="maxLength">10&lr;/param>
<message>username should be between ${minLength} and ${maxLength}</message>
</field-validator>
</field>

 

 

 

<validators>
<field name="username">
<field-validator type="requiredstring">
</field-validator>
</field>
</validators>

在田野-validator上边有三个子元素,param和message
param能够自由个,可有可无,可是message有且唯有多少个。
param表示传入的参数,message表示出错开上下班时间显示的新闻。也正是说message能够是随机的字符串,可是param却是特定的。
在继续在此之前依然看看
com.opensymphony.xwork2.validator.validators.RequiredStringValidator那个类的源代码。首先鲜明已经下载了源代码,并且在MyEclipse中涉嫌了源代码,那是3个好习惯。
在这一个类中有八个成员变量
private boolean doTrim = true;
据此,大家在param中要做的正是,将param成分的name属性设置为doTrim,值为true。

—恢复生机内容开头—

相关文章

网站地图xml地图