struts2输入校验

方法一:使用编码方式,只要是标签库的使用和重写validate()方法

1、创建register.jsp

 <body>

<s:actionerror/>
<!--
<s:fielderror></s:fielderror>
 -->
<h2>注册信息</h2>
 
<s:form  action="register.action"  method="post" theme="simple" >

用户名:<s:textfield name="username" label="username"></s:textfield><br/>
密  码:<s:password name="password" label="password"></s:password><br/>
重  复:<s:password name="repassword" label="repassword"></s:password><br/>
年  龄:<s:textfield name="age" label="age"></s:textfield><br/>
生  日:<s:textfield name="birthday" label="birthday"></s:textfield><br/>
毕  业:<s:textfield name="graduate" label="graduate"></s:textfield><br/>
<s:submit name="submit"></s:submit>

</s:form>
</body>

2、修改struts.xml文件 input为校验失败的返回的页面

    <action name="register" class="com.validate.RegisterAction">
            <result name="success">/result.jsp</result>
            <result name="input">/register.jsp</result>
        </action>

 

3、编写 action

public class RegisterAction extends ActionSupport {

 private String username;
 private String password;
 private String repassword;
 private int age;
 private Date birthday;
 private Date graduate;
 public String getUsername() {
  return username;
 }
 public void setUsername(String username) {
  this.username = username;
 }
 public String getPassword() {
  return password;
 }
 public void setPassword(String password) {
  this.password = password;
 }
 public String getRepassword() {
  return repassword;
 }
 public void setRepassword(String repassword) {
  this.repassword = repassword;
 }
 public int getAge() {
  return age;
 }
 public void setAge(int age) {
  this.age = age;
 }
 public Date getBirthday() {
  return birthday;
 }
 public void setBirthday(Date birthday) {
  this.birthday = birthday;
 }
 public Date getGraduate() {
  return graduate;
 }
 public void setGraduate(Date graduate) {
  this.graduate = graduate;
 }
 @Override
 public String execute() throws Exception {
  // TODO Auto-generated method stub
  return SUCCESS;
 }
 @Override
 public void validate() {
  // TODO Auto-generated method stub
  if(username == null || username.length()<4 || username.length()>6){
   this.addActionError("用户名错误");
  }
  if(password == null || password.length()<4 || password.length()>6){
   this.addActionError("密码错误");
  }
  if(repassword == null || repassword.length()<4 || repassword.length()>6){
   this.addActionError("重复密码错误");
  }
  if(  age<0 || age>100){
   this.addActionError("年龄错误");
  }
 }
 
}

 

4、编写result.jsp页面

 

<body>

<s:property value="username" />
<s:property value="password" />
<s:property value="repassword" />
<s:property value="age" />
<s:property value="birthday" />
<s:property value="graduate" />   
 
</body>

 


 

 

 

 

 

校验方法二:自定义方法的输入校验

validate()方法调用是在自定义方法和execute方法之前调用的,但是如果validate出错,就不会去执行其他的方法。

自定义的校验可以只针对自定义的方法起作用,而不会对其他的方法产生影响

//这是自定义方法
public String myExecute()
{
    return SUCCESS;
}
//这是自定义方法的校验方法,注意观察命名规则,成为自定义方法的输入校验的方法,通过反射来调用的
public void ValidateMyExecute()
{
     this.addActionError("增加了一个action级别的错误");
}

总结:
对于通过action的method属性所指定的自定义方法,其对应的自定义输入校验的方法名为validateMyExecute(假设自定义的方法名为myExecute)
底层是通过反射来实现的。
如果自定义方法和原来的校验方法都存在,会先执行那个?
结果是先执行自定义的方法,然后再执行通用的validate方法
如果去掉自定义方法,那么也不会执行其对应的校验
validate方法永远会被执行,但总是排在自定义的方法校验之后执行。


定制field级别的自定义信息。如果发生了类型转换错误,通常会返回field级别的错误信息,但是这些信息的格式不一定是我们想要的,但是我们也可以自定义,
自定义方法如下。
1)新建一个一action命名的properties文件,如RegisterAction.properties
2)然后在该属性文件中指定每一个出错字段的错误消息。格式为
invalid.fieldvalue.birthday=birthday error
invalid.fieldvalue.graduate=graduate error
要想显示中文不能直接在后面写,要打开试图界面,写上去,我的不行,在me的8.5以上才可以,写的是unicode码,有个很好的工具http://www.00bug.com/native2ascii.html
例如生日错误对应的unicode是 /u751f/u65e5/u9519/u8bef,, 骑士我们的jdk也有这个工具在bin下面的native2ascii.exe

 

 

 

 


 

方法三:使用框架

 

 校验方法3:使用struts的校验框架,即有效地xml文档
具体分为字段优先field与校验器(validator)优先
用这种方式的校验都是field级别的,这两种方法可以混合使用

3.1 field优先
 xml的存放位置,与action再通一个包目录下
 命名规则是 action的名称-validation.xml,如:RegisterAction-validation.xml
 
 RegisterAction-validation.xml的文件内容如下:
 
 <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">

<validators >

      <field name="username">
            <field-validator type="requiredstring">
                <message>用户名不能为空</message>       
            </field-validator>
           
            <field-validator type="stringlength">
                <param name="minLength">4</param>
                <param name="maxLength">6</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">4</param>
                <param name="maxLength">6</param>
                <message>密码长度应该在${minLength}到${maxLength}之间</message>
            </field-validator>
      </field>
     
      <field name="age">
              <field-validator type="required">
                  <message>年龄不能为空</message>
              </field-validator>
              <field-validator type="int">
                  <param name="min">10</param>
                  <param name="max">100</param>
                  <message>年龄应该在10到100岁之间</message>
              </field-validator>
      </field>
     
      <field name="birthday">
              <field-validator type="date">
                  <param name="min">2005-1-1</param>
                  <param name="max">2011-9-9</param>
                  <message>日期应该在${min}到${max}之间</message>
              </field-validator>
      </field>
</validators>
 
 <message>中还可以有个key属性,是为了国际化留的。
 
 
 
 在xowrk的包里的xml文件中可以找到如下:
 <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="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"/>
</validators>


3.2 validate优先
         <validator type="requiredstring">
               <param name="fieldName">username</param>
               <message>用户名不能为空</message>
       </validator>
       <validator type="stringlength">
               <param name="fieldName">username</param>
               <param name="minLength">4</param>
               <param name="maxLength">6</param>
               <message>用户名长度在4-6之间</message>
       </validator>

 

 

 


大总结

 

校验顺序是:先类型转换,再执行校验框架(xml),在执行自定义编码方法的校验  最后执行编码方式的校验(validate方法),在检查action和field级别的错误,如果有任何一个错误,就转向input,如果没有任何错误,就转向success

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值