如何自定義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 E[email protected] MSN[email protected],大家一起交流學習。順利也提供源碼下載供大家一起學習探討(見上)

 

轉載於( http://www.blogjava.net/lishunli/archive/2010/10/17/335384.html)
發佈了22 篇原創文章 · 獲贊 12 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章