validate使用

之前在項目中對於表單字段的驗證,基本都是在action具體方法中,也沒有用到struts的validate,如今進入新公司了,我感受有必要梳理一下前的作法。
這兩天稍有空隙,對struts的驗證框架使用進行了一些嘗試總結,隨後也打算對struts框架的各個方面都作一次比較詳盡的開發級別的總結,方便未來的查看,避免因遺忘而致使的重複無謂的學習,網上有不少這方面資料,但我感受,只有本身總結提煉出來的,纔會理解深入...


struts的驗證能夠有兩種實現方式:
1.利用action名-validate.xml配置的方式。
2.在具體action中重寫validate()方法。
首先看第一種(配置文件)代碼示例:
jsp代碼
 javascript

Html代碼 複製代碼 收藏代碼
  1. <%@ page language="java" contentType="text/html; charset=utf-8"
  2. pageEncoding="utf-8"%>
  3. <%@ taglib prefix="s" uri="/struts-tags" %>
  4. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  5. <html>
  6. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  7. <title>配置文件的錯誤驗證處理</title>
  8. <s:head/>
  9. <body>
  10. <s:form action="validate.action" validate="true">
  11. <s:textfield name="realName" /><s:fielderror fieldName="realName" /><!--令fieldName爲響應的textfield名字,則能夠單獨分開顯示各屬性的驗證結果,而不是把全部的驗證結果都展現出來--><br/>
  12.  
  13. <s:textfield name="phone" ></s:textfield><s:fielderror fieldName="phone" /><br/>
  14. <s:submit/>
  15. </s:form>
  16. </body>
  17. </html>

validate.jsp

action代碼:
 html

Java代碼 複製代碼 收藏代碼
  1. package com;
  2. import com.opensymphony.xwork2.ActionSupport;
  3. public class ValidateTestAction extends ActionSupport {
  4.  
  5. private String realName;
  6. private String phone;
  7. public String getRealName() {
  8. return realName;
  9. }
  10.  
  11. public void setRealName(String realName) {
  12. this.realName = realName;
  13. }
  14.  
  15. public String getPhone() {
  16. return phone;
  17. }
  18.  
  19. public void setPhone(String phone) {
  20. this.phone = phone;
  21. }
  22.  
  23. public String toValidate() {
  24.  
  25. return SUCCESS;
  26. }
  27.  
  28. public String doValidate() {
  29. System.out.println("realName:" + realName + "\tphone:" + phone);
  30.  
  31. return SUCCESS;
  32. }
  33.  
  34. }

ValidateTestAction.java

struts.xml配置:
 java

Xml代碼 複製代碼 收藏代碼
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE struts PUBLIC
  3. "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN"
  4. "http://struts.apache.org/dtds/struts-2.1.dtd">
  5. <struts>
  6. <constant name="struts.ui.theme" value="simple" /> <!-- 配置不要自動生成table元素 -->
  7. <package name="abc" extends="struts-default" >
  8. <!-- struts校驗框架測試類 -->
  9. <action name="validate" class="com.ValidateTestAction">
  10. <result name="input">/validate.jsp</result><!--使用驗證框架則必須配置input -->
  11. </action>
  12. </package>
  13. </struts>

struts.xml

驗證框架的配置(action類名+validate-xml的文件,放置於com包中,struts2會自動找到它)
 express

Xml代碼 複製代碼 收藏代碼
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd" >
  3. <validators >
  4. <field name ="realName" >
  5. <field-validator type ="requiredstring" > <!--requiredstring驗證非空,驗證順序爲自上而下,即同一個字段的多種提示信息不會同時展現於頁面 -->
  6. <message>真實姓名不能爲空 </message>
  7. </field-validator >
  8. <field-validator type="stringlength"> <!--stringlength驗證字符串長度 -->
  9. <param name="maxLength">10</param>
  10. <message>
  11. 姓名必須在10字之內
  12. </message>
  13. </field-validator>
  14. </field>
  15. <field name ="phone" >
  16. <field-validator type ="requiredstring" >
  17. <message>手機號碼不能爲空 </message>
  18. </field-validator >
  19. </field>
  20. </validators>

ValidateTestAction-validation.xml

<!--在struts2中已經實現了不少經常使用驗證,能夠根據須要選用:
 apache

Xml代碼 複製代碼 收藏代碼
  1. < validators >
  2. < validator name ="required" class ="com.opensymphony.xwork2.validator.validators.RequiredFieldValidator" />
  3. < validator name ="requiredstring" class ="com.opensymphony.xwork2.validator.validators.RequiredStringValidator" /> 非空
  4. < validator name ="int" class ="com.opensymphony.xwork2.validator.validators.IntRangeFieldValidator" /> 輸入爲int
  5. < validator name ="double" class ="com.opensymphony.xwork2.validator.validators.DoubleRangeFieldValidator" /> 輸入爲double
  6. < validator name ="date" class ="com.opensymphony.xwork2.validator.validators.DateRangeFieldValidator" /> 輸入爲date
  7. < validator name ="expression" class ="com.opensymphony.xwork2.validator.validators.ExpressionValidator" />
  8. < validator name ="fieldexpression" class ="com.opensymphony.xwork2.validator.validators.FieldExpressionValidator" />
  9. < validator name ="email" class ="com.opensymphony.xwork2.validator.validators.EmailValidator" />
  10. < validator name ="url" class ="com.opensymphony.xwork2.validator.validators.URLValidator" />
  11. < validator name ="visitor" class ="com.opensymphony.xwork2.validator.validators.VisitorFieldValidator" />
  12. < validator name ="conversion" class ="com.opensymphony.xwork2.validator.validators.ConversionErrorFieldValidator" />
  13. < validator name ="stringlength" class ="com.opensymphony.xwork2.validator.validators.StringLengthFieldValidator" /> 字符串長度
  14. < validator name ="regex" class ="com.opensymphony.xwork2.validator.validators.RegexFieldValidator" />
  15. </validators >
  16. -->



再看一下重寫validate方法的代碼實現
先區分一下幾個不一樣的概念:
this.addFieldError("key",message);
一旦不爲空將會跳轉到input,用<s:fielderror/>標籤顯示.能夠指定fieldname(集合中得key)屬性來達到分開顯示指定的驗證信息。

this.addActionError("");
一旦不爲空將會跳轉到input,用<s:actionerror/>標籤顯示.

this.addActionMessage("");
這個只是一個提示信息,在下文頁面中用<s:actionmessage/>展現集合中得所有message。

jsp代碼:
 框架

Html代碼 複製代碼 收藏代碼
  1. <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
  2. <%@ taglib prefix="s" uri="/struts-tags" %>
  3. <html>
  4. <head>
  5. <title>驗證數據</title>
  6. </head>
  7.  
  8. <body>
  9. <s:actionerror/>
  10. <s:form action="overVali!doOverValidate.action">
  11. hello:<s:textfield name="msg"/>
  12. <s:fielderror name="msg" fieldName="msgMsg"/>
  13. <br/>
  14. phone : <s:textfield name="phone" />
  15. <s:fielderror name="phone" fieldName="phoneMsg" /><br/>
  16. <s:submit/>
  17. </s:form>
  18. </body>
  19. </html>

overwritevalidate.jsp

java代碼
 jsp

Java代碼 複製代碼 收藏代碼
  1. package com;
  2.  
  3. import com.opensymphony.xwork2.ActionSupport;
  4.  
  5. public class OvenWriteValidateAction extends ActionSupport {
  6.  
  7. private String msg;
  8. private String phone;
  9.  
  10. public String getPhone() {
  11. return phone;
  12. }
  13.  
  14. public void setPhone(String phone) {
  15. this.phone = phone;
  16. }
  17.  
  18. public String getMsg() {
  19. return msg;
  20. }
  21.  
  22. public void setMsg(String msg) {
  23. this.msg = msg;
  24. }
  25.  
  26. /**
  27. * 這樣作存在一個問題,即凡是進入該action類的請求都將強制驗證。
  28. */
  29. public void validate() {
  30.  
  31. if (msg==null||"".equals(msg)) {
  32. System.out.println(INPUT);
  33. this.addFieldError("msgMsg", "必須輸入msg!");
  34.  
  35. this.addActionError("處理動做失敗!");
  36. }
  37.  
  38. if(phone==null||"".equals(phone)){
  39. this.addFieldError("phoneMsg", "必須輸入手機號!");
  40. }
  41. else {
  42. this.addActionMessage("提交成功");
  43. }
  44. /**
  45. *
  46. *
  47. * 你們從上面的代碼能夠看出,Field錯誤須要一個key(通常用來表示是哪個屬性出的錯誤)
  48. * 而Action錯誤和Action消息只要提供一個信息字符串就能夠了。
  49.  
  50. */
  51. }
  52.  
  53. public String test() {
  54.  
  55. return SUCCESS;
  56. }
  57.  
  58. public String doOverValidate() {
  59.  
  60. return SUCCESS;
  61. }
  62. }

OvenWriteValidateAction.java

struts.xml配置
 ide

Xml代碼 複製代碼 收藏代碼
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE struts PUBLIC
  3. "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN"
  4. "http://struts.apache.org/dtds/struts-2.1.dtd">
  5. <struts>
  6. <constant name="struts.ui.theme" value="simple" /> <!-- 配置不要自動生成table元素 -->
  7. <package name="abc" extends="struts-default" >
  8. <global-results>
  9. <result name="success">/success.jsp</result>
  10. </global-results>
  11.  
  12. <!-- struts校驗框架測試類 -->
  13. <action name="overVali" class="com.OvenWriteValidateAction">
  14. <result name="input">/overwritevalidate.jsp</result><!--使用驗證框架則必須配置input -->
  15. </action>
  16.  
  17. </package>
  18. </struts>

struts.xml

目前我有疑問的地方但願與有經驗的朋友交流一下:
1.一旦作了validate的驗證。
那麼因此流經這個action類的請求都將經歷一次驗證,而實際上在一個action類中我只有一個方法須要驗證,這就增添了麻煩。
2.利用上文中的第一種方式實現,導致每次進入action以前又多讀取一個xml文檔,這樣會不會致使效率的下降,若是有影響,那麼程度如何。學習

相關文章
相關標籤/搜索