李顺利
随笔-50  评论-170  文章-0  trackbacks-0

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

 

李顺利

2010928

 

 Googel 标签:  ; ; ; ; ; ; ; ; ; ; ;

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

环境

 Struts 2.1.8.1 + Myeclipse 8.6 + Tomcat 7.0.2

前提

 请大家搭建好Struts2Web项目,这个应该很简单,就不在叙述,本篇文章主要做的是如何显示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标签主要用于辅助测试,它在页面上生成一个超链接,通过该链接可以查看ValueStackStack 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>

效果如下:

clip_image002

clip_image004       第二种方案 修改Template推荐使用

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

clip_image006

 

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

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

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

clip_image008

 

 

 现在Theme已经使用了simple了,那么就知道Struts2为什么会在显示错误信息的时候,加上黑点和换行了,在simple themefielderror.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>,而且现在如果仅是删除这些标签,还是有问题的,出现的页面是:

clip_image010

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

clip_image012

效果如下:

clip_image014

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

这种方案的原理就是使用CSS来修改ulli标签的显示效果,可以尝试一下,我不太推荐。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>

效果如下:

clip_image016

源码下载

顺利提供下载:
名:DisplayErrorInfoForStruts Src And Jars.zip
下载地址:
http://usc.googlecode.com/files/DisplayErrorInfoForStruts%20Src%20And%20Jars.zip
clip_image017

总结和交流

这篇文章也算是对前面Struts2错误信息显示效果的继续学习总结,也谢谢大家的支持。

 

如果有什么建议或意见可以通过Q506817493 Eleeshunli@qq.com MSNlishunli@live.com,大家一起交流学习。顺利也提供源码下载供大家一起学习探讨(见上)

顺利完成于20101016



博客中的一些下载已经放到了百度云了,请根据需要下载。【点我去百度云下载】

最后弱弱地说一下,如果可以的话,转载请提供出处( ),谢谢。
posted on 2010-10-17 22:43 李顺利 阅读(5391) 评论(9)  编辑  收藏

评论:
# re: 如何自定义Struts2表单验证后的错误信息显示格式/样式_第二话 2010-11-15 15:59 | jackluo2008
顶一下  回复  更多评论
  
# re: 如何自定义Struts2表单验证后的错误信息显示格式/样式_第二话 2011-05-20 13:49 | 郑智睿
记得看过你的文章,说实话,你的讲解真的很令我佩服,很多复杂的问题你都能说的简单,比起网站上其他人的说法,你不像他们,别人总是把一些技术深藏起来,而你是真正的专家和好老师。  回复  更多评论
  
# re: 如何自定义Struts2表单验证后的错误信息显示格式/样式_第二话 2011-05-20 16:08 | 李顺利
@郑智睿
谢谢支持,专家和老师,还不敢当,我也只是写写自己的认识.  回复  更多评论
  
# re: 如何自定义Struts2表单验证后的错误信息显示格式/样式_第二话 2012-02-08 11:05 | 李胜东
最近看见前辈的文章和技术讲解,受益匪浅,我的工作经验比较少,在您这学到很多东西,非常感谢。
  回复  更多评论
  
# re: 如何自定义Struts2表单验证后的错误信息显示格式/样式_第二话 2012-02-08 13:31 | 李顺利
@李胜东
谢谢支持  回复  更多评论
  
# re: 如何自定义Struts2表单验证后的错误信息显示格式/样式_第二话 2012-05-11 17:02 | 小兔子
为啥Css不管用啊  回复  更多评论
  
# re: 如何自定义Struts2表单验证后的错误信息显示格式/样式_第二话 2012-05-11 17:03 | 李顺利
@小兔子
变化太多,所以不推荐使用CSS  回复  更多评论
  
# re: 如何自定义Struts2表单验证后的错误信息显示格式/样式_第二话 2012-05-11 17:07 | 小兔子
哦哦哦,好了好了。。。vistor校验器的好像不大行  回复  更多评论
  
# re: 如何自定义Struts2表单验证后的错误信息显示格式/样式_第二话 2014-04-15 11:12 | sailboats
必须为博主点一万个赞,良心出品啊!  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航:
博客园   IT新闻   Chat2DB   C++博客   博问