• ActionErrors 使用说明 struts1 validate 处理流程 详细教程(转)


    转自(http://blog.csdn.net/wyx100/article/details/8736445).

    struts1  处理流程是  jsp  -->  ActionForm 中的ActionErrors validate-->验证通过后执行 action  ,否则返回页面,显示错误信息!

    /*
     * Generated by MyEclipse Struts
     * Template path: templates/java/JavaClass.vtl
     */
    package org.myrose.form;
    
    import javax.servlet.http.HttpServletRequest;
    
    import org.apache.struts.action.ActionErrors;
    import org.apache.struts.action.ActionForm;
    import org.apache.struts.action.ActionMapping;
    import org.apache.struts.action.ActionMessage;
    
    /** 
     * MyEclipse Struts
     * Creation date: 12-27-2007
     * 
     * XDoclet definition:
     * @struts.form name="loginForm"
     */
    public class LoginForm extends ActionForm {
     /*
      * Generated fields
      */
    
     /** password property */
     private String password;
    
     /** name property */
     private String id;
    
     private String validatecode;
     /*
      * Generated Methods
      */
    
     public String getValidatecode() {
      return validatecode;
     }
    
     public void setValidatecode(String validatecode) {
      this.validatecode = validatecode;
     }
    
     /** 
      * Method validate
      * @param mapping
      * @param request
      * @return ActionErrors
      */
     public ActionErrors validate(ActionMapping mapping,
       HttpServletRequest request) {
      ActionErrors errors = new ActionErrors();
      if(id == null || id.trim().equals("")){
       errors.add("login_id_null",new ActionMessage("login.id.null"));
       return errors;
      }else if(id.length() != 20){
       errors.add("login_id_length",new ActionMessage("login.id.length"));
       return errors;
      }else if(password == null || password.trim().equals("")){
       errors.add("login_password_null",new ActionMessage("login.password.null"));
       return errors;
      }else if(password.length() != 6){
       errors.add("login_password_length",new ActionMessage("login.password.length"));
       return errors;
      }else if(!validatecode.equals(request.getSession().getAttribute("rand").toString())){
       errors.add("login_validatecode_error", new ActionMessage("login.validatecode.error"));
       return errors;
      }
      return null;
     }
    
     /** 
      * Method reset
      * @param mapping
      * @param request
      */
     public void reset(ActionMapping mapping, HttpServletRequest request) {
      // TODO Auto-generated method stub
     }
    
     /** 
      * Returns the password.
      * @return String
      */
     public String getPassword() {
      return password;
     }
    
     /** 
      * Set the password.
      * @param password The password to set
      */
     public void setPassword(String password) {
      this.password = password;
     }
    
     public String getId() {
      return id;
     }
    
     public void setId(String id) {
      this.id = id;
     }
    
    
    }

    一、简介ActionErrors与ActionMessages
    ActionErrors是ActionMessages的子类,包括ActionMessage,他们都实现了接口java.io.serializable。原来ActionError是ActionMessage的子类,后来在struts1.3中已被弃用,估计原因是ActionMessage能满足要求,并且 ActionErrors亦能用作ActionMessage的容器,所以ActionError显得多余。
    ActionErrors和ActionMessages都可作为ActionMessage的容器,ActionMessages实例也可以互为容器,甚至ActionErrors可以做父类实例ActionMessages的容器(这里体现了“里氏代换”原则——父类出现的地方,子类是可以安全替代的),既可以有errors.add(msgs)。


    二、例子
    先来看一个简单例子
    1、资源文件错误信息来源(其格式为 key = value )
       error.test = this is a test error.
    2、JSP页面中用于显示错误信息标签
       <html:errors property="testerror"/>
    3、ActionFormBean的validate()方法中产生错误信息
       ActionErrors error = new ActionErrors();
       error.add("testerror",new ActionMessage("error.test"))
       return error;
    这个例子的功能就是在ActionForm Bean的validate()方法中产生一条名为:testerror的错误信息,
    错误信息息是资源文件中key为error.test的值。然后在页面上用html:errors标签输出testerror这条错误信息。
    这是最常用的一种功能,所有的错误信息都在资源文件里面。
    有人会问,错误信息只能存放在资源文件中吗,其实不是这样。不需要资源文件也可以产生错误信息。
    1)ActionMessage(String key,boolean isresource)
    如果isresource值为true,则表示key是资源文件中的key,产生的消息就是与key相对应的消息
    如果isresource值为false,则表示key为一条普通的消息。
    如果上面的error.add改为error.add("testerror",new ActonMessage("这是一条自定义消息",false",));
    那么页面上显示的将是:这是一条自定义消息.


    2)另外还可以用ActionMessage产生复合消息,比如我们要输出:xxx不能用作用户名,其中xxx是一个变量。
    首先我们在资源文件中加一个条复合消息
    testmsg = {0}不能用作用户名。这里{0}是要被替换的参数。
    我们再来看一下ActionMessage的另一中构造方法
    ActionMessage(String key,Object value0);
    也就是说用value0的值来替换{0}
    我们修改error.add为error.add("testerror",new ActonMessage("testmsg","xxx"))
    那么JSP页面上将显示:xxx不能用作用户名。
    当然在一条复合消息中也可带多个参数,参数依次为{0},{1},{2}或更多
    例如:loginUser = 用户名:{0} 姓名:{1} 登录次数:{2}.....
    那么在产生错误消息时就用new ActionMessage(String key,Object value0,Object value1,Object value2.....)
    或者使用对象数组new ActionMessage(String key,Object[] values)
    String[] detail = {"Admin","王晶","12"};
    error.add("testerror",new ActionMessage("loginUser",detail))
    ________________________________________
    Note:
    Cannot find message resources under key org.apache.struts.action.MESSAGE 错误的原因是没有配置资源文件
    解决办法: 在struts-config.xml 中加入如下的一段
    <message-resources parameter="application" null="false"></message-resources>
    -----------------------------------------------------------------------------------------------------------------------
    在Action或Form里生成errors:
    在Action中使用:
     ActionErrors errors = new ActionErrors();
    //创建一个error,topic.show.error要在application.properties文件中声明
     ActionError error1 = new ActionError("topic.show.error");
    //加入到errors ,content为键
      errors.add("content", error1);
    //创建多个error
     ActionError error2 = new ActionError("topic.show.error");
     ActionError error3 = new ActionError("topic.show.error"); 
      errors.add("error2", error2);
      errors.add("error2", error3);      
    //Action返回值是Forward,所以要保存此errors
      this.saveErrors(request, errors);
    在JSP端就可以用:
    <html:errors property="content" />
    来显示error1这个错误。
    若用<html:erros />则显示出所有的错误
    三、详细讲解
    ActionMessages以一个HashMap存储ActionMessage.Map中的key是一个标识,其对应的value是一个List对象,所有的ActionMessage存储在List中.也就是说key标识了一组ActionMessage.
    1、 ActionMessage
    1)ActionMessage(String key)该方法接受一个字符串,字符串是在资源文件种配置的key值,必须在配置文件中进行相关配置.
    2)ActionMessage(String key,Object value)
    3)ActionMessage(String key,Object value0,Object value1)
    4)ActionMessage(String key,Object value0,Object value1,Object value2)
    5)ActionMessage(String key,Object value0,Object value1,Object value2,Object value3)
    上面4个方法第一个参数同样是资源文件中配置的key值,同样必须在配置文件中进行相关配置.
    后面的参数为资源文件中key所对应的信 息中需要的参数 ActionMessage(String key,Object[] values)
    这种方法第一个参数同上,第二个参数接受一个Object数组,其中保存key在资源文件中对应信息需要的参数.
    6)ActionMessage(String msg,false )这个方法显示自定义消息,即消息输出内容为msg。
    7)getKey()返回ActionMessage的key,返回类型:String。
    8)getValues()返回ActionMessage中设定的资源文件参数,返回类型:Object[]。
    2、ActionMessages
    ActionMessages.add(String property,ActionMessage message)
    第一个参数property对应于<html:messages>标签中的property属性, property的值一般采用ActionMessages类中的静态常量ActionMessages.GLOBAL_MESSAGE,也可以自己定义一个key.该方法执行时,先判断ActionMessages中有没有该key,如果没有就新添加对key-List键值对;如果有同样的key,就先获取该key对应的Value并转换为List对象,然后将(ActionMessage)message添加进List对象中.
    ActionMessages.add(ActionMessages ams)该方法将参数中保存的ActionMessage合并到调用ActionMessages中.
    3、Action及其所有子类
    1)addMessages(HttpServletRequest request,ActionMessages messages)
     该方法首先检查request对象中是否有ActionMessages对象,如果有对象,则将接收的ActionMessages合并到request中,如果没有,用setAttribute(Globals.MESSAGE_KEY,messages)方法将messages添加进去.如果一个Action中需要显示多条错误信息,推荐使用该方法.
    (Globals.MESSAGE_KEY ="org.apache.struts.action.ACTION_MESSAGE")
    2)saveMessages(HttpServletRequest request,ActionMessages messages)
     该方法保存messages时,如果request中已经有一个ActionMessages对象,则用新的覆盖原有的.不推荐使用该方法,该方法容易发生丢失信息的情况.
    3)addErrors()和saveErrors()
    这两个方法与addMessages()和saveMessages()相似,不过在HttpServletRequest.setAttribute()时的参数不一样,这两个方法是:setAttribute(Globals.ERROR_KEY,messages)添加的.(Globals.ERROR_KEY = "org.apache.struts.action.ERROR")
    4)clear()
    5)isEmpty()
    6)isAccessed()是否已将ActionMessages存入request中。
    7)size()存于ActionMessages中的ActionMessage的数量。
    8)size(String property)ActionMessages中property键对应的List中的ActionMessage的数量。
    9)properties()返回ActionMessages的所有key,并存于Iterator中。
    10)get()返回存于ActionMessages中的所有ActionMessage,并存于Iterator中。
    11)get(String property)返回ActionMessages中property键对应的List中的所有ActionMessage,并存于Iterator中。
    4、 AtionErrors和ActionMessages的区别
    1) ActionErrors是ActionMessages的一个子类,功能几乎相同,不同点在于标签<html:errors/>和<html:messages>的使用上的区别。
    html:errors指定了footer和header属性。默认值为errors.header和errors.footer,需要时可以自己指定。如果资源属性文件配置了 errors.header和errors.footer,则任何时候使用html:errors时开头和结尾都是这两个属性对应的资源信息。
    而html:message默认情况下没有errors.header和errors.footer值,当然可以自己指定。
    2)html:errors可以根据property属性指定显示一个错误信息。html:messages有一个必添项id。html:messages不能直接显示信息,它将选出的信息放入一个用id标识的Iterator对象里,然后在用ben:write或JSTL c:out标签显示每个信息.例如:
    <html:messages message="true" id="msg">
        <c:out value="${msg}"/><br />
    </html:messages>

  • 相关阅读:
    ASP.NET Forms身份认证
    .net中调用存储过程的示例 带有输出参数
    jquery ajax .net使用
    存储过程实现批量删除
    相关分页Select语句(扩展)
    css中对于文字溢出时的控制
    精打细算过日子 车辆养用如何能更省钱
    2013年最新交通法规全文 具体扣分细节全面解读
    wxpython学习笔记(一)
    wxpython学习笔记(一)
  • 原文地址:https://www.cnblogs.com/kakaisgood/p/5548998.html
Copyright © 2020-2023  润新知