你的位置:首页 > Java教程

[Java教程]服务器端输入验证


一、没有使用框架情况下,在目标方法处,通过手动的编写代码来进行验证

二、Struts2

1.支持声明式验证,即通过配置的方式来验证。需要实现接口 ValidationAware,依赖于两个拦截器 validation 和 workflow 拦截器。

validation 拦截器:进行验证和创建字段错误列表

workflow  拦截器:检查 validation 拦截器发现的错误,如果发现,返回 "input"(默认)result。

如果没有指定 name=input 对应的 result ,则返回一个错误消息告诉我们 "there's no "input" result defined for the action"。

2. Struts2 默认的验证器

<??><!DOCTYPE validators PUBLIC    "-//Apache Struts//XWork Validator Definition 1.0//EN"    "http://struts.apache.org/dtds/xwork-validator-definition-1.0.dtd"> <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>

3.验证规则配置文件

(1)位置:在需要验证的 Action 同包下。

(2)当前 Action 类所有 action 使用同样的验证规则:Action简单类名-validation.

(3)当前 Action 类某个 action 使用具体的验证规则:Action简单类名-ActionName-validation.

4. 验证分类

(1)字段验证(Field Validator Syntax)

e1:验证 myPurchaseCode 字段长度必须为10

<validators>  <field name="myPurchaseCode">    <field-validator type="stringlength">       <param name="minLength">10</param>       <param name="maxLength">10</param>       <param name="trim">true</param>       <message>Your purchase code needs to be 10 characters long</message>    </field-validator>  </field></validators>

e1:验证 age 必须在 20 到 50 之间

<validators>  <field name="age">     <field-validator type="int">       <param name="min">20</param>       <param name="max">50</param>       <message>Age needs to be between ${min} and ${max}</message>     </field-validator>   </field></validators>

(2)类型验证(Plain Validator Syntax)

e1:验证 myPurchaseCode 字段长度必须为10:

<validators>  <validator type="stringlength">    <param name="fieldName">myPurchaseCode</param>    <param name="minLength">10</param>    <param name="maxLength">10</param>    <param name="trim">true</param>    <message>Your purchase code needs to be 10 characters long</message>  </validator></validators>

e2:验证 age 必须在 20 到 50 之间

<validators>   <validator type="int">     <param name="fieldName">age</param>     <param name="min">20</param>     <param name="max">50</param>     <message>Age needs to be between ${min} and ${max}</message>   </validator></validators>

(3)表达式验证

e:判断密码和确认密码输入是否一致

<validators>  <validator type="expression">    <param name="expression"><![CDATA[pwd==pwdConfirm]]></param>    <message>密码和确认密码不一致</message>  </validator></validators>

其中:<param name="expression"> 标签体中的内容会自动进行 OGNL 解析。

5.短路验证:

对于同一个字段进行多个规则验证,如果第一个验证没有通过,则后续的规则不进行验证。

只需要在 validator 或 field-validator 标签内加入 short-circuit 属性并设置为 true 即可。

如:

<validators>  <field name="email">    <field-validator type="stringlength" short-circuit="true">      <param name="minLength">4</param>      <param name="maxLength">10</param>      <param name="trim">true</param>      <message>email length must between ${minLength} and ${maxLength}</message>    </field-validator>    <field-validator type="email">      <message>Must provide a valid email</message>    </field-validator>  </field></validators>

email validate

6.类型转换失败提示与验证出错提示消息

struts2 默认的拦截器栈为 defaultStack,规定了 conversionError 拦截器在 validation 拦截器之前执行。但是 conversionError 拦截器拦截到类型转换出错的消息,并不会返回 "input",而是继续让proxy调用后续的拦截器。

这里的源码我们不能进行更改,但是我们可以仿造一个,类的加载顺序是采取的就近原则。所以我们在项目的 src 目录下,新建与 conversionError 拦截器对应的目录结构,然后修改 conversionError 拦截器代码。

7.对 Action 类的要求

要验证的字段,必须提供 getXxx() 和 setXxx() 方法,getXxx() 方法用于 validate 拦截器进行比较验证。

8.一个简单的例子:

<s:form action="/validateNum">      <s:textfield name="age" label="age"/>      <s:submit label="submit"/></s:form>

form 表单
<!DOCTYPE validators PUBLIC    "-//Apache Struts//XWork Validator 1.0.2//EN"    "http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd"><validators>  <field name="age">    <field-validator type="int">      <param name="min">20</param>      <param name="max">50</param>      <message>Age needs to be between ${min} and ${max}</message>    </field-validator>  </field></validators>

ValidateAction-validation.
<struts>  <package name="default" namespace="/" extends="struts-default">    <action name="validateNum" class="com.nucsoft.struts.ValidateAction">      <result>/success.jsp</result>      <result name="input">/index.jsp</result>    </action></struts>

struts.

9.自定义验证器

(1)普通的验证器继承 ValidatorSupport 类,字段验证程序继承 FieldValidatorSupport。如需要提供参数,提供 setXxx() 方法,如错误消息要获取验证器类中的属性,提供对应的 getXxx() 方法。

(2)注册验证器类:在类路径根目录下新建 validators.

(3)正常使用

10.编程式验证:

Struts2提供了一个 Validateable 接口,Action 类可以实现这个接口中的 validate() 方法,在其中编写验证逻辑。ActionSupport 类已经实现了 Validateable 接口。

 

 

 

 

 

 

 

未完,待续