The NoteBook of EricKong

            BlogJava :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
            611 Posts :: 1 Stories :: 190 Comments :: 0 Trackbacks

          前面一段時(shí)間學(xué)過(guò)一些Struts2的知識(shí),感覺(jué)Struts2和1.x還是有很大的差別的,我還不好說(shuō)1.x肯定會(huì)過(guò)時(shí)還是2.0會(huì)很快流行,這畢竟是需要作為導(dǎo)向的。

              在Struts2中驗(yàn)證真的比較容易,可以在Action中直接寫validate,也可以使用validate框架進(jìn)行驗(yàn)證,這個(gè)我覺(jué)得比Struts1.x方便了很多,但是有個(gè)問(wèn)題一直困擾了我,直到現(xiàn)在有個(gè)小程序要用到這個(gè)方面的知識(shí),那就是驗(yàn)證后如何很好地人性化地在jsp頁(yè)面中顯示了。

              大家都知道,Struts2顯示驗(yàn)證結(jié)果有一些方式,一般通過(guò)兩種方式,介紹如下:

          1. 在頁(yè)面的上面或者某個(gè)位置全部顯示錯(cuò)誤

          代碼:<s:fielderror cssStyle="color: red"></s:fielderror>

          這樣會(huì)顯示所有的錯(cuò)誤信息,模擬效果如下:

          clip_image002

          2.在每個(gè)字段下面或上面顯示,通過(guò)

          <s:fielderror cssStyle="color: red">

                        <s:param>XXX(標(biāo)簽的name屬性,象user.username</s:param>

                     </s:fielderror>

          例:        &nbsp;&nbsp;名:

                     <input type="text" name="user.username" />

                     <s:fielderror cssStyle="color: red">

                        <s:param>user.username</s:param>

                     </s:fielderror>顯示效果如下:

          clip_image004clip_image006

              上面的差不多是Struts默認(rèn)顯示的兩種方式,但是我們常見(jiàn)的顯示方式并不是這樣的,所有我們需要自定義這種格式,我們的習(xí)慣是把錯(cuò)誤信息顯示在某個(gè)出錯(cuò)字段的后面,一行顯示,而它給了一個(gè)小黑點(diǎn)并且換了行,我們現(xiàn)在就來(lái)解決這個(gè)問(wèn)題。

              這個(gè)問(wèn)題困擾了我很久,真的很久以前想過(guò),但是沒(méi)有徹底地解決,一直留到現(xiàn)在,今天在google上搜了很久,終于給解決了,現(xiàn)在分享一下解決的途徑。

              先提供網(wǎng)上的思路給大家(關(guān)鍵解決的思路)

          1.     struts2表單驗(yàn)證_錯(cuò)誤信息的顯示問(wèn)題 中提到

          引用 10 樓 starwar2030 的回復(fù):

          可以在CSS中定義
          .formFieldError {
          font-family: verdana, arial, helvetica, sans-serif;
          font-size: 12px;
          color: #FF3300;
          vertical-align: bottom;
          }

          .formFieldError ul{
              margin: 0px;
              padding: 3px;
              vertical-align: middle;
          }
          而后使用類似用
          <td class="formFieldError"> <s:fielderror> <s:param value="%{'userRecord.…

          不需要那么復(fù)雜的,你將struts-core*中的template解出來(lái),然后你把它放到項(xiàng)目的WEB-INF下,在struts.properties中添加代碼
          struts.ui.theme=simple
          struts.ui.templateDir=WEB-INF/template
          然后修改下simple下的fielderror.ftl文件,將該文件中的 <li>和 </li>刪除;

          或者完全拷貝simple的內(nèi)容定義一個(gè)自己的UI;
          比如將simple拷貝一份命名為default,同樣修改fielderror.ftl,在新建一個(gè)文件為theme.properties,添加內(nèi)容parent = simple

          再修改struts.properties的struts.ui.theme=default;這樣每個(gè)文件的theme就不要指定了

           

          發(fā)表于:2008-08-04 09:47:3114樓 得分:0

          建議需要定義樣式的同志看下自定義theme 這章的內(nèi)容

          還有 theme="simple" 是放在form標(biāo)簽內(nèi)的

           

          2. struts2 的 fielderror 樣式問(wèn)題 中提到

          可以改一下STRUTS2的錯(cuò)誤信息模板.

          fielderror.ftl 這個(gè)里面可以改它的樣式

           

          3. Struts2 模板 中提到

          先前有網(wǎng)友問(wèn)過(guò)我,他用了 Struts2 的校驗(yàn),但是錯(cuò)誤輸出是在輸入框的上方,但希望錯(cuò)誤信息是顯示在輸入框的右方,該如何做。當(dāng)時(shí)我只告訴了他要修改模板文件,也只是大概告訴了他是在某個(gè) template 目錄下的一個(gè) ftl 文件,因那時(shí)具體操作自己也不太清楚。現(xiàn)在知道了線索,但實(shí)際修改還是很麻煩的。
              輸入框 <s:textfield .../> 默認(rèn)是用的 xhtml/text.flt 模板,text.ftl 包裝了 smple/text.ftl,錯(cuò)誤信息可以追溯發(fā)現(xiàn)是在 controlheader-core.ftl 中定義顯示的,所以你可以把 xthml/text.ftl controlheader-core.ftl 拷到 WEB-INF/classes/template/xhtml 目錄中進(jìn)行修改,WEB-INF/classes/template/xhtml 中的模板文件是優(yōu)先于 struts2-core-2.x.x.jar 里的 template/xhtml 目錄中的模板文件加載

           

          這是我整理出來(lái)的一些思路,但是看到這些的時(shí)候,特別是第三條Struts2模板的時(shí)候,感覺(jué)自己有點(diǎn)思路了,后面就是一步一步地進(jìn)行,發(fā)現(xiàn)還真的解決了。這個(gè)時(shí)候也希望能夠看看上面的文章。現(xiàn)提供我解決自定義錯(cuò)誤顯示方式的步驟。

          1. 找到你的struts2-core-2.XXX.jar這個(gè)核心包,用軟件解壓;

          2. 在\struts2-core-2. XXX\template\simple目錄下找到fielderror.ftl(跟我們自定義格式非常有關(guān)系的文件);

          3. 根據(jù)Struts2模板中提到的,把上面的fielderror.ftl放到WEB-INF/classes/template/simple目錄下,這個(gè)我當(dāng)時(shí)以為就在WEB-INF下新建一個(gè)classes的文件夾,后來(lái)提示已經(jīng)存在,想想整個(gè)工程的結(jié)構(gòu)發(fā)現(xiàn),classes是放Java編譯后的文件的,所有,這個(gè)時(shí)候的操作是在Src目錄下新建一個(gè)template的文件夾,再在里面新建一個(gè)simple的文件夾(template/simple)(一定要注意建文件夾的步驟,是分兩個(gè)文件夾建而不是建一個(gè)文件夾template.simple),把fielderror.ftl放到里面,目錄結(jié)構(gòu)如下:

          clip_image008

          4. 修改fielderror.ftl配置文件,這一步才是關(guān)鍵,如何修改了,實(shí)際上也很簡(jiǎn)單,就是把<ul></ul><li></li>標(biāo)簽刪除(僅僅是刪除標(biāo)簽而不刪除標(biāo)簽里面的內(nèi)容),簡(jiǎn)便的方法就是用記事本打開(kāi)這個(gè)文件并用空格替換上面的每個(gè)標(biāo)簽(一個(gè)一個(gè)來(lái)哦)。后面我會(huì)提供我已經(jīng)修改后的這個(gè)文件,如果大家不想修改的話就直接把我修改后的文件放到上面的目錄即可。

          5. 上面一步就是把錯(cuò)誤信息顯示前面的小黑點(diǎn)和換行都去掉了,是個(gè)關(guān)鍵步驟了,后面就來(lái)顯示了,還是用上面的方式

          <s:fielderror cssStyle="color: red">

                        <s:param>XXX(標(biāo)簽的name屬性,象user.username</s:param>

                  </s:fielderror>

          要不要加theme="simple"大家看著辦,反正我是沒(méi)加,也是可以的,還有,這個(gè)時(shí)候,你就可以通過(guò)css來(lái)定義一下錯(cuò)誤信息顯示的字體啊,顏色啊等,這里不再敘述。

          6. 整個(gè)步驟的原理就是Struts會(huì)加載一些配置文件,如果我們的classess里面沒(méi)有的話會(huì)找到j(luò)ar包里面的,如果有的話優(yōu)先使用配置文件。我們這里的就是用我們修改的fielderror.ftl配置文件來(lái)覆蓋jar包里面的文件。

          7. 來(lái)看看我們修改后的自定義顯示錯(cuò)誤信息吧,截圖如下:

          clip_image010

          clip_image012

           

          是不是很舒服哦。有什么問(wèn)題和好的方法的話,非常歡迎聯(lián)系木子(QQ:5068今天在這里,也僅是整理和學(xué)習(xí),其中也算有一種新的方法來(lái)分享給大家。(Struts2 顯示錯(cuò)誤的時(shí)候出現(xiàn)黑點(diǎn)和換行問(wèn)題)

          環(huán)境

           Struts 2.1.8.1 + Myeclipse 8.6 + Tomcat 7.0.2

          前提

           請(qǐng)大家搭建好Struts2Web項(xiàng)目,這個(gè)應(yīng)該很簡(jiǎn)單,就不在敘述,本篇文章主要做的是如何顯示Struts的錯(cuò)誤信息,那么這里就建立一個(gè)Action類,來(lái)模擬產(chǎn)生的錯(cuò)誤。請(qǐng)看下面的Action類。(源碼會(huì)在后面提供)

          public class DisplayErrorInfoAction extends ActionSupport

          {

              private static final long serialVersionUID = -2690064846056775963L;

           

              @Override

              public String execute() throws Exception

              {

                 /**

                  * 添加一些FieldError供測(cè)試,如果需要請(qǐng)自寫validater方法

                  */

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

                 this.addFieldError("user.username", "名字有錯(cuò)誤啦");

                 return INPUT;

              }

          }

          方案

          第一種方案:使用OGNL拿值棧(ValueStack)的內(nèi)容(重點(diǎn)推薦使用

          主要是通過(guò)OGNL來(lái)取得Value Stack errors fieldErrors的值。這里先來(lái)介紹下s:debug 的標(biāo)簽。

          debug標(biāo)簽主要用于輔助測(cè)試,它在頁(yè)面上生成一個(gè)超鏈接,通過(guò)該鏈接可以查看ValueStackStack Context 中的所有值信息。可以通過(guò)OGNL s:property來(lái)取得相應(yīng)的值(順利提醒: s:debug 使用請(qǐng)放在 s:form外面,放在里面有什么效果,請(qǐng)大家試試就知道了)。附上本案例使用的代碼。

          注:請(qǐng)大家關(guān)注下error code 包含‘.’(類似于user.username)的取值方法:

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

          (網(wǎng)上“struts2 property標(biāo)簽的 value屬性” 的解決方案)


              <body>

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

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

                        DisplayErrorInfoForStruts2Demo1(使用OGNL拿值棧的內(nèi)容,推薦使用)

                     </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">注:拿到值后,就可以按照自己的格式進(jìn)行自定義顯示了</font>

                     <br>

                     2.3.DisplayErrorInfo in errors(一般不會(huì)使用到[1],這里僅是測(cè)試):<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(正確的表達(dá)式.errors['user.username'][0]):<s:textfield />

                     <font color="red">

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

                     </font>

                     <br>

                     4.1.DisplayErrorInfo - user.username(正確的表達(dá)式.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(錯(cuò)誤的表達(dá)式1.errors.%{user.username}[0]):<s:textfield />

                        <font color="red">

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

                        </font>

                        <br> 4.3.DisplayErrorInfo - user.username(錯(cuò)誤的表達(dá)式2.errors.# {user.username}[0]):<s:textfield />

                         這種方法本身語(yǔ)言就有問(wèn)題,詳情請(qǐng)看JSP規(guī)范對(duì)# 的規(guī)范

                        <br> 4.4.DisplayErrorInfo - user.username(錯(cuò)誤的表達(dá)式3.%{errors.user.username}[0]):<s:textfield />

                        <font color="red">

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

                        </font>

                        <br> 4.5.DisplayErrorInfo - user.username(錯(cuò)誤的表達(dá)式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,可以通過(guò)解壓Struts-core Jar包來(lái)查看這四種ThemeTemplate

          clip_image006

           

          Struts2使用的默認(rèn)Templatexhtml,但是這根本不能滿足需要,一般我們都會(huì)改用simpleTemplate,會(huì)使用類似下面的語(yǔ)句,切換到simpletemplate

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

          是如何知道xhtmlstruts2默認(rèn)template的,這可以看看Struts-core.jar 下面的org.apache.struts2 package下的default.properties文件里關(guān)于struts.ui.theme的配置。

          clip_image008

           

           

           現(xiàn)在Theme已經(jīng)使用了simple了,那么就知道Struts2為什么會(huì)在顯示錯(cuò)誤信息的時(shí)候,加上黑點(diǎn)和換行了,在simple themefielderror.ftl(struts2-core-2.1.8.1\template\simple) 文件里定義了,fielderror的顯示template,其中加了<ul></ul><li></li>標(biāo)簽 ,那么我們刪除它們并把修改后的ftl放到工程目錄src\template\simple 下就可以了。

          具體的如何修改template請(qǐng)看如何自定義Struts2表單驗(yàn)證后的錯(cuò)誤信息顯示格式/樣式

          在這里提醒一下大家,

          一、使用這種方案的使用,請(qǐng)一定要切換到simple主題下。

          二、在struts2-core-2.1以前只是使用了<ul></ul><li></li>,但是在struts2-core-2.1以后比如struts2-core-2.1.8.1相應(yīng)的文件中是<ul<#rt/> ..>(不是<ul>,還有注意最后的一個(gè)匹配的">"</ul><li></li>,而且現(xiàn)在如果僅是刪除這些標(biāo)簽,還是有問(wèn)題的,出現(xiàn)的頁(yè)面是:

          clip_image010

          所以,徹底地修改是(紅色方框內(nèi)內(nèi)容全部刪除)

          clip_image012

          效果如下:

          clip_image014

          第三種方案 使用CSS修改顯示效果喜歡CSS的還是可以使用的,不過(guò)我不推薦

          這種方案的原理就是使用CSS來(lái)修改ulli標(biāo)簽的顯示效果,可以嘗試一下,我不太推薦。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

          總結(jié)和交流

          這篇文章也算是對(duì)前面Struts2錯(cuò)誤信息顯示效果的繼續(xù)學(xué)習(xí)總結(jié),也謝謝大家的支持。

           

          如果有什么建議或意見(jiàn)可以通過(guò)Q506817493 Eleeshunli@qq.com MSNlishunli@live.com,大家一起交流學(xué)習(xí)。順利也提供源碼下載供大家一起學(xué)習(xí)探討(見(jiàn)上)

           



           

          posted on 2012-08-28 22:17 Eric_jiang 閱讀(5269) 評(píng)論(2)  編輯  收藏 所屬分類: struts2

          Feedback

          # re: 如何自定義Struts2表單驗(yàn)證后的錯(cuò)誤信息顯示格式/樣式[未登錄](méi) 2013-07-16 22:45 aa
          很詳細(xì)  回復(fù)  更多評(píng)論
            

          # re: 如阿斯頓發(fā)送到何自定義Struts2表單驗(yàn)證后的錯(cuò)誤信息顯示格式/樣式 2013-08-23 17:12 阿斯頓發(fā)送到發(fā)送到
          阿斯頓發(fā)水電費(fèi)撒旦發(fā)  回復(fù)  更多評(píng)論
            

          主站蜘蛛池模板: 福贡县| 乃东县| 凯里市| 福建省| 永和县| 临泽县| 辽中县| 夏河县| 黑河市| 汝南县| 同德县| 凤城市| 潍坊市| 益阳市| 吉木萨尔县| 翁牛特旗| 宁远县| 兴仁县| 锦屏县| 林周县| 芦山县| 汶上县| 文登市| 博爱县| 湘西| 宣武区| 钦州市| 武汉市| 宁波市| 邯郸市| 民和| 宜昌市| 来安县| 南开区| 邹城市| 新疆| 湄潭县| 江华| 淮安市| 磐安县| 汕头市|