怎么自定义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): < s:property value = "errors" />< br > 1.2.All fieldErrorsInfos(Map): < 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 > < 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 > < 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 > |
效果如下:
第二种方案 修改 Template ( 推荐使用 )
修改 Struts 的 Template 首先要知道 Struts2 的 UI Theme 的概念,在 Struts2 中有四种 Theme( 也就是有四种 Template) ,分别是 archive 、 css_xhtml 、 simple 、 xhtml ,可以通过解压 Struts-core 的 Jar 包来查看这四种 Theme 的 Template 。
而 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 的配置。
现在 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> ,而且现在如果仅是删除这些标签,还是有问题的,出现的页面是:
所以,彻底地修改是(红色方框内内容全部删除)
效果如下:
第三种方案 使用 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> |
效果如下: