&l" />

Struts2学习笔记(3)--输入校验

发布时间:2019-09-03 08:57:58编辑:auto阅读(1689)

    Struts2学习笔记(3)--输入校验
    输入校验
    =====================================
    1.register.jsp

    <%@ taglib prefix="s" uri="/struts-tags" %>
    <from action="register.action" method="post">
     <s:fielderror></s:fielderror>   用于显示错误信息
     用户名:<input type="text" name="username"/><br/>
     密码:<input type="password" name="password"/><br/>
     确认密码:<input type="password" name="repassword"/><br/>
     年龄:<input type="text" name="age"/><br/>
     生日:<input type="text" name="birthday"/><br/>
     毕业时间:<input type="text" name="graduation"/><br/>
     <input type="submit" value="提交"/>
     <input type="reset" value="重置"/>
    </form>
     
    =====================================
    2.action
    public class RegisterAction extends ActionSupport {
     private String username;
     private String password;
     private String repassword;
     private int age;
     private Date birthday;
     private Date graduation; //毕业时间
     //setter...getter...
     @Override
     public String execute() throws Exception {
      return SUCCESS;
     }
    }

    ======================================
    3.success.jsp
     用户名: ${ requestScope.username } <br/>
     密码:  ${ requestScope.password } <br/>
     确认密码: ${ requestScope.repassword } <br/>
     年龄:  ${ requestScope.age }  <br/>
     生日:  ${ requestScope.birthday } <br/>
     毕业时间: ${ requestScope.graduation } <br/>
     
    =======================================
    4.struts.xml
    <package name="struts2" extends="struts-default">
     <action name="register" class="com....action.RegisterAction" >
      <result name="success">/success.jsp</result>
      <result name="input">/register.jsp</result>
     </action>
    </package>
    如果系统发现输入的数据类型有错误的话,就自动到配置文件中找input对应的页面,
    如果找不到,则报错。

    =======================================
    5. 校验

    在Action中重写validate()方法,ActionSupport的该方法来自于Validateable接口
    struts构架会去找所有实现了Validateable接口的类,然后找到validate()方法进行验证
    客户端发出请求后,首先会进入validate()方法校验,成功后进入execute()方法
    @Override
    public void validate() {
     if( username == null || username.length() < 6 || username.length() > 10 ) {
      //调用这个方法,将把信息包含到一个域里面,页面通过<s:fielderror>标签输出域里所有的信息
      this.addFieldError("username","username invalid");
                      //匹配页面字段名    输出信息
     }
      ......

      if(null != birthday && null != graduation) {
      Calendar c1 = Calendar.getInstance();
      c1.setTime(birthday);
       
      Calendar c2 = Calendar.getInstance();
      c2.setTime(graduation);
       
      //如果生日不在毕业时间前面
      if(!c1.before(c2)) {
       this.addFieldError("birthday","birthday should be before graduation");
      }
     }
    }
    【初步完成】
    =======================================
    遇到类型转换错误的时候(也就是说不能进行类型转换),struts2框架自动生成一条错误信息,并且将该错误信息放到addFieldError里面
    流程
    1. 首先Struts2对客户端传来的数据进行类型转换
    2. 类型转换完毕后再进行输入校验
    3. 如果类型转换和输入校验都没有错误发生,那么进入execute方法(调用商业逻辑)

    注:如果类型转换不成功,也同样要进行输入校验
     
     
    =======================================

    替换Struts2自动产生的错误信息
    =======================================

    @@@@@@@@@@@@@@@@@@@@@@@@
      【全局的输入校验】 ----
    @@@@@@@@@@@@@@@@@@@@@@@@
    struts.xml
    <include> 用于包含其他的配置文件
    <constant> 在struts框架里使用的常量,这些常量就会替换掉struts中内置的常量
    =====替换系统默认的错误信息=====
    《1》
    <struts>                默认的国际化的资源文件        指定自己定义的资源文件为message.properties
     <constant name="struts.custom.i18n.resources" value="message"></constant>
     <package> ...
     ...
    </struts>
    《2》
    message.properties文件要放在classes下,也就是项目的src目录下,同struts.xml目录
    内容:
                    固定的
     ___________|_____________     错误信息
    |                                      |      |
    xwork.default.invalid.fieldvalue={0} error
                                                |
                                      表单属性的名字
    表示:
    当哪个字段发生错误的时候,显示那个字段的名字 和 错误信息

    =======================================

    @@@@@@@@@@@@@@@@@@@@@@@@@
       【局部的输入校验】
    @@@@@@@@@@@@@@@@@@@@@@@@@
    要求资源文件要和需要验证的action类在同一个目录下
    如:对com....action.RegisterAction进行验证
    需要在com....action下创建和Action相同名字的资源文件:RegisterAction.properties
    =====替换系统默认的错误信息=====

    RegisterAction.properties
    内容:
           固定的
     ________|________
    |                   |
    invailid.fieldvalue.age=age conversion error
                            |   |________________|
                      属性名          |
                                   错误信息
    表示:
    当年龄发生“类型转换”错误的时候,显示age conversion error这个错误信息

    =======================================

    如果类型转换错误的话,Struts自动将int类型设置成0,将对象类型设置成null
    =======================================
     
     

    #################################
      相关问题----资源文件中的中文
    #################################
    jdk\bin\native2ascii.exe 可以将任何一个文件的字符集转换为Unicode
    使用方式:
    ------------------
    (1)串方式
    ------------------
    需要转换的串:invailid.fieldvalue.age=年龄信息输入不正确
    到cmd命令行,
    d:\>native2acsii
    invailid.fieldvalue.age=年龄信息输入不正确 【回车】
    得到结果
    invailid.fieldvalue.age=\ u5e74\ u9f84\ u4fe1...
    Ctrl+C 终止
    -------------------
    (2)文件到文件方式
    -------------------
    到cmd命令行,
    d:\>native2acsii test.txt test.properties
    test.txt ---源文件
    test.properties ---要转换到的文件
     
     

    #################################
       相关问题----输入数据回填
    #################################
    当发生错误时,如果不使用struts的form标签,回到输入页面,以前输入的数据会消失
    可以中EL表达是解决,如:
    <input type="text" name="username" value="${username}" />
    如果使用struts的form标签,将会自动回填输入信息
    注:并且struts的form标签会自动生成一个表格
     
     
    @@@@@@@@@@@@@@@@@@@@@@@@@
      输入校验------分类
    @@@@@@@@@@@@@@@@@@@@@@@@@
    错误校验的级别有2种:
    1.Action级别的错误
     通过
     void addActionError(String errorMessage)、
     void addActionMessage(String message)
      方法完成
     actionError的信息实际上放在了一个ArrayList中
    2.Field级别的错误
     通过
     void addFieldError(String fieldName, String errorMessage)
     方法完成
     fieldError的信息实际上放在了一个Map中,fieldName作为键,errorMessage作为值
     
    ----------------------------------------
    1》
    Action中
    public void validate() {
     if( null == username || username.trim().length() < 1 ) {
      this.addActionError("username invalid");
     }
     if( null == password || password.trim().length() < 1 ) {
      this.addActionError("password invalid");
     } 
     ...
    }
    ----------------------------------------
    2》
    struts的form标签已经内置的错误信息,但只内置的fieldError错误
    在jsp的input页面可以通过添加 <s:actionerror/> 标签来显示actionError的信息
    该标签将以列表的方式显示出所有的actionError信息
    *** 更改错误信息的CSS :<s:actionerror cssStyle="color:red"/>     直接设置css代码
       <s:actionerror cssClass="errorCss"/>      引入一个css定义
    ---------
      补充1
    ---------
    ValidationAware接口的boolean hasErrors()用于判断错误,返回false,表示验证错误
    返回 hasActionError() 或者 hasFieldError()
    当这两个方法中有一个为假,说明转换或验证是错误的,返回到input页面
    hasActionError()是判断ArrayList,如果该list为空的话,表示验证通过
    hasFieldError()是判断Map,如果该Map为空的话,表示验证通过
    然后执行execute()方法

    ---------
      补充2
    ---------
    theme : 主题 (simple | ajax | ...)
    <s:textfield name="username" label="username" theme="simple" />
    theme设置为simple时,该field将不在struts自动生成的表格中定义
    这样的话,label将失效,并且不再在表单中显示错误信息
    将<s:form ... theme="simple">
    表单的所有field将不在自动生成表格,label将失效,不显示错误信息,会自动回填信息
    可以将这些field根据需要添加到自己的表格中。
     
    ---------
      补充3
    ---------
    在一个action中实现多个业务方法 对应于struts1的DispatchAction的操作
    <action name="..." class="..." method="abc">
    如果指定了method="abc",将会不在调用action中的execute(),而是调用abc()方法
    abc()的写法与execute()相同
    public String abc() throw Exception { .... }
    ----------------------
    配置多个 action 的时候:
    ----------------------
    struts.xml中
    <action name="register" class="...RegisterAction">
     <result> ... </result>
     ...
    </action>
    <action name="addUser" class="...RegisterAction" method="add">
     <result> ... </result>
     ...
    </action>
    <action name="deleteUser" class="...RegisterAction" method="delete">
     <result> ... </result>
     ...
    </action>
    -----------
    对应的,RegisterAction中
    public String execute() throws Exception { .... }
    public String add() throws Exception { .... }
    public String delete() throws Exception { .... }
    -----------
    每个执行业务逻辑的方法都应对应不同的验证方法
              对应于
    execute() ------> public void validate() { ... }
    对于自定义的方法,可以写自定义的validate方法:validate + 对应的逻辑方法名
              对应于
    add() ----------> public void validateAdd() { ... }
              对应于
    delete() -------> public void validateDelete() { ... }

    -----------
    通过下面的URL调用:
    [url]http://..../register.action[/url]
    [url]http://..../addUser.action[/url]
    [url]http://..../deleteUser.action[/url]
    -----------
    在有多个业务逻辑方法和验证方法时,
    执行顺序:
    validateAdd()-->validate()-->add()
    不管有多少个验证方法,validate()总会被执行
    解决策略:
    不重写validate(),让他什么也不执行
    用validateExecute()对execute()进行验证

    【完成】

关键字