问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

struts2 怎么把错误信息输出到标签

发布网友 发布时间:2022-04-24 18:24

我来回答

1个回答

热心网友 时间:2022-04-12 17:44

下面是我的笔记,复制上来不好看,但是我在笔记软件上整理的很好。


struts2提供了两种校验方式:服务器端校验(更重要)和客户端校验

也分为:validate()校验方法、自定方法的义校验方法、校验框架校验方法三种,其中校验框架校验方法又分为两种:校验器优先校验器和字段优先校验器.(没有业务逻辑的校验)

1、通过validate()校验方法进行校验

   我们只写错误的情况,正确的情况我们不做处理。

注意:struts2当输入校验发生错误的时候,struts2会默认转到一个name为input的这样一个<result>,其实就是当输入错误的时候应该,用户应该尝试着再一次提供输入信息,因此转到input页面。

当发生错误时,struts2给出来各种错误级别的提示:

(1) action级别this.addActionError(anErrorMessage)

addActionError(放的是错误的提示信息),它应该是一个集合,每次都忘这个集合中添加错误信息。

     页面使用<s:actionerror/>标签显示错误信息,指如果存在action的错误信息,就把错误信息显示出来。

         <s:actionerror/>标签还有许多的属性,如cssStyle="";定义错误信息的cssStyle,如:cssStyle="color:red";错误信息为红色.

       

  (2) 字段级别this.addFieldError(fieldName, errorMessage)

   addFieldError(字段名, 错误提示信息),它应该是一个Map类型,有name和errorMessage两个参数。

   页面使用<s:fielderror cssStyle="color:blue"></s:fielderror> 标签来显示错误信息。

   注意:当页面使用的是struts2自己的标签库的时候,它能自动显示field级别的错误信息,是struta2标签自带的功能。

     若不需要这样的功能,把theme的值设为simple即可。

(3) ActionSupport类的addActionError方法的实现:首先创建一个ArrayList对象,然后将错误信息添加到该对象中。

(4) 当调用getActionError()方法返回Action级别的错误信息列表时,返回的实际上是集合的一个副本而不是集合本身,因此对集合副本的调用clear()方法清除的依旧是副本中懂得元素而非原集合中的元素,此时原集合中的内容没有受到任何的影响。换句话说,Action级别的错误信息列别对开发者来说是只读的。

(5) FiledError级别的错误信息底层是用LinkHashMap实现的,该Map的key是String类型,value是List<String>类型,这就表示一个FieldName可以对应多条错误信息,这些错误信息都放置在List<String>集合当中。所以在页面中一个字段可能有多个错误信息。

(6) 判断是否有Action级别或者Field级别的错误根据hasActionError和hasFieldError两个方法的返回值,他们的返回值为布尔型,有错误返回true,没错误返回false。

(7) clearActionErrors();清除所有的Action错误

       clearFieldErrors();清除所有的Filed错误

       clearError();相当于上面两个方法的集合

    

例子:如下图,age为int类型。birthday和graate是Date类型

 为什么action级别中会出现age invoked!,birthday invoked!,graate invoked!三个错误信息?

答:因为我们输入的都是字符串,因此在action中找不到对应的参数类型为String的setAge,setBirthday,setGraate方法,因此就不能给这三个成员变量赋值,但是age,birthday,graate在实例化对象时已经有默认的初始化值0,null,null,这样的值均满足if条件判断。

下面的前三个field错误信息是因为我们输入的字符格式错误,它是发生在类型转换阶段,不是发生在输入校验阶段。


知识点:类型转换的错误信息放置到field中。

2、执行流程

  (1)首先进行类型转换

  (2)然后再进行输入校验(执行validate方法)。

  (3)如果上述过程中出现任何错误,都不会再执行execute或自定义方法。会转向struts.xml中对应action中name为input的<result>标签对应的页面。

当field级别错误和action级别错误都没有任何的错误才会执行execute方法。

3、自定义方法的校验方法

   (1) 对于一个自定义的方法来说(如:上面的myExecute()),它的validate()方法在自定义方法之前被调用,即:先进行校验,再执行自定义方法。

   (2) 自定义方法的自定义输入校验方式(action中method所指定的自定义方法)

      public String myExecute() throws Exception{  return SUCCESS;  }  一个自定义方法;

       校验方法的一般格式:public void validateMyExecute(){} 方法名为validate开头,再加上方法的名字,且方法名首字母大写。底层通过反射来实现的。我们称validateMyExecute()为myExecute()的输入校验的方法。

    (3) 当Action中既有自定义方法的校验方法也有validate方法,则先执行自定义方法的校验方法,然后再执行validate方法,若两个校验方法有action或field级别错误,则都不会执行execute或自定义execute方法。

      若把method中自定义方法删掉,则不会执行自定义发的校验方法,而validate方法是会一定会执行的(Action中写了这个方法),因此,validate是用来校验execute方法的。

4、Field级别错误的自定义错误提示

   在Action同级目录下建一个以Action名字命名的properties文件,配置文件名的格式:Action名字.properties

如:RegisterAction.properties

   配置文件内容写法格式:invalid.fieldvalue.字段名=错误提示信息 如:invalid.fieldvalue.age

   其中字段名是Action中的属性名,即当那个属性发生Field错误时所提示的错误信息。

5、Struts2的校验框架(有效的xml文件)

   (1) 校验框架xml文件和被校验的action在同一个包下

   (2) 校验框架xml文件命名格式:Action名字-validation.xml 如:RegisterAction-validation.xml

   (3) 具体来说分为字段优先校验器(field)与校验器优先校验器(validator)

6、字段优先校验器(先有字段再有校验器)

      xwork内置校验器在com.opensympony.xwork2.validator.validators目录下的default.xml文件中。

      有以下几中校验器分类:

      required、requiredstring 、int、long、short、double、date、fieldexpression、expression、email

      url、visitor、conversion、stringlength、regex、conditionalvisitor

   (5) Struts2的校验框架xml文件标签及标签属性分析

     ① <field name=""></field> 校验器类型,name属性值为Action中待校验的属性值(成员变量) 

         如:<field name="username"></field>

     ②<field-validator type=""></field-validator>校验规则或校验器,在<field>里面可以有多个<field-validator>

        如:<field-validator type="requiredstring"></field-validator> 指username只能为字符串,不能为空

            若:type="required"  指除了string之外的其他类型

                type="stringlength"  指字符串的长度

                type="int"   指待检验的值必须为int类型

                type="date"  指定带检验的值为date类型,且<param></param>标签中的字符串值必须写成日期的样                                式,因为<param>标签中我们写的是字符串的日期样式,而在xmwork内部校验器的对应属                              性是Date类型,所以这里用到了类型转换器。

    ③ <message>username</message>当发生错误的时候的提示信息标签

        如:<message>username can't be blank!</message>

        <message>标签属性key  如:<message key="username.invalid"></message>

        注意:这个key变量的值是在配置文件中的,配置文件和Action在同一包下

              书写格式:英文 package_en_US.properties  中文 package_zh_CN.properties

                          package.properties为默认的资源文件,当所要找的资源文件不存在时找默认的资源文件。

           配置文件中的key和message中的key名字必须一样,若不一样,则会把message中的key值作为错误提示信息显            示在页面。

        *. 通过修改浏览器显示语言的首选项来切换浏览器使用什么语言显示页面内容。


     ④ <param name=""></param> <param name=""></param>  是<field-validator>子标签,可选.

       param中的属性名都必须和源代码对应的类中的属性名一致,这样才能正确赋值。

        如:<param name="minLength">4</param>设置字符串最大长度 

            <param name="maxLength">6</param>设置字符串最小长度

            <param name="trim">false</param> 设置是否去掉字符串两边的空格

          拿minLength和maxLength的引用:    

          ${minLength}取得是minLength的值,${maxLength}${minLength}取得是maxLength的值 

          如:<message>username should be between ${minLength} and ${maxLength}!</message> 

7、校验器优先校验器(先有校验器再有字段)

     <validator type="requiredstring">  -->这是一个校验器

     <param name="fieldName">username</param> -->定义待校验的字段名,这里的name值是固定为fieldName

     </validator>

   校验器优先校验器和字段优先校验器可以混合使用.


struts2输入校验总结:struts2框架校验执行的先后顺序:

                      1) 首先进行类型转换(只有类型转换好后才能进行校验)

                      2) 首先执行校验框架的校验方法(xml文件)

                      3) 执行自定义方法的校验方法

                      4) 执行validate()校验方法

      当validate()方法执行完以后,struts2框架才会检查Field级别或者Action级别有没有任何的错误消息,当出现任何一条错误消息的时候,struts2都不会执行自定义的execute方法和execute()方法,进而转向struts.xml中<result>标签中name为input所对应的页面。 

    推荐使用validate()校验方法。                          

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
...结构的施工分包给其他单位那么是不是EPC总承包就不能分包 Win11玩不了地平线4如何解决_Win11玩不了地平线4怎么办 Win11玩不了地平线4如何解决_Win11玩不了地平线4怎么解决 地平线5警告显卡内存过低怎么办 极限竞速地平线5闪退怎么解决 极限竞速地平线5闪退解决方法 怎样册除手机屏幕上(精品游戏)图标 烧结普通砖有哪些 烧结普通砖都有哪些 ...4年后的年龄与弟弟3年前的年龄和是35岁。今年哥与弟各几岁??_百度... ...等于弟弟7年后的年龄,哥哥4年后与弟弟3年前的年龄的和是35岁。哥哥... 无效的 SQL语句 word防止文字被复制怎么设置 已经设置了头文件信息为attachment;filename=,为什么下载的时候还是后缀名.action oracle数据库报错ora-01722:invalid number,请哪位大神帮忙看看啊,很... 天然气热水器常见的故障有哪些,天然气热水器维修方法有哪些? struts2实现登陆程序为什么出现No result defined for action action.Login and result success? java.lang.RuntimeException: Invalid action class configuration that references an unknown class 天然气热水器维修问题,天然热水器保养维护小贴士 solidworks2020安装注册表时出现服务名无效是怎么回事win10系统? 在Oracle12c上添加了Scott用户,但是为什么再次进入的时候却显示invalid username&#47;password;logon denied 家里燃气热水器坏了,售后要拿走修可以吗 java中的java.lang.RuntimeException异常怎么解决? 燃气热水器哪个牌子的售后服务好? &quot;invalid action name&quot; 是什么错了 燃气热水器的三包规定是怎么规定的? 燃气热水器自己安装的售后就不保修了吗 天然气热水器售后还得给路程费?也就是说每次售后我还得给他们90块? 燃气热水器三包规定 老式三角牌燃气热水器打不着火也没有打火声按网友介绍换了垫片后,打火器能打火了,但却打不着明火,如何处理 论文答辩时如何克服紧张? UG二次开发,菜单操作注册无效? JAVA中的SSH中的异常不知道解决~ 心理健康教育的内容包括哪些方面 用ssh框架中的hql语句访问数据库对象名无效 运行页面出现Invalid path /pages/First was requested FusionCharts中遇到了Invalid XML Data的问题 怎样锁定(禁止)别人复制word文档中的内容 php 一个链接之地,...action&#47;paramsname&#47;paramsValue这样的地址报404,加上&#47;之后就能访问,什么原因 如何设置成 word 文档里的文字不可以复制的 struts2中的action方法不进入,因为加入了&lt;interceptor-ref name=&quot;token&quot; &#47;&gt;而引起的。 写的投票表单代码不能提交数据,并且会出现HTTP500错误提示,“无效字符” word文档不让复制不让编辑怎么办 怎么让word里面的文字不能被复制和剪切? word不让粘贴怎么回事 房产证单证和双证有什么区别? 请问如何才能把word文档设为只读,就是打开后里面的文字不能选中复制的... 茶水里的小毛毛对身体有害吗? 买房子单证和双证有什么区别? 竹筒茶上面有白毛是怎么回事? 如何设置word文档允许修改,不允许复制