亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

Struts2講義34

系統(tǒng) 2063 0

8 ? Struts2 輸入校驗(yàn)

1 章記述的類型轉(zhuǎn)換異常處理情況其實(shí)就筆者認(rèn)為也可以算是 Struts2 的輸入校驗(yàn)中的 1 種方式。在記述 Struts2 的核心技術(shù)時(shí)候,筆者也簡單介紹過一些輸入校驗(yàn)的 Struts2 的自帶類和方法。現(xiàn)在在本章重新整理一下,將 Struts2 中的所有輸入校驗(yàn)的使用做個(gè)完整而又詳細(xì)的介紹。

8.1 ? validate 輸入校驗(yàn)方式再談

Web 系統(tǒng)項(xiàng)目中有大量的視圖頁面需要用戶自行輸入很多數(shù)據(jù)。這些數(shù)據(jù)的類型有很多種。為了防止某些客戶的惡意輸入以及對 Web 項(xiàng)目的惡意破壞。必須引入輸入校驗(yàn)像 Windows 操作系統(tǒng)中的防火墻一樣把一些“垃圾”數(shù)據(jù)過濾,擋在 Web 系統(tǒng)之外。

Struts2 的輸入校驗(yàn)是以上一章的類型轉(zhuǎn)換為基礎(chǔ)。而且輸入校驗(yàn)一般和 Web 系統(tǒng)的業(yè)務(wù)邏輯息息相關(guān)。所以在閱讀本章前,筆者建議讀者能仔細(xì)參看類型轉(zhuǎn)換章節(jié)。有了堅(jiān)實(shí)的基礎(chǔ)再來閱讀本章。

在前面的章節(jié)中筆者也對 Struts2 輸入校驗(yàn)中最基本的使用 validate 方式做過簡單介紹,本小節(jié)再次就這一話題進(jìn)行討論。

8.1.1 ? 復(fù)習(xí) validate 方法進(jìn)行輸入校驗(yàn)

技術(shù)要點(diǎn)

本節(jié)代碼就 1 個(gè)簡單的用戶注冊功能具體介紹利用 validate 方法對數(shù)字、字符串、日期等類型數(shù)據(jù)進(jìn)行輸入校驗(yàn)方式介紹。

幾種基本 Java 數(shù)據(jù)類型輸入校驗(yàn)。

針對具體業(yè)務(wù)邏輯進(jìn)行輸入校驗(yàn)。

演示代碼

使用的 Action 文件:

?

Java代碼 復(fù)制代碼
  1. <!------------?文件名:?RegisterAction.java----------------> ??
  2. public ? class ?RegisterAction? extends ?ActionSupport?{ ??
  3. ????????? //?Action?類公用私有變量,用來做頁面導(dǎo)航標(biāo)志 ??
  4. ????????? private ? static ?String?FORWARD?=? null ?; ??
  5. ??
  6. ????????? //?用戶名屬性 ??
  7. ????????? private ?String?username; ??
  8. ……… ??
  9. ????????? //?年齡屬性 ??
  10. ????????? private ? int ?age; ??
  11. ??
  12. ????????? //?取得用戶名值 ??
  13. ????????? public ?String?getUsername()?{ ??
  14. ??????????????????? return ?username; ??
  15. ?????????} ??
  16. ? ??
  17. ????????? //?設(shè)置用戶名值 ??
  18. ????????? public ? void ?setUsername(String?username)?{ ??
  19. ??????????????????? this ?.username?=?username; ??
  20. ?????????} ??
  21. ??
  22. ………………… ??
  23. ??
  24. ????????? //?取得年齡值 ??
  25. ????????? public ? int ?getAge()?{ ??
  26. ??????????????????? return ?age; ??
  27. ?????????} ??
  28. ??
  29. ????????? //?設(shè)置年齡值 ??
  30. ????????? public ? void ?setAge( int ?age)?{ ??
  31. ??????????????????? this ?.age?=?age; ??
  32. ?????????} ??
  33. ??
  34. ????????? //?執(zhí)行注冊方法 ??
  35. ????????? public ?String?execute()? throws ?Exception?{ ??
  36. ???????????????????FORWARD?=? "success" ; ??
  37. ??????????????????? return ?FORWARD?; ??
  38. ?????????} ??
  39. ? ??
  40. ????????? //?校驗(yàn)方法,用來輸入校驗(yàn) ??
  41. ????????? public ? void ?validate()?{ ??
  42. ??????????????????? //?校驗(yàn)是否輸入用戶名 ??
  43. ??????????????????? if ?(getUsername()?==? null ?||?getUsername().trim().equals( "" ))?{??????????????????? ??
  44. ????????????????????????????addFieldError( "username" ,? "?請輸入用戶名?" ); ??
  45. ???????????????????} ??
  46. ??????????????????? //?校驗(yàn)是否輸入生日 ??
  47. ??????????????????? if ?(getBirthday()== null ?){ ??
  48. ????????????????????????????addFieldError( "birthday" ,? "?請輸入生日日期?" ); ??
  49. ???????????????????} else ??
  50. ??????????????????? //?校驗(yàn)是否輸入正確的生日日期 ??
  51. ??????????????????? if ?(getBirthday().after( new ?Date())){ ??
  52. ????????????????????????????addFieldError( "birthday" ,? "?請不要輸入未來日期?" ); ??
  53. ???????????????????} ??
  54. ??????????????????? //?校驗(yàn)是否輸入密碼 ??
  55. ??????????????????? if ?(getPassword()?==? null ?||?getPassword().trim().equals( "" ))?{????????????????????? ??
  56. ????????????????????????????addFieldError( "password" ,? "?請輸入密碼?" ); ??
  57. ???????????????????} ??
  58. ??????????????????? //?校驗(yàn)是否輸入確認(rèn)密碼 ??
  59. ??????????????????? if ?(getRepassword()?==? null ?||?getRepassword().trim().equals( "" ))?{???????????????????? ??
  60. ????????????????????????????addFieldError( "repassword" ,? "?請輸入確認(rèn)密碼?" ); ??
  61. ???????????????????} ??
  62. ??????????????????? //?校驗(yàn)輸入的密碼和確認(rèn)密碼是否一致 ??
  63. ??????????????????? if ?(!getPassword().equals(getRepassword()))?{??????????????????????????? ??
  64. ????????????????????????????addFieldError( "repassword" ,? "?確認(rèn)密碼和密碼輸入不一致?" ); ??
  65. ???????????????????} ??
  66. ??????????????????? //?校驗(yàn)輸入的手機(jī)號碼長度是否正確 ??
  67. ??????????????????? if ?(getMobile().length()!= 11 )?{?????????????????????? ??
  68. ????????????????????????????addFieldError( "mobile" ,? "?請輸入正確的手機(jī)號碼?" ); ??
  69. ???????????????????} ??
  70. ??????????????????? //?校驗(yàn)輸入的年齡是否正確 ??
  71. ??????????????????? if ?(getAge()< 1 ||getAge()> 99 )?{????????????????????? ??
  72. ????????????????????????????addFieldError( "age" ,? "?請輸入您的真實(shí)年齡?" ); ??
  73. ???????????????????}???????????????? ??
  74. ?????????} ??
  75. }???
    <!------------ 文件名: RegisterAction.java---------------->
public class RegisterAction extends ActionSupport {
         // Action 類公用私有變量,用來做頁面導(dǎo)航標(biāo)志
         private static String FORWARD = null ;

         // 用戶名屬性
         private String username;
………
         // 年齡屬性
         private int age;

         // 取得用戶名值
         public String getUsername() {
                   return username;
         }
 
         // 設(shè)置用戶名值
         public void setUsername(String username) {
                   this .username = username;
         }

…………………

         // 取得年齡值
         public int getAge() {
                   return age;
         }

         // 設(shè)置年齡值
         public void setAge(int age) {
                   this .age = age;
         }

         // 執(zhí)行注冊方法
         public String execute() throws Exception {
                   FORWARD = "success";
                   return FORWARD ;
         }
 
         // 校驗(yàn)方法,用來輸入校驗(yàn)
         public void validate() {
                   // 校驗(yàn)是否輸入用戶名
                   if (getUsername() == null || getUsername().trim().equals("")) {                   
                            addFieldError("username", " 請輸入用戶名 ");
                   }
                   // 校驗(yàn)是否輸入生日
                   if (getBirthday()==null ){
                            addFieldError("birthday", " 請輸入生日日期 ");
                   }else
                   // 校驗(yàn)是否輸入正確的生日日期
                   if (getBirthday().after(new Date())){
                            addFieldError("birthday", " 請不要輸入未來日期 ");
                   }
                   // 校驗(yàn)是否輸入密碼
                   if (getPassword() == null || getPassword().trim().equals("")) {                     
                            addFieldError("password", " 請輸入密碼 ");
                   }
                   // 校驗(yàn)是否輸入確認(rèn)密碼
                   if (getRepassword() == null || getRepassword().trim().equals("")) {                    
                            addFieldError("repassword", " 請輸入確認(rèn)密碼 ");
                   }
                   // 校驗(yàn)輸入的密碼和確認(rèn)密碼是否一致
                   if (!getPassword().equals(getRepassword())) {                           
                            addFieldError("repassword", " 確認(rèn)密碼和密碼輸入不一致 ");
                   }
                   // 校驗(yàn)輸入的手機(jī)號碼長度是否正確
                   if (getMobile().length()!=11) {                      
                            addFieldError("mobile", " 請輸入正確的手機(jī)號碼 ");
                   }
                   // 校驗(yàn)輸入的年齡是否正確
                   if (getAge()<1||getAge()>99) {                     
                            addFieldError("age", " 請輸入您的真實(shí)年齡 ");
                   }                
         }
} 
  

配置文件中的導(dǎo)航定義:

Java代碼 復(fù)制代碼
  1. <!--------------?文件名:?struts.xml---------------->? ??
  2. <struts>? ??
  3. ?????????<!--?Action?所在包定義?-->? ??
  4. ?????????< package ?name= "C08.1.1" ? extends = "struts-default" >? ??
  5. ?????????<!--?Action?名字,類以及導(dǎo)航頁面定義?-->? ??
  6. ???????????????????<!--?通過?Action?類處理才導(dǎo)航的的?Action?定義?-->? ??
  7. ???????????????????<action?name= "Register" ? ??
  8. ???????????????????????????? class = "action.RegisterAction" >? ??
  9. ????????????????????????????<result?name= "input" >/jsp/register.jsp</result>? ??
  10. ????????????????????????????<result?name= "success" >/jsp/success.jsp</result>? ??
  11. ???????????????????</action>? ??
  12. ???????????????????<!--?直接導(dǎo)航的的?Action?定義?-->? ??
  13. ???????????????????<action?name= "index" ?>? ??
  14. ????????????????????????????<result?>/jsp/register.jsp</result>???????????????????????? ??
  15. ???????????????????</action>? ??
  16. ?????????</ package >? ??
  17. </struts>???
    <!-------------- 文件名: struts.xml----------------> 
<struts> 
         <!-- Action 所在包定義 --> 
         <package name="C08.1.1" extends="struts-default"> 
         <!-- Action 名字,類以及導(dǎo)航頁面定義 --> 
                   <!-- 通過 Action 類處理才導(dǎo)航的的 Action 定義 --> 
                   <action name="Register" 
                            class="action.RegisterAction"> 
                            <result name="input">/jsp/register.jsp</result> 
                            <result name="success">/jsp/success.jsp</result> 
                   </action> 
                   <!-- 直接導(dǎo)航的的 Action 定義 --> 
                   <action name="index" > 
                            <result >/jsp/register.jsp</result>                        
                   </action> 
         </package> 
</struts> 

  

?

輸入校驗(yàn)的數(shù)據(jù)輸入 JSP 文件:

Java代碼 復(fù)制代碼
  1. <!-------------------?文件名:?register.jsp--------------------->? ??
  2. …………? ??
  3. ??????????????????<!--?用戶信息注冊?form?表單?-->? ??
  4. ?????????<s:form?action= "Register" >? ??
  5. ???????????????????<table?width= "60%" ?height= "76" ?border= "0" >? ??
  6. ?????????????????????????????????????<!--?各標(biāo)簽定義?-->? ??
  7. ?????????????????????????????????????<s:textfield?name= "username" ?label= "?用戶名?" />? ??
  8. ?????????????????????????????????????<s:password?name= "password" ?label= "?密???碼?" ?/>? ??
  9. ?????????????????????????????????????<s:password?name= "repassword" ?label= "?密???碼確認(rèn)?" ?/>? ??
  10. ?????????????????????????????????????<s:textfield?name= "birthday" ?label= "?生日?" />? ??
  11. ?????????????????????????????????????<s:textfield?name= "mobile" ?label= "?手機(jī)號碼?" />? ??
  12. ?????????????????????????????????????<s:textfield?name= "age" ?label= "?年齡?" />? ??
  13. ?????????????????????????????????????<s:submit?value= "?注冊?" ?align= "center" />??????????????????????????????? ??
  14. ???????????????????</table>? ??
  15. ?????????</s:form>???
    <!------------------- 文件名: register.jsp---------------------> 
………… 
                  <!-- 用戶信息注冊 form 表單 --> 
         <s:form action="Register"> 
                   <table width="60%" height="76" border="0"> 
                                     <!-- 各標(biāo)簽定義 --> 
                                     <s:textfield name="username" label=" 用戶名 "/> 
                                     <s:password name="password" label=" 密   碼 " /> 
                                     <s:password name="repassword" label=" 密   碼確認(rèn) " /> 
                                     <s:textfield name="birthday" label=" 生日 "/> 
                                     <s:textfield name="mobile" label=" 手機(jī)號碼 "/> 
                                     <s:textfield name="age" label=" 年齡 "/> 
                                     <s:submit value=" 注冊 " align="center"/>                               
                   </table> 
         </s:form> 

  

?

數(shù)據(jù)不進(jìn)行任何輸入顯示出錯(cuò)信息如圖 8.1

Struts2講義34

8.1 ? 輸入校驗(yàn)發(fā)現(xiàn)數(shù)據(jù)沒有進(jìn)行任何輸入

輸入密碼不一致時(shí)的出錯(cuò)信息顯示如圖 8.2

Struts2講義34

8.2 ? 密碼輸入不一致時(shí)出錯(cuò)信息顯示

代碼解釋

1 Struts2 對輸入校驗(yàn)這方面采用的最基本方法是在每個(gè) Action 里繼承 ActionSupport 類,并且重寫它的輸入校驗(yàn)方法 validate() 。本示例中的 RegisterAction 代碼中也顯示,根據(jù)頁面上輸入的各種校驗(yàn)將所有不符合輸入校驗(yàn)規(guī)則的錯(cuò)誤信息都由 ActionSupport 類中另一個(gè)方法 addFieldError 方法將錯(cuò)誤信息加入到表單錯(cuò)誤信息,并且在輸入數(shù)據(jù)的頁面顯示,而不會(huì)再由 Action 導(dǎo)航到注冊成功頁面。 struts.xml 也定義了 1 個(gè)名字為“ input ”的 result ,它表明將所有輸入失敗的錯(cuò)誤信息導(dǎo)航到一個(gè)特定頁面。本示例中筆者還是將這個(gè)特定頁面定義為數(shù)據(jù)輸入的頁面。

2 )再次閱讀 RegisterAction 代碼,可以發(fā)現(xiàn)在 validate 方法里筆者編寫了很多 if 語句。每一個(gè) if 語句中都針對表單中某一字段進(jìn)行輸入校驗(yàn)。如果發(fā)現(xiàn)不符合輸入校驗(yàn)規(guī)則則都調(diào)用 addFieldError 方法。該方法中有兩個(gè)參數(shù),第 1 個(gè)參數(shù)都是表單中字段名,這里所有的名字都和輸入數(shù)據(jù)的頁面中每一個(gè)字段的 name 屬性中內(nèi)容相同。否則 Struts2 是找不到具體錯(cuò)誤信息是針對哪一個(gè)字段。第 2 個(gè)參數(shù)則是錯(cuò)誤信息的內(nèi)容。這些內(nèi)容就是在輸入校驗(yàn)失敗時(shí)候顯示在之前所說的特定頁面中的。由圖 7.1 和圖 7.2 可以看到這些內(nèi)容在頁面上是如何顯示的。

3 validate 方法中的各個(gè) if 語句判斷了表單中各個(gè)字段的輸入數(shù)據(jù)是否符合輸入校驗(yàn)的規(guī)則,這些規(guī)則也是開發(fā)人員根據(jù)特定業(yè)務(wù)邏輯定義的。比如其中數(shù)據(jù)是否輸入,輸入的生日信息是否在當(dāng)前日期之前等等。這里細(xì)心讀者又可以發(fā)現(xiàn)并沒有對這些字段進(jìn)行類型轉(zhuǎn)換,但在 Action 中某些字段類型都已經(jīng)變成 Java 的一些基本類型。比如生日字段,頁面上輸入時(shí)候是字符串,在 Action 中已經(jīng)變成 Java 中的 Date 類型。因?yàn)橹霸陬愋娃D(zhuǎn)換章節(jié)也已說明:頁面上輸入的數(shù)據(jù)已經(jīng)都由字符串類型轉(zhuǎn)換成 Action 中指定的 Java 類型。因此從這一點(diǎn)更加說明類型轉(zhuǎn)換是輸入校驗(yàn)的基礎(chǔ),也可以說是 1 種特定的輸入校驗(yàn)。

8.1.2 ? validateXXX 方法進(jìn)行輸入校驗(yàn)

技術(shù)要點(diǎn)

本節(jié)代碼也就 1 個(gè)簡單的用戶注冊功能具體介紹利用 validateXXX 方法對 Action 中某一特定的方法進(jìn)行校驗(yàn)。

Action 具體方法的 validateXXX 方法介紹。

演示代碼

使用的 Action 文件:

Java代碼 復(fù)制代碼
  1. <!-----------?文件名:?RegisterAction.java------------------>? ??
  2. public ? class ?RegisterAction? extends ?ActionSupport?{? ??
  3. ????????? //?Action?類公用私有變量,用來做頁面導(dǎo)航標(biāo)志? ??
  4. ????????? private ? static ?String?FORWARD?=? null ?;? ??
  5. ????????? //?用戶名屬性? ??
  6. ????????? private ?String?username;? ??
  7. ………? ??
  8. ????????? //?年齡屬性? ??
  9. ????????? private ? int ?age;? ??
  10. ????????? //?取得用戶名值? ??
  11. ????????? public ?String?getUsername()?{? ??
  12. ??????????????????? return ?username;? ??
  13. ?????????}? ??
  14. ??
  15. ????????? //?設(shè)置用戶名值? ??
  16. ????????? public ? void ?setUsername(String?username)?{? ??
  17. ??????????????????? this ?.username?=?username;? ??
  18. ?????????}? ??
  19. …………………? ??
  20. ????????? //?取得年齡值? ??
  21. ????????? public ? int ?getAge()?{? ??
  22. ??????????????????? return ?age;? ??
  23. ?????????}? ??
  24. ? ??
  25. ????????? //?設(shè)置年齡值? ??
  26. ????????? public ? void ?setAge( int ?age)?{? ??
  27. ??????????????????? this ?.age?=?age;? ??
  28. ?????????}? ??
  29. ? ??
  30. ????????? //?執(zhí)行注冊方法? ??
  31. ????????? public ?String?Register()? throws ?Exception?{? ??
  32. ???????????????????FORWARD?=? "success" ;? ??
  33. ??????????????????? return ?FORWARD?;? ??
  34. ?????????}? ??
  35. ?? ??
  36. ????????? //?校驗(yàn)方法,用來輸入校驗(yàn)? ??
  37. ????????? public ? void ?validateRegister()?{? ??
  38. ??????????????????? //?校驗(yàn)是否輸入用戶名? ??
  39. ?????????????????? if ?(getUsername()?==? null ?||?getUsername().trim().equals( "" ))?{???????????????????? ??
  40. ????????????????????????????addFieldError( "username" ,? "?請輸入用戶名?" );? ??
  41. ???????????????????}? ??
  42. ??????????????????? //?校驗(yàn)是否輸入生日? ??
  43. ??????????????????? if ?(getBirthday()== null ?){? ??
  44. ????????????????????????????addFieldError( "birthday" ,? "?請輸入生日日期?" );? ??
  45. ???????????????????} else ? ??
  46. ??????????????????? //?校驗(yàn)是否輸入正確的生日日期? ??
  47. ??????????????????? if ?(getBirthday().after( new ?Date())){? ??
  48. ????????????????????????????addFieldError( "birthday" ,? "?請不要輸入未來日期?" );? ??
  49. ???????????????????}? ??
  50. ??????????????????? //?校驗(yàn)是否輸入密碼? ??
  51. ??????????????????? if ?(getPassword()?==? null ?||?getPassword().trim().equals( "" ))?{?????????????????????? ??
  52. ????????????????????????????addFieldError( "password" ,? "?請輸入密碼?" );? ??
  53. ???????????????????}? ??
  54. ??????????????????? //?校驗(yàn)是否輸入確認(rèn)密碼? ??
  55. ?????????????????? if ?(getRepassword()?==? null ?||?getRepassword().trim().equals( "" ))?{????????????????????? ??
  56. ????????????????????????????addFieldError( "repassword" ,? "?請輸入確認(rèn)密碼?" );? ??
  57. ???????????????????}? ??
  58. ??????????????????? //?校驗(yàn)輸入的密碼和確認(rèn)密碼是否一致? ??
  59. ??????????????????? if ?(!getPassword().equals(getRepassword()))?{???????????????????????????? ??
  60. ????????????????????????????addFieldError( "repassword" ,? "?確認(rèn)密碼和密碼輸入不一致?" );? ??
  61. ???????????????????}? ??
  62. ??????????????????? //?校驗(yàn)輸入的手機(jī)號碼長度是否正確? ??
  63. ??????????????????? if ?(getMobile().length()!= 11 )?{??????????????????????? ??
  64. ????????????????????????????addFieldError( "mobile" ,? "?請輸入正確的手機(jī)號碼?" );? ??
  65. ???????????????????}? ??
  66. ??????????????????? //?校驗(yàn)輸入的年齡是否正確? ??
  67. ??????????????????? if ?(getAge()< 1 ||getAge()> 99 )?{?????????????????????? ??
  68. ????????????????????????????addFieldError( "age" ,? "?請輸入您的真實(shí)年齡?" );? ??
  69. ???????????????????}????????????????? ??
  70. ????}? ??
  71. }???
    <!----------- 文件名: RegisterAction.java------------------> 
public class RegisterAction extends ActionSupport { 
         // Action 類公用私有變量,用來做頁面導(dǎo)航標(biāo)志 
         private static String FORWARD = null ; 
         // 用戶名屬性 
         private String username; 
……… 
         // 年齡屬性 
         private int age; 
         // 取得用戶名值 
         public String getUsername() { 
                   return username; 
         } 

         // 設(shè)置用戶名值 
         public void setUsername(String username) { 
                   this .username = username; 
         } 
………………… 
         // 取得年齡值 
         public int getAge() { 
                   return age; 
         } 
 
         // 設(shè)置年齡值 
         public void setAge(int age) { 
                   this .age = age; 
         } 
 
         // 執(zhí)行注冊方法 
         public String Register() throws Exception { 
                   FORWARD = "success"; 
                   return FORWARD ; 
         } 
  
         // 校驗(yàn)方法,用來輸入校驗(yàn) 
         public void validateRegister() { 
                   // 校驗(yàn)是否輸入用戶名 
                  if (getUsername() == null || getUsername().trim().equals("")) {                    
                            addFieldError("username", " 請輸入用戶名 "); 
                   } 
                   // 校驗(yàn)是否輸入生日 
                   if (getBirthday()==null ){ 
                            addFieldError("birthday", " 請輸入生日日期 "); 
                   }else 
                   // 校驗(yàn)是否輸入正確的生日日期 
                   if (getBirthday().after(new Date())){ 
                            addFieldError("birthday", " 請不要輸入未來日期 "); 
                   } 
                   // 校驗(yàn)是否輸入密碼 
                   if (getPassword() == null || getPassword().trim().equals("")) {                      
                            addFieldError("password", " 請輸入密碼 "); 
                   } 
                   // 校驗(yàn)是否輸入確認(rèn)密碼 
                  if (getRepassword() == null || getRepassword().trim().equals("")) {                     
                            addFieldError("repassword", " 請輸入確認(rèn)密碼 "); 
                   } 
                   // 校驗(yàn)輸入的密碼和確認(rèn)密碼是否一致 
                   if (!getPassword().equals(getRepassword())) {                            
                            addFieldError("repassword", " 確認(rèn)密碼和密碼輸入不一致 "); 
                   } 
                   // 校驗(yàn)輸入的手機(jī)號碼長度是否正確 
                   if (getMobile().length()!=11) {                       
                            addFieldError("mobile", " 請輸入正確的手機(jī)號碼 "); 
                   } 
                   // 校驗(yàn)輸入的年齡是否正確 
                   if (getAge()<1||getAge()>99) {                      
                            addFieldError("age", " 請輸入您的真實(shí)年齡 "); 
                   }                 
    } 
} 

  

?

配置文件中的導(dǎo)航定義同 8.1.1 。輸入校驗(yàn)的數(shù)據(jù)輸入 JSP 文件同 8.1.1 有一點(diǎn)不同,具體代碼如下:

Java代碼 復(fù)制代碼
  1. <!------------?文件名:?register.jsp---------------->? ??
  2. …………? ??
  3. ????<!--?fielderror?標(biāo)簽顯示所有校驗(yàn)錯(cuò)誤信息?-->? ??
  4. ??????<s:fielderror></s:fielderror>? ??
  5. ?????????<!--?用戶信息注冊?form?表單?-->? ??
  6. ?????????<s:form?action= "Register!Register.action?" >? ??
  7. ???????????????????<table?width= "60%" ?height= "76" ?border= "0" >? ??
  8. ?????????????????????????????????????<!--?各標(biāo)簽定義?-->? ??
  9. ?????????????????????????????????????<s:textfield?name= "username" ?label= "?用戶名?" />? ??
  10. ?????????????????????????????????????<s:password?name= "password" ?label= "?密???碼?" ?/>? ??
  11. ?????????????????????????????????????<s:password?name= "repassword" ?label= "?密???碼確認(rèn)?" ?/>? ??
  12. ?????????????????????????????????????<s:textfield?name= "birthday" ?label= "?生日?" />? ??
  13. ?????????????????????????????????????<s:textfield?name= "mobile" ?label= "?手機(jī)號碼?" />? ??
  14. ?????????????????????????????????????<s:textfield?name= "age" ?label= "?年齡?" />? ??
  15. ?????????????????????????????????????<s:submit?value= "?注冊?" ?align= "center" />??????????????????????????????? ??
  16. ???????????????????</table>? ??
  17. ?????????</s:form>???
    <!------------ 文件名: register.jsp----------------> 
………… 
    <!-- fielderror 標(biāo)簽顯示所有校驗(yàn)錯(cuò)誤信息 --> 
      <s:fielderror></s:fielderror> 
         <!-- 用戶信息注冊 form 表單 --> 
         <s:form action="Register!Register.action "> 
                   <table width="60%" height="76" border="0"> 
                                     <!-- 各標(biāo)簽定義 --> 
                                     <s:textfield name="username" label=" 用戶名 "/> 
                                     <s:password name="password" label=" 密   碼 " /> 
                                     <s:password name="repassword" label=" 密   碼確認(rèn) " /> 
                                     <s:textfield name="birthday" label=" 生日 "/> 
                                     <s:textfield name="mobile" label=" 手機(jī)號碼 "/> 
                                     <s:textfield name="age" label=" 年齡 "/> 
                                     <s:submit value=" 注冊 " align="center"/>                               
                   </table> 
         </s:form> 

  

?

數(shù)據(jù)不進(jìn)行任何輸入顯示出錯(cuò)信息如圖 8.3

Struts2講義34

8.3 ? 輸入校驗(yàn)發(fā)現(xiàn)數(shù)據(jù)沒有進(jìn)行任何輸入

輸入密碼不一致時(shí)的出錯(cuò)信息顯示如圖 8.4

Struts2講義34

8.4 ? 密碼輸入不一致時(shí)出錯(cuò)信息顯示

代碼解釋

1 Struts2 中除了 validate 方法之外它還有 1 validateXXX 方法針對 Action 中某一特定方法進(jìn)行該方法的各種字段的輸入校驗(yàn)。其中 XXX 就是該特定方法名。在本示例中筆者定義了一個(gè) Register 方法,該方法和上一小節(jié)中的 execute 方法類似只是一個(gè)簡單的導(dǎo)航。但是在該 RegisterAction 中就沒有了 validate 方法,取而代之的是 validateRegister 方法。

注意:如果讀者使用 validateRegister 方法,那最好不要再使用 validate 方法。雖然和上一小節(jié)示例代碼比較這兩個(gè)方法里的內(nèi)容是完全一摸一樣的,但是 validate 方法是對所有 Action 中方法的輸入校驗(yàn)都進(jìn)行校驗(yàn), validateRegister 方法只對 Register 方法進(jìn)行校驗(yàn)。因此兩者不能重復(fù)使用,都使用會(huì)造成兩個(gè)方法都進(jìn)行了校驗(yàn)的結(jié)果。執(zhí)行順序是先 validateRegister validate 。如果 validateRegister 方法有特殊的輸入校驗(yàn)則就會(huì)被 validate 方法“覆蓋”,因此達(dá)不到預(yù)期的輸入校驗(yàn)?zāi)康摹M扑]讀者自己進(jìn)行試驗(yàn),在這兩個(gè)方法里設(shè)置斷點(diǎn)運(yùn)行一下就知道了。

2 )請讀者閱讀數(shù)據(jù)輸入的頁面代碼,在代碼中筆者用黑體標(biāo)注的是 1 個(gè)特殊的運(yùn)行 Action 的示例。這里筆者故意把名字都寫為“ Register ”來讓讀者加深理解。首先第 1 個(gè)“ Register ”是 RegisterAction 中的方法名,一定要和方法名寫成一樣。而在“!”后的“ Register ”則是在 struts.xml 配置文件中定義的 RegisterAction 的映射里的“ name ”內(nèi)容。黑體的內(nèi)容表明該表單的 Action 是執(zhí)行 RegisterAction 中的 Register 方法。如果在頁面中直接寫“!”后面的內(nèi)容則表示執(zhí)行的是 RegisterAction 中的 execute 方法。在圖 8.3 瀏覽器中的 URL 筆者也有紅框圈中,表明該表單數(shù)據(jù)輸入完成后提交時(shí)候執(zhí)行的是 Register 方法。這是 Struts2 中一個(gè)特殊的使用方式。如果開發(fā)者以后在使用 Struts2 的開發(fā)工作中根據(jù)特定業(yè)務(wù)邏輯不想執(zhí)行 execute 方法而是執(zhí)行另外一個(gè)開發(fā)完成的方法。則在視圖頁面(包括 velocity freemarker )中可以以這種方式讓表單提交后執(zhí)行該開發(fā)完成的方法。

3 validateRegister 方法中各個(gè) if 語句定義和上一小節(jié)的 validate 方法內(nèi)容相同。這里筆者只是作為示例所以兩個(gè)方法中的內(nèi)容相同,其實(shí)可以和上一小節(jié)中的 validate 方法的內(nèi)容不相同,用來進(jìn)行 Register 方法中特定的表單字段輸入校驗(yàn)。

4 )在數(shù)據(jù)輸入的視圖界面筆者又增加了 Struts2 的標(biāo)簽 fielderror 。圖 8.3 和圖 8.4 也可以看出在具體字段輸入校驗(yàn)出錯(cuò)信息顯示之外。在表單頭部也有出錯(cuò)信息顯示。這其實(shí)和 Struts2 的校驗(yàn)順序有關(guān)。

在之前說明 validateRegister 方法和 validate 方法時(shí)候也記述了兩者的執(zhí)行校驗(yàn)順序是先 validateRegister validate 。其實(shí)在視圖界面進(jìn)行表單提交后。輸入校驗(yàn)順序是以如下的順序:

l ???????? 查找 Action 中是否有 validateXXX 方法。如果有則執(zhí)行該方法。將校驗(yàn)產(chǎn)生的錯(cuò)誤信息放置到 ActionContext 對象中。

l ???????? 查找 Action 中是否有 validate 方法。如果有則執(zhí)行該方法。將校驗(yàn)產(chǎn)生的錯(cuò)誤信息放置到 ActionContext 對象中。

l ???????? 查找視圖界面是否有 fielderror 標(biāo)簽定義。如果有則返回到 result 為“ input ”的視圖。同時(shí) ActionContext 對象中有關(guān)的輸入校驗(yàn)的錯(cuò)誤信息也顯示在該視圖中。

Struts2 的輸入校驗(yàn)順序就是按照如上說明來先后執(zhí)行的,這也更好的說明了 validateRegister 方法和 validate 方法并存在 Action 時(shí)候輸入校驗(yàn)是如何進(jìn)行的。這也是圖 8.3 和圖 8.4 會(huì)產(chǎn)生錯(cuò)誤信息顯示兩遍現(xiàn)象的原因。

Struts2講義34


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會(huì)非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 精品中文字幕乱码一区二区 | 欧美日韩国产另类一区二区三区 | 天天射天天射天天射 | 97福利| 久久久久国产 | 特级一级毛片 | 永久黄网站色视频免费 | 国产做国产爱免费视频 | 亚洲国产中文字幕在线观看 | 日日干天天草 | 国产福利一区二区在线精品 | 九九精品久久久久久久久 | 男人私人影院 | 久久免费观看爱情动作片 | 91精品成人福利在线播放 | 欧美极品福利视频在线播放 | 国产成人香蕉 | 精品伊人久久久 | 久久久久久国产精品免费免 | 77777奇米| 久久精彩 | 国产极品粉嫩福利在线观看 | 久草在线国产视频 | 狠狠色伊人亚洲综合第8页 狠狠色综合久久丁香婷婷 狠狠色综合久久婷婷 | 久久综合99 | 大香伊人久久 | 亚洲一区小说区中文字幕 | 99精品国产在这里白浆 | 一级毛片在线播放 | 免费国产成人午夜在线观看 | 99爱视频免费高清在线观看 | 国内精品久久久久影 | 国产精品18久久久久久久久久 | 草久视频 | 久久伊人色综合 | 色丁香在线观看 | 国产精品免费福利 | 欧美日韩一区二区三区麻豆 | 国产激情对白一区二区三区四 | 天天操天天射天天爽 | 国产区亚洲区 |