Struts2的输入校验
Struts2的输入校验
输入校验的方式:
- 代码校验
- 配置校验
- xml配置校验(常用)
- 注解配置校验
代码输入的校验:
- 覆盖ActionSupport的validate()方法,在这个方法中完成对参数的校验。validate方法会在参数封装之后,execute方法(也就是Action中定义的方法)执行之前执行。如果validate方法向fieldError中添加了错误信息,那么就不会执行execute方法,而是跳转到input视图。具体流程如下:
- 示例代码(这里是一模型驱动,bean就是一个简单的User对象)
public class ValidateAction extends ActionSupport implements ModelDriven<User>{ private User user = new User(); @Override public User getModel() { return user; } /** * 代码校验的方式 */ @Override public void validate() { if(user.getUname()==null || user.getUname().isEmpty()){ this.addFieldError("uname", "用户名不能为空"); } } /** * 执行execute方法 */ @Override public String execute() throws Exception { System.out.println("用户名:"+user.getUname()); return NONE; } }
<form action="/ex/user/vali.do" method="post"> 用户名:<input type="text" name="uname"/><s:fielderror name="uname"/><br/> <!--通过struts2标签显示错误信息--> <input type="submit" value="提交"> </form>
这样就Ok。如果uname的值为空页面就会出现,错误信息。 - 这里还可以为单个Action中的方法指定校验方法。方法命名的格式是:
- 该方法不能有返回值,且不能有参数。方法名是:validate要校验方法的名称首字母大写。例如:void validateLogin()表示要校验的是,Action中的login方法。
- 那它们的执行顺序是:
- 先是Action中方法的校验方法执行,再是整个Action的校验方法执行。再是Action的execute方法执行。如果向fieldError中添加了错误信息,则execute方法不会执行。
Xml配置方式校验(经常使用):
- 使用代码校验有不好的地方,就是修改的时候要修改代码。并且要自己编写校验规则。使用配置文件的格式来进行进行校验,不需要修改代码,并且struts2为我们提供了常用的校验规则。
- Xml方式的校验条件是:
- 你的Action必须实现Validateable接口。ActionSupport类已经实现了Validateable该接口。所以只要直接继承这个类就行。
- 为要校验的属性提高get和set方法
- 创建校验文件,规则是:
- 校验文件的位置:如果是给某个Action提供校验,则放到和Action同包下就行。
- 校验文件的名称:ActionName-validation.xml.例如:为LoginAction提供校验文件,名称是:LoginAction-validation.xml。也就是action的名称+"-validation.xml"
- 校验文件的DTD:在xwork-core-2.3.4.1.jar下的xwork-validation-1.0.3.dtd
- 为了在没有联网的情况下也能在编写校验文件的时候有提示,则如图所示:
- 校验文件的格式如下:
<validators> <field name=""> <field-validator type=""> <param name=""></param> <message></message> </field-validator> </field> </validators>
- 其中的<field name="要校验的字段名称" /><field-validator type="要校验的规则"></field-validator/>。要校验的规则下面会说在哪里。<param name=""></param>校验规则的参数。<message key="不是不需的,可以通过资源文件指定">如果key指定了,这里就不用写了。错误信息</message>
- 其中的校验规则在
- 每个校验规则都有自己的参数,要知道有哪些参数,最好去看源码。这里就不一一介绍了。
- 下面介绍校验规则:
required:当属性为null时校验失败; requiredstring:当字符串属性为null或长度为0时校验失败: 参数trim:默认值为true,表示去除前后空白后再校验长度。 stringlength:当字符串长度不在指定范围内时校验失败: minLength:指定字符串的最小长度; maxLength:指定字符串的最大长度。 regex:属性不能匹配正则表达式时校验失败: expression:指定正则表达式; caseSensitive:默认值为true,表示不忽略大小写。 int:当int属性不在指定范围内校验失败: min:最小值; max:最大值。 double:当double属性不在指定范围内校验失败: min:最小值; max:最大值。 fieldexpression:属性必须是OGNL表达式: expression:用来校验的ONGL表达式,例如pass == repass,其中pass和repass是两个属性名称,当这两个属性的值相等时校验通过,否则失败。 email:属性必须是合法的邮件地址; url:属性必须是合法的网址; date:属性必须是合法的日期格式。
- 下面是一个比较完成的校验案例
<validators> <field name="id"> <field-validator type="requiredstring"> <message>学号不能为空</message> </field-validator> <field-validator type="regex"> <param name="expression">ITCAST_\d{4}</param> <message>学号格式必须是"ITCAST_0000"</message> </field-validator> </field> <field name="username"> <field-validator type="requiredstring"> <message>用户名不能为空</message> </field-validator> <field-validator type="stringlength"> <param name="minLength">3</param> <param name="maxLength">10</param> <message>用户名长度必须在${minLength}~${maxLength}之间</message> </field-validator> </field> <field name="password"> <field-validator type="requiredstring"> <message>密码不能为空</message> </field-validator> <field-validator type="stringlength"> <param name="minLength">3</param> <param name="maxLength">10</param> <message>密码长度必须在${minLength}~${maxLength}之间</message> </field-validator> </field> <field name="repassword"> <field-validator type="requiredstring"> <message>确认密码不能为空</message> </field-validator> <field-validator type="fieldexpression"> <param name="expression">password == repassword</param> <message>两次密码输入不一致</message> </field-validator> </field> <field name="age"> <field-validator type="required"> <message>年龄不能为空</message> </field-validator> <field-validator type="int"> <param name="min">18</param> <param name="max">80</param> <message>年龄必须在${min}~${max}之间</message> </field-validator> </field> <field name="email"> <field-validator type="requiredstring"> <message>Email不能为空</message> </field-validator> <field-validator type="email"> <message>邮件地址格式错误</message> </field-validator> </field> <field name="homepage"> <field-validator type="requiredstring"> <message>主页不能为空</message> </field-validator> <field-validator type="url"> <message>主页地址格式错误</message> </field-validator> </field> <field name="birthday"> <field-validator type="required"> <message>生日不能为空</message> </field-validator> <field-validator type="date"> <param name="min">1940-01-01</param> <param name="max">2013-01-01</param> <message>生日必须在${min}到${max}之间</message> </field-validator> </field> </validators>
- 其中要注意的是生日这一块,如果按上面这么写‘年’只会出现两位。可以直接写上多少年到多少年。
Xml配置校验之私有校验(请求方法的校验):
- 上面的校验是公有的,也就是整个Action中的方法共享校验。那如果要为某个的请求的方法提供校验规则。格式如下:
- 文件位置还是和Action一个包下
- 文件名称比较复杂,ActionName-配置文件中的<action name="值"/>-validation.xml。例如:
public class UserAction extends ActionSupport{ public String login(){ return "success"; } }
<action name="land" class="xx.xxx.xx.UserAction" method="login"> <result>/succ.jsp</result> </action>
- 名称为:UserAction-land-validation.xml。