怎么自定义Struts2表单验证后的异常信息显示格式

如何自定义Struts2表单验证后的错误信息显示格式

如何自定义 Struts2 表单验证后的错误信息显示格式 / 样式 _ 第二话

 

李顺利

2010 9 28

 

  前面写过 如何自定义 Struts2 表单验证后的错误信息显示格式 / 样式 ,文章,收到了几位好友的一些意见和支持感到很开心,现在网上类似问题的解决文章已经很多了,今天在这里,也仅是整理和学习,其中也算有一种新的方法来分享给大家。(Struts2 显示错误的时候出现黑点和换行问题)

环境

  Struts 2.1.8.1 + Myeclipse 8.6 + Tomcat 7.0.2

前提

  请大家搭建好 Struts2 Web 项目,这个应该很简单,就不在叙述,本篇文章主要做的是如何显示 Struts 的错误信息,那么这里就建立一个 Action 类,来模拟产生的错误。请看下面的 Action 类。(源码会在后面提供)

public class DisplayErrorInfoAction extends ActionSupport

{

    private static final long serialVersionUID = -2690064846056775963L;

 

    @Override

    public String execute() throws Exception

    {

       /**

         * 添加一些 FieldError 供测试,如果需要请自写 validater 方法

         */

       this .addFieldError( "displayErrorInfo" , "error!Please check it." );

       this .addFieldError( "user.username" , " 名字有错误啦 " );

       return INPUT ;

    }

}

方案

第一种方案:使用 OGNL 拿值栈( ValueStack )的内容 (重点 推荐使用

主要是通过 OGNL 来取得 Value Stack errors fieldErrors 的值。这里先来介绍下 s:debug 的标签。

debug 标签主要用于辅助测试,它在页面上生成一个超链接,通过该链接可以查看 ValueStack Stack Context 中的所有值信息。可以通过 OGNL s:property 来取得相应的值(顺利提醒: s:debug 使用请放在 s:form 外面,放在里面有什么效果,请大家试试就知道了)。附上本案例使用的代码。

注:请大家关注下error code 包含‘.’(类似于 user.username )的取值方法:

< s:property  value ="errors['user.username'][0]"  /> 和  < s:property  value ="fieldErrors['user.username'][0]"  />

(网上“struts2 property标签的 value属性 ” 的解决方案)


    < body >

       < s:form action = "displayErrorInfo" method = "post" theme = "simple" >

           < h1 align = "center" style = "color: blue" >

              DisplayErrorInfoForStruts2Demo1( 使用 OGNL 拿值栈的内容,推荐使用 )

           </ h1 >

           < h2 dir = "rtl" >

              顺利整理

           </ h2 >< hr >< hr >

           1.1.All ErrorInfos(Map): &nbsp; < s:property value = "errors" />< br >

           1.2.All fieldErrorsInfos(Map): &nbsp; < s:property value = "fieldErrors" />< br >

           < hr >

           2.1.DisplayErrorInfo in errors(errors.displayErrorInfo[0]): < s:textfield />

           < font color = "red" >

              < s:property value = "errors.displayErrorInfo[0]" />

           </ font >< br >

           2.2.DisplayErrorInfo in errors(errors['displayErrorInfo'][0]): < s:textfield />

           < font color = "red" >

              < s:property value = "errors['displayErrorInfo'][0]" />

           </ font >

           < br >

              &nbsp;&nbsp; < font color = "green" > 注:拿到值后,就可以按照自己的格式进行自定义显示了 </ font >

           < br >

           2.3.DisplayErrorInfo in errors( 一般不会使用到 [1], 这里仅是测试 ): < s:textfield />

           < font color = "red" >

              < s:property value = "errors.displayErrorInfo[1]" />

           </ font >

           < br >

           < hr >

           3.1.DisplayErrorInfo in fieldErrors(fieldErrors.displayErrorInfo[0]): < s:textfield />

           < font color = "red" >

              < s:property value = "fieldErrors.displayErrorInfo[0]" />

           </ font >

           < br >

           3.2.DisplayErrorInfo in fieldErrors(fieldErrors['displayErrorInfo'][0]): < s:textfield />

           < font color = "red" >

              < s:property value = "fieldErrors['displayErrorInfo'][0]" />

           </ font >

           < br >

              &nbsp;&nbsp; < font color = "green" > 注:建议使用 fieldErrors 取值,在 Action 中使用的是 this.addFieldError </ font >

           < br >

           < hr >

           4.0.DisplayErrorInfo - user.username( 正确的表达式 .errors['user.username'][0]): < s:textfield />

           < font color = "red" >

              < s:property value = "errors['user.username'][0]" />

           </ font >

           < br >

           4.1.DisplayErrorInfo - user.username( 正确的表达式 .fieldErrors['user.username'][0]): < s:textfield />

           < font color = "red" >

              < s:property value = "fieldErrors['user.username'][0]" />

           </ font >

           < br >

           < font color = "blue" >

              4.2.DisplayErrorInfo - user.username( 错误的表达式 1.errors.%{user.username}[0]): < s:textfield />

              < font color = "red" >

                  < s:property value = "errors.%{user.username}[0]" />

              </ font >

              < br > 4.3.DisplayErrorInfo - user.username( 错误的表达式 2.errors.# {user.username}[0]): < s:textfield />

               这种方法本身语言就有问题,详情请看 JSP 规范对 # 的规范

              < br > 4.4.DisplayErrorInfo - user.username( 错误的表达式 3.%{errors.user.username}[0]): < s:textfield />

              < font color = "red" >

                  < s:property value = "%{errors.user.username}[0]" />

              </ font >

              < br > 4.5.DisplayErrorInfo - user.username( 错误的表达式 4.errors.user.username): < s:textfield />

              < font color = "red" >

                  < s:property value = "errors.user.username" />

              </ font >

           < br >

           </ font >

       </ s:form >

       < hr >

       < s:debug />

    </ body >

效果如下:

怎么自定义Struts2表单验证后的异常信息显示格式

怎么自定义Struts2表单验证后的异常信息显示格式         第二种方案 修改 Template 推荐使用

  修改 Struts Template 首先要知道 Struts2 UI Theme 的概念,在 Struts2 中有四种 Theme( 也就是有四种 Template) ,分别是 archive css_xhtml simple xhtml ,可以通过解压 Struts-core Jar 包来查看这四种 Theme Template

怎么自定义Struts2表单验证后的异常信息显示格式

 

Struts2 使用的默认 Template xhtml, 但是这根本不能满足需要,一般我们都会改用 simple Template ,会使用类似下面的语句,切换到 simple template

< s:form action = " XXX " method = "post" theme = "simple" > 或者在 Struts.xml 加上 < constant name = "struts.ui.theme" value = "simple" ></ constant > (使用了 constant 这个就不需要在使用前面)

是如何知道 xhtml struts2 默认 template 的,这可以看看 Struts-core.jar 下面的 org.apache.struts2 package 下的 default.properties 文件里关于 struts.ui.theme 的配置。

怎么自定义Struts2表单验证后的异常信息显示格式

 

 

  现在 Theme 已经使用了 simple 了,那么就知道 Struts2 为什么会在显示错误信息的时候,加上黑点和换行了,在 simple theme fielderror.ftl(struts2-core-2.1.8.1\template\simple ) 文件里定义了, fielderror 的显示 template ,其中加了 <ul></ul><li></li> 标签 ,那么我们删除它们并把修改后的 ftl 放到工程目录 src\template\simple 下就可以了。

具体的如何修改 template 请看 如何自定义 Struts2 表单验证后的错误信息显示格式 / 样式

在这里提醒一下大家,

一、使用这种方案的使用,请一定要切换到 simple 主题下。

二、在 struts2-core-2.1 以前只是使用了 <ul></ul><li></li>, 但是在 struts2-core-2.1 以后比如 struts2-core-2.1.8.1 相应的文件中是 <ul<#rt/> ..> (不是 <ul>, 还有注意最后的一个匹配的 ">" </ul><li></li> ,而且现在如果仅是删除这些标签,还是有问题的,出现的页面是:

怎么自定义Struts2表单验证后的异常信息显示格式

所以,彻底地修改是(红色方框内内容全部删除)

怎么自定义Struts2表单验证后的异常信息显示格式

效果如下:

怎么自定义Struts2表单验证后的异常信息显示格式

第三种方案 使用 CSS 修改显示效果 喜欢 CSS 的还是可以使用的,不过我不推荐

这种方案的原理就是使用 CSS 来修改 ul li 标签的显示效果,可以尝试一下,我不太推荐。 CSS 如下:

       < STYLE type = "text/css" >

           .formFieldError {

              color : #FF3300 ;

           }

          

           .formFieldError ul {

              list-style-type : none ;

              display : inline ;

              margin : 0px ;

              padding : 3px ;

           }

          

           .formFieldError ul li {

              list-style-type : none ;

              display : inline ;

           }

       </ STYLE >

 

       < span class = "formFieldError" > </span>

效果如下:

怎么自定义Struts2表单验证后的异常信息显示格式