隨筆-34  評(píng)論-1965  文章-0  trackbacks-0
          All Input Is Evil!
          -Writing secure code

          在寫前幾篇文章的時(shí)候,有些朋友建議我的寫一篇關(guān)于表單數(shù)據(jù)校驗(yàn)的文章。 正如文章的開頭所引用的《Writing Secure Code》的名言:“所有的輸入都是罪惡的”,所以我們應(yīng)該對(duì)所有的外部輸入進(jìn)行校驗(yàn)。而表單是應(yīng)用程序最簡單的入口,對(duì)其傳進(jìn)來的數(shù)據(jù),我們必須進(jìn)行校驗(yàn)。

          轉(zhuǎn)換與校驗(yàn)(Conversion & Validation)

          其實(shí)上篇文章,我本來是打算寫表單數(shù)據(jù)校驗(yàn)的內(nèi)容,但是經(jīng)過再三思考后,還是決定先寫Struts 2.0轉(zhuǎn)換器的內(nèi)容。原因是我認(rèn)為轉(zhuǎn)換是校驗(yàn)的基礎(chǔ),只有在數(shù)據(jù)被正確地轉(zhuǎn)換成其對(duì)應(yīng)的類型后,我們才可以對(duì)其取值范圍進(jìn)行校驗(yàn)。看個(gè)例子相信大家可以更清楚。現(xiàn)在我們就來改造一下《轉(zhuǎn)換器(Converter)——Struts 2.0中的魔術(shù)師》的第一個(gè)例子。

          首先,從Action開始,修改后的代碼如下:

          package tutorial;

          import java.util.Locale;

          import com.opensymphony.xwork2.ActionSupport;
          import com.opensymphony.xwork2.util.LocalizedTextUtil;

          public class HelloWorld extends ActionSupport {
          ? ?
          private String msg;
          ? ?
          private Locale loc = Locale.US;
          ? ?
          ? ?
          public String getMsg() {
          ? ? ? ?
          return msg; ? ? ? ?
          ? ?}

          ? ?
          ? ?
          public Locale getLoc() {
          ? ? ? ?
          return loc;
          ? ?}

          ? ?
          ? ?
          public void setLoc(Locale loc) {
          ? ? ? ?
          this .loc = loc;
          ? ?}

          ? ?
          ? ?@Override
          ? ?
          public void validate() {
          ? ? ? ?System.out.println(
          " Calling validate() " );
          ? ? ? ?
          if ( ! (loc.equals(Locale.US) || loc.equals(Locale.CHINA))) {
          ? ? ? ? ? ? ? ? ? ?addFieldError(
          " loc " , getText( " validation.loc " ));
          ? ? ? ?}

          ? ?}

          ? ? ? ?
          ? ?
          public void validateExecute() {
          ? ? ? ?System.out.println(
          " Calling validateExecute() by reflection " );
          ? ?}

          ? ?
          ? ?@Override
          ? ?
          public String execute() {
          ? ? ? ?System.out.println(
          " Calling execute() " );
          ? ? ? ?
          // LocalizedTextUtil是Struts 2.0中國際化的工具類,<s:text>標(biāo)志就是通過調(diào)用它實(shí)現(xiàn)國際化的
          ?? ?? ? ? ?msg = LocalizedTextUtil.findDefaultText( " HelloWorld " , loc);
          ? ? ? ?
          return SUCCESS;
          ? ?}

          }

          然后,修改Struts.xml中Action的定義指明輸入地址:

          < action name ="HelloWorld" class ="tutorial.HelloWorld" >
          ? ?
          < result > /HelloWorld.jsp </ result >
          ? ?
          < result name ="input" > /HelloWorld.jsp </ result >
          </ action >

          接著,在HelloWorld.jsp中加入錯(cuò)誤提示:

          <% @ page ?contentType = " text/html; charset=UTF-8 " %>
          <% @taglib prefix = " s " uri = " /struts-tags " %>
          < html >
          < head >
          ? ?
          < title > Hello World </ title >
          </ head >
          < body >
          ? ?
          < div style ="color:red;" >
          ? ? ? ?
          < s:fielderror />
          ? ?
          </ div >
          ? ?
          < s:form action ="HelloWorld" theme ="simple" > ? ? ? ? ? ?
          ? ? ? ? Locale:
          < s:textfield name ="loc" /> &nbsp; < s:submit />
          ? ?
          </ s:form > ? ?
          ? ?
          < h2 >< s:property value ="msg" /></ h2 >
          </ body >
          </ html >

          再修改LocaleConverter.java文件,將內(nèi)容改為:

          package tutorial;

          import java.util.Locale;
          import java.util.Map;
          import java.util.regex.Pattern;

          public class LocaleConverter extends ognl.DefaultTypeConverter {
          ? ?@Override
          ? ?
          public Object convertValue(Map context, Object value, Class toType) {
          ? ? ? ?
          if (toType == Locale. class ) { ? ? ? ? ? ?
          ? ? ? ? ? ?System.out.println(
          " Converting String to Locale " );
          ? ? ? ? ? ?String locale
          = ((String[]) value)[ 0 ];
          ? ? ? ? ? ?
          return new Locale(locale.substring( 0 , 2 ), locale.substring( 3 ));
          ? ? ? ?}
          else if (toType == String. class ) {
          ? ? ? ? ? ?System.out.println(
          " Converting Locale to String " );
          ? ? ? ? ? ?Locale locale
          = (Locale) value;
          ? ? ? ? ? ?
          return locale.toString();
          ? ? ? ?}

          ? ? ? ?
          return null ;
          ? ?}

          }

          之后,修改國際化資源文件,內(nèi)容為:

          HelloWorld = 你好,世界!
          invalid.fieldvalue.loc
          = Locale必須為\ " xx_XX\ " 的格式
          validation.loc
          = 區(qū)域必須為中國或美國
          globalMessages_zh_CN.properties

          HelloWorld = Hello World!
          invalid.fieldvalue.loc
          = Locale must like \ " xx_XX\ "
          validation.loc
          = Locale must be China or USA
          globalMessages_en_US.properties

          發(fā)布運(yùn)行應(yīng)用程序,在瀏覽器中鍵入http://localhost:8080/Struts2_Validation/HelloWorld.action,在Locale中輸入zh_CN,按“Submit”提交,效果如上篇文章所示。而在服務(wù)器控制臺(tái)有如下輸出:

          Converting String to Locale...
          Calling validateExecute() by reflection...
          Calling validate()...
          Calling execute()...
          Converting Locale to String...

          上述的輸出說明了Struts 2.0的數(shù)據(jù)校驗(yàn)工作方式,它需要經(jīng)過下面幾個(gè)步驟:

          1. 通過轉(zhuǎn)換器將請(qǐng)求參數(shù)轉(zhuǎn)換成相應(yīng)的Bean屬性;
          2. 判斷轉(zhuǎn)換過程是否出現(xiàn)異常。如果有,則將其保存到ActionContext中,conversionError攔截器再封裝為fieldError;如果沒有,進(jìn)行下一步;
          3. 通過反射(Reflection)來調(diào)用validateXxx()方法(其中,Xxx表示Action的方法名);
          4. 調(diào)用validate()方法;
          5. 如果經(jīng)過上述步驟沒有出現(xiàn)fieldError,則調(diào)用Action方法;如果有,則會(huì)跳過Action方法,通過國際化將fieldError輸出到頁面。

          不喜歡看文字的朋友,可以參考下面的圖1。

          圖1 校驗(yàn)順序圖
          圖1 校驗(yàn)順序圖

          看到這里可能大家會(huì)疑問:“這么多地方可以校驗(yàn)表單數(shù)據(jù),到底我應(yīng)該在那里做呢?”有選擇是好事,但抉擇的過程往往是痛苦的,往往讓人不知所措。如果大家參照以下幾點(diǎn)建議,相信會(huì)比較容易地做出正確的抉擇。

          1. 如果需要轉(zhuǎn)換的數(shù)據(jù),通常做法在轉(zhuǎn)換的時(shí)候做格式的校驗(yàn),在Action中的校驗(yàn)方法中校驗(yàn)取值。假如用戶填錯(cuò)了格式,我們可以通過在資源文件配置invalid.fieldvalue.xxx(xxx為屬性名)來提示用戶正確的格式,不同的階段出錯(cuò)顯示不同的信息。具體做法請(qǐng)參考上面的例子;
          2. 至于用validate()還是validateXxx(),我推薦使用validate()。原因是validateXxx()使用了反射,相對(duì)來說性能稍差,而validate()則是通過接口com.opensymphony.xwork2.Validateable調(diào)用。當(dāng)然如果你的表單數(shù)據(jù)取值是取決于特定Action方法,則應(yīng)該使用validateXxx()。

          在運(yùn)行上面的例子時(shí),在Locale中輸入zh并提交時(shí)出現(xiàn)圖2所示頁面。

          圖2 錯(cuò)誤格式
          圖2 錯(cuò)誤格式

          在Locale中輸入de_DE時(shí),出現(xiàn)如圖3所示頁面。

          圖3 取值錯(cuò)誤
          圖3 取值錯(cuò)誤

          使用Struts 2.0的校驗(yàn)框架

          上一節(jié)的內(nèi)容都是關(guān)于如何編程實(shí)現(xiàn)校驗(yàn),這部分工作大都是單調(diào)的重復(fù)。更多情況下,我們使用Struts 2.0的校驗(yàn)框架,通過配置實(shí)現(xiàn)一些常見的校驗(yàn)。

          我學(xué)習(xí)編程有個(gè)習(xí)慣——喜歡先看輸出結(jié)果,再看代碼實(shí)現(xiàn)。這樣學(xué)的好處是先看結(jié)果可以刺激學(xué)習(xí)的激情,也可以在看代碼前自已思考一下如何實(shí)現(xiàn),然后帶著問題去看代碼,那就清晰多了。因此下面我們先來做演示。

          首先,在tutorial包下新建ValidationAction.java,代碼如下:

          package tutorial;

          import com.opensymphony.xwork2.ActionSupport;

          public class ValidationAction extends ActionSupport {
          ? ?
          private String reqiuredString;

          ? ?
          public String getReqiuredString() {
          ? ? ? ?
          return reqiuredString;
          ? ?}


          ? ?
          public void setReqiuredString(String reqiuredString) {
          ? ? ? ?
          this .reqiuredString = reqiuredString;
          ? ?}

          ? ?
          ? ?@Override
          ? ?
          public String execute() {
          ? ? ? ?
          return SUCCESS;
          ? ?}
          ? ?
          }

          然后,配置上述所建的Ation,代碼片段如下:

          < action name ="ValidationAction" class ="tutorial.ValidationAction" >
          ? ?
          < result > /Output.jsp </ result >
          ? ?
          < result name ="input" > /Input.jsp </ result >
          </ action >

          接著,創(chuàng)建Input.jsp和Output.jsp,內(nèi)容分別如下:

          <% @ page ?contentType = " text/html; charset=UTF-8 " %>
          <% @taglib prefix = " s " uri = " /struts-tags " %>
          < html >
          < head >
          ? ?
          < title > Hello World </ title >
          ? ?
          <!-- 此標(biāo)志的作用是引入Struts 2.0的常用的Javascript和CSS -->
          ? ?
          < s:head />
          </ head >
          < body >
          ? ?
          < s:form action ="ValidationAction" > ? ? ? ? ? ?
          ? ? ? ?
          < s:textfield name ="reqiuredString" label ="Required String" />
          ? ? ? ?
          < s:submit />
          ? ?
          </ s:form > ? ?
          </ body >
          </ html >
          Input.jsp

          <% @ page ?contentType = " text/html; charset=UTF-8 " %>
          <% @taglib prefix = " s " uri = " /struts-tags " %>
          < html >
          < head >
          ? ?
          < title > Hello World </ title >
          </ head >
          < body >
          ? ? Required String:
          < s:property value ="reqiuredString" /> ? ?
          </ body >
          </ html >
          Output.jsp

          再接下來,在tutorial包下創(chuàng)建ValidationAction的校驗(yàn)配置文件Xxx-validation.xml(Xxx為Action的類名),在本例中該文件名ValidationAction-validation.xml,內(nèi)容如下:

          <? xml version="1.0" encoding="UTF-8" ?>
          <! DOCTYPE validators PUBLIC?
          ? ? ? ? ? "-//OpenSymphony Group//XWork Validator 1.0//EN"?
          ? ? ? ? ? "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd"
          > ? ? ? ? ?
          < validators >
          ? ?
          < field name ="reqiuredString" >
          ? ? ? ?
          < field-validator type ="requiredstring" >
          ? ? ? ? ? ?
          < message > This string is required </ message >
          ? ? ? ?
          </ field-validator >
          ? ?
          </ field >
          </ validators >

          發(fā)布運(yùn)行應(yīng)用程序,在地址欄中鍵入http://localhost:8080/Struts2_Validation/Input.jsp,出現(xiàn)如圖4所示頁面。

          圖4 Input.jsp
          圖4 Input.jsp

          直接點(diǎn)擊“Submit”提交表單,出現(xiàn)圖5所示的頁面。

          圖5 錯(cuò)誤提示
          圖5 錯(cuò)誤提示

          在Required String中隨便填點(diǎn)東西,轉(zhuǎn)到Output.jsp頁面,如圖6所示。

          圖6 Output.jsp
          圖6 Output.jsp

          通過上面的例子,大家可以看到使用該校驗(yàn)框架十分簡單方便。不過,上例還有兩點(diǎn)不足:

          1. 還沒有國際化錯(cuò)誤消息;
          2. 沒有實(shí)現(xiàn)客戶端的校驗(yàn)。

          當(dāng)然,要完善以上不足,對(duì)于Struts 2.0來說,只是小菜一碟。

          1. 在Xxx-validation.xml文件中的<message>元素中加入key屬性;
          2. 在Input.jsp中的<s:form>標(biāo)志中加入validate="true"屬性,就可以在用Javascript在客戶端校驗(yàn)數(shù)據(jù)。

          下面是具體的實(shí)現(xiàn),首先在國際化資源文件中加入錯(cuò)誤消息,然后按照上面說明實(shí)現(xiàn)。因?yàn)橐褂肑avascript在客戶端顯示出錯(cuò)信息,所以在加載Input.jsp頁面時(shí),Struts 2.0需要獲得國際化的字符串,故我們需要使用Action來訪問Input.jsp頁面,具體實(shí)現(xiàn)請(qǐng)參考《在Struts 2.0中國際化(i18n)您的應(yīng)用程序》的最后部分。最后發(fā)布運(yùn)行應(yīng)用程序,直接在頁面中點(diǎn)擊“Submit”,表單沒有被提交并出現(xiàn)錯(cuò)誤提示,如圖7所示:

          圖7 客戶端校驗(yàn)
          圖7 客戶端校驗(yàn)

          校驗(yàn)框架是通過validation攔截器實(shí)現(xiàn),該攔載被注冊(cè)到默認(rèn)的攔截器鏈中。它在conversionError攔截器之后,在validateXxx()之前被調(diào)用。這里又出現(xiàn)了一個(gè)選擇的問題:到底是應(yīng)該在action中通過validateXxx()或validate()實(shí)現(xiàn)校驗(yàn),還是使用validation攔截器?絕大多數(shù)情況,我建議大家使用校驗(yàn)框架,只有當(dāng)框架滿足不了您的要求才自已編寫代碼實(shí)現(xiàn)。

          配置文件查找順序

          在上面的例子中,我們通過創(chuàng)建ValidationAction-validation.xml來配置表單校驗(yàn)。Struts 2.0的校驗(yàn)框架自動(dòng)會(huì)讀取該文件,但這樣就會(huì)引出一個(gè)問題——如果我的Action繼承其它的Action類,而這兩個(gè)Action類都需要對(duì)表單數(shù)據(jù)進(jìn)行校驗(yàn),那我是否會(huì)在子類的配置文件(Xxx-validation.xml)中復(fù)制父類的配置嗎?

          答案是不,因?yàn)镾truts 2.0的校驗(yàn)框架跟《在Struts 2.0中國際化(i18n)您的應(yīng)用程序》提到的“資源文件查找順序”相似,有特定的配置文件查找順序。不同的是校驗(yàn)框架按照自上而下的順序在類層次查找配置文件。假設(shè)以下條件成立:

          1. 接口 Animal;
          2. 接口 Quadraped 擴(kuò)展了 Animal;
          3. 類 AnimalImpl 實(shí)現(xiàn)了 Animal;
          4. 類 QuadrapedImpl 擴(kuò)展了 AnimalImpl 實(shí)現(xiàn)了 Quadraped;
          5. 類 Dog 擴(kuò)展了 QuadrapedImpl;

          如果Dog要被校驗(yàn),框架方法會(huì)查找下面的配置文件(其中別名是Action在struts.xml中定義的別名):

          1. Animal-validation.xml
          2. Animal-別名-validation.xml
          3. AnimalImpl-validation.xml
          4. AnimalImpl-別名-validation.xml
          5. Quadraped-validation.xml
          6. Quadraped-別名-validation.xml
          7. QuadrapedImpl-validation.xml
          8. QuadrapedImpl-別名-validation.xml
          9. Dog-validation.xml
          10. Dog-別名-validation.xml

          已有的校驗(yàn)器

          Struts 2.0已經(jīng)為您實(shí)現(xiàn)很多常用的校驗(yàn)了,以下在jar的default.xml中的注冊(cè)的校驗(yàn)器。

          < validators >
          ? ?
          < validator name ="required" class ="com.opensymphony.xwork2.validator.validators.RequiredFieldValidator" />
          ? ?
          < validator name ="requiredstring" class ="com.opensymphony.xwork2.validator.validators.RequiredStringValidator" />
          ? ?
          < validator name ="int" class ="com.opensymphony.xwork2.validator.validators.IntRangeFieldValidator" />
          ? ?
          < validator name ="double" class ="com.opensymphony.xwork2.validator.validators.DoubleRangeFieldValidator" />
          ? ?
          < validator name ="date" class ="com.opensymphony.xwork2.validator.validators.DateRangeFieldValidator" />
          ? ?
          < validator name ="expression" class ="com.opensymphony.xwork2.validator.validators.ExpressionValidator" />
          ? ?
          < validator name ="fieldexpression" class ="com.opensymphony.xwork2.validator.validators.FieldExpressionValidator" />
          ? ?
          < validator name ="email" class ="com.opensymphony.xwork2.validator.validators.EmailValidator" />
          ? ?
          < validator name ="url" class ="com.opensymphony.xwork2.validator.validators.URLValidator" />
          ? ?
          < validator name ="visitor" class ="com.opensymphony.xwork2.validator.validators.VisitorFieldValidator" />
          ? ?
          < validator name ="conversion" class ="com.opensymphony.xwork2.validator.validators.ConversionErrorFieldValidator" />
          ? ?
          < validator name ="stringlength" class ="com.opensymphony.xwork2.validator.validators.StringLengthFieldValidator" />
          ? ?
          < validator name ="regex" class ="com.opensymphony.xwork2.validator.validators.RegexFieldValidator" />
          </ validators >
          關(guān)于每個(gè)校驗(yàn)器的具體用法,請(qǐng)參考以下鏈接:
          http://wiki.javascud.org/display/ww2cndoc/Validation
          該鏈接中還有一些很有的信息,請(qǐng)大家仔細(xì)閱讀。

          總結(jié)

          使用校驗(yàn)框架既可以方便地實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn),又能夠?qū)⑿r?yàn)與Action分離,故我們應(yīng)該盡可能使用校驗(yàn)框架。在使用校驗(yàn)框架時(shí),請(qǐng)不要忘記通過在資源文件加入invalid.fieldvalue.xxx字符串,顯示適合的類型轉(zhuǎn)換出錯(cuò)信息;或者使用conversion校驗(yàn)器。

          posted on 2006-11-14 13:38 Max 閱讀(51499) 評(píng)論(118)  編輯  收藏 所屬分類: Struts 2.0系列
          評(píng)論共2頁: 1 2 下一頁 

          評(píng)論:
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation)[未登錄] 2007-04-19 17:42 | test
          請(qǐng)問這個(gè)是什么問題?  回復(fù)  更多評(píng)論
            
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation) 2007-04-19 23:12 | Max
          @huhuyeah
          你是不是設(shè)了<s:form />標(biāo)志的theme屬性?
          正常情況下,生成的Javascript代碼應(yīng)該在</form>之后,如:
          <script type="text/javascript">
          function validateForm_Xxx() {
          ...
          }
          </script>  回復(fù)  更多評(píng)論
            
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation) 2007-04-20 09:41 | huhuyeah
          @Max
          是的,我把struts.ui.theme設(shè)置成simple了
          這樣校驗(yàn)就不起作用了。把simple去掉就起作用了
          但是這樣的話會(huì)自動(dòng)生產(chǎn)一些表格。
          能不能表格由我自己定制,而校驗(yàn)依然能使用的方法?
          另外自動(dòng)生產(chǎn)的JS也不是很好,總是提示objectError,然后顯示錯(cuò)誤標(biāo)簽
          我是希望提示的時(shí)候就把錯(cuò)誤的信息直接alert出來
          這種能不能通過設(shè)置解決,謝謝  回復(fù)  更多評(píng)論
            
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation) 2007-04-20 12:02 | mm
          這里的文章很好耶!  回復(fù)  更多評(píng)論
            
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation)[未登錄] 2007-04-20 15:11 | Leo
          你好,有個(gè)問題請(qǐng)教一下,已經(jīng)發(fā)到你的郵箱里了,有時(shí)間時(shí)請(qǐng)幫忙解答一下,謝謝!  回復(fù)  更多評(píng)論
            
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation) 2007-04-23 15:46 | mm
          如何進(jìn)行客戶端校驗(yàn)?是自己寫javascript代碼,還是配置Xxx-Validation.xml文件來實(shí)現(xiàn)?我想用我自己的javascript代碼,怎么用呢?  回復(fù)  更多評(píng)論
            
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation) 2007-04-24 13:53 | jiajia
          我的LoginAction里面有兩個(gè)方法:init,login。如果我要讓init方法執(zhí)行時(shí)不驗(yàn)證,logic方法執(zhí)行時(shí)做驗(yàn)證,該怎么配置,
          我的LoginAction-validation.xml的內(nèi)容是:
          <validators>
          <field name="userId">
          <field-validator type="requiredstring">
          <message key="required"/>
          </field-validator>
          </field>
          </validators>
          struts.xml的內(nèi)容是:
          <package name="loginAction" extends="struts-default">
          <action name="login" class="login.LoginAction">
          <result name="sussessInit">/WEB-INF/jsp/login.jsp</result>
          <result name="sussessLogin">/WEB-INF/jsp/main.jsp</result>
          <result name="input">/WEB-INF/jsp/login.jsp</result>
          </action>
          </package>
          請(qǐng)賜教  回復(fù)  更多評(píng)論
            
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation) 2007-04-25 09:40 | huhuyeah
          @mm
          兩種都可以。
          如果用自己的js,在form的onsumbit時(shí)候里面調(diào)用自己的js就可以了
          也可以在提交按鈕里面onclick調(diào)用自己的校驗(yàn)js再forms[0].submit()來提交表單  回復(fù)  更多評(píng)論
            
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation) 2007-04-25 09:47 | Max
          @mm
          建議使用Struts 2的validation框架。  回復(fù)  更多評(píng)論
            
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation) 2007-04-25 09:49 | Max
          最簡單的方法就是將你的LoginAction-validation.xml文件改名為“LoginAction-login-validation.xml”。這樣validation的配置只對(duì)login起作用。  回復(fù)  更多評(píng)論
            
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation) 2007-04-25 13:42 | ddd
          使用JS的話, 也有他的好處, 減少和Server間的通信,

          Server端校驗(yàn)的話, 用Struts準(zhǔn)備的也可以。。

          不過,偶以前做的項(xiàng)目,都是自己寫校驗(yàn)的類。。。

          幾乎沒用過validation  回復(fù)  更多評(píng)論
            
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation) 2007-04-26 14:42 | jiajia
          文章中的驗(yàn)證是用xwork提供的方法,action方法要繼承ActionSupport,如果不用xwork提供的驗(yàn)證,使用Struts 2的validation框架驗(yàn)證,驗(yàn)證走DWRValidator類提供的方法,應(yīng)該怎么辦?  回復(fù)  更多評(píng)論
            
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation) 2007-04-26 15:01 | ddd
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation) 2007-06-03 22:45 | jezz
          在第一個(gè)例子有點(diǎn)小問題
          validation.loc = 區(qū)域必須為中國或美國
          這個(gè)我顯示出錯(cuò),沒有顯示出錯(cuò)信息,直接把validate.loc顯示出來了!
          后來我把
          validate.loc = 區(qū)域必須為中國或美國
          就可以顯示了!

          我直接在關(guān)注你的文章!
          已經(jīng)加了你的gtalk很少看到你!  回復(fù)  更多評(píng)論
            
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation) 2007-06-04 23:26 | Max
          @jezz
          對(duì)不起,最近比較忙一點(diǎn)。  回復(fù)  更多評(píng)論
            
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation)[未登錄] 2007-06-07 20:42 | Oliver
          huhuyeah,你那個(gè)關(guān)于theme的驗(yàn)證問題解決了嗎?我和你碰到了一樣的煩惱,郁悶啊,不知該怎么辦!!!!  回復(fù)  更多評(píng)論
            
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation)[未登錄] 2007-06-07 22:19 | Oliver
          我的action配置為
          <action name="類名" class="...">
          <interceptor-ref name="validationWorkflowStack"/>
          <result>list.jsp</result>
          <result name="list" type="redirect-action">類名!list</result>
          <result name="input">edit.jsp</result>
          </action>
          在edit.jsp頁面中,通過"類名!save.action"來進(jìn)行保存,另外配置了"類名-save-validation.xml"文件。
          我的問題的,當(dāng)把驗(yàn)證配置文件改名為"類名-validation.xml"時(shí),會(huì)對(duì)用"類名"加"!"方式訪問的所有方法進(jìn)行驗(yàn)證,可以只想對(duì)save方法進(jìn)行驗(yàn)證,但將配置文件更名為"類名-save-validation.xml"后,驗(yàn)證就不起作用了.............  回復(fù)  更多評(píng)論
            
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation)[未登錄] 2007-06-07 22:20 | Oliver
          @Oliver
          可“是”只想對(duì)save方法進(jìn)行驗(yàn)證,打錯(cuò)一個(gè)字:(  回復(fù)  更多評(píng)論
            
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation) 2007-06-11 14:23 | Mosquito
          為什么我一進(jìn)頁面錯(cuò)誤提示就出現(xiàn)呢??
          沒提交之前就出現(xiàn)。。。。
          為什么,幫忙分析一下原因唄!!  回復(fù)  更多評(píng)論
            
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation) 2007-06-12 11:25 | wldandan
          樓主,我的Action 定義如下
          <action name="save" class="ManagerConfigAction"
          method="save">
          <result name="input" type="dispatcher">/Conf/mozartConf.jsp</result>
          <result type="redirect">/mozartConf/show.action</result>
          </action>

          然后定義了validator配置文件
          運(yùn)行后,當(dāng)在input框輸入錯(cuò)誤值時(shí),錯(cuò)誤提示信息可以顯示出來,但服務(wù)器端還是對(duì)數(shù)據(jù)進(jìn)行了保存啊!!  回復(fù)  更多評(píng)論
            
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation) 2007-06-19 17:40 | jpma
          請(qǐng)問:"在Xxx-validation.xml文件中的<message>元素中加入key屬性; "
          這個(gè)怎么操作啊?
          謝謝了!  回復(fù)  更多評(píng)論
            
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation) 2007-06-21 17:01 | jpma
          @jpma
          自己找到答案了,我是這樣寫的,功能實(shí)現(xiàn)了,不知有沒有其它的方式。
          修改Xxx-validation.xml文件中的<validators>部分
          <validators>
          <field name="reqiuredString">
          <field-validator type="requiredstring">
          <message key="validation.req" />
          </field-validator>
          </field>
          </validators>

          其中key的值對(duì)應(yīng)globalMessages_en_US.properties與globalMessages_zh_CN.properties中“validation.req”
          -------------------------------------------------
          HelloWorld=HelloWorld!
          invalid.fieldvalue.loc = Locale must like \ " xx_XX\ "
          validation.loc = Locale must be China or USA
          validation.require=${getText(fileName)} is required
          validation.rqu=This string is required
          -------------------------------------------------  回復(fù)  更多評(píng)論
            
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation) 2007-06-21 17:05 | jpma
          最后一行寫錯(cuò)了,是
          validation.req=This string is required

          globalMessages_zh_CN.properties內(nèi)容
          -------------------------------------------------
          HelloWorld=你好,世界!哈哈
          invalid.fieldvalue.loc = Locale必須為\ " xx_XX\ " 的格式
          validation.loc = 區(qū)域必須為中國或美國
          validation.require=${getText(fileName)} is required
          validation.req=字符串不可為空
          -------------------------------------------------  回復(fù)  更多評(píng)論
            
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation) 2007-06-26 00:00 | jezz
          那不用寫javascript驗(yàn)證啊?  回復(fù)  更多評(píng)論
            
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation) 2007-07-04 17:39 | 任遨游
          在</form>這后已產(chǎn)生了js,為什么驗(yàn)證不起作用呢,并沒有提示信息
          <script type="text/javascript">
          function validateForm_ValidationAction() {
          form = document.getElementById("ValidationAction");
          clearErrorMessages(form);
          clearErrorLabels(form);

          var errors = false;

          return !errors;
          }
          </script>  回復(fù)  更多評(píng)論
            
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation) 2007-07-04 23:30 | Max
          @任遨游
          --------------------------------------------
          在Input.jsp中的<s:form>標(biāo)志中加入validate="true"屬性,就可以在用Javascript在客戶端校驗(yàn)數(shù)據(jù)。  回復(fù)  更多評(píng)論
            
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation) 2007-07-05 11:59 | 任遨游
          @Max

          以下是我input.jsp代碼,可是還是不起作用
          <%@ page contentType="text/html;charset=UTF-8" %>
          <%@ taglib prefix="s" uri="/struts-tags" %>
          <html>
          <head>
          <title> Hello World </title>
          <!-- 姝ゆ爣蹇楃殑浣滅敤鏄紩鍏truts 2.0鐨勫父鐢ㄧ殑Javascript鍜孋SS -->
          <s:head/>
          </head>
          <body>
          <s:form action="ValidationAction" validate="true">
          <s:textfield name="reqiuredString" label="Required String" />
          <s:submit/>
          </s:form>
          </body>
          </html>   回復(fù)  更多評(píng)論
            
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation) 2007-07-05 15:16 | 妖狐
          Struts2.x是否可以像Struts1.x那樣使用統(tǒng)一的表單校驗(yàn)文件validation.xml  回復(fù)  更多評(píng)論
            
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation) 2007-07-05 22:40 | Max
          @妖狐
          我認(rèn)為不可以。  回復(fù)  更多評(píng)論
            
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation) 2007-07-06 11:28 | 任遨游
          表單校驗(yàn)很重要,max的所有例子我都運(yùn)行了下,只有這個(gè)校驗(yàn),還有那個(gè)showproduct.jsp這兩個(gè)例子
          怎么也調(diào)不過去了。郁悶ing  回復(fù)  更多評(píng)論
            
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation) 2007-07-11 15:21 | 任遨游
          沒有回復(fù)了?我用的struts2.0.8,怎么校驗(yàn)不起作用呢  回復(fù)  更多評(píng)論
            
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation) 2007-07-11 22:37 | Max
          @任遨游
          三言兩語,我也幫不了你。
          不如你留下Email,我有空的時(shí)候可以將例子的源碼發(fā)你。  回復(fù)  更多評(píng)論
            
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation) 2007-07-12 09:35 | 任遨游
          @Max
          supershan@163.com,非常感謝  回復(fù)  更多評(píng)論
            
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation) 2007-07-19 19:38 | 游客
          今天用一下validator框架,也遇到了這個(gè)問題真是郁悶極了.
          哪位知道解決辦法啊?  回復(fù)  更多評(píng)論
            
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation) 2007-07-21 12:01 | tans
          我的驗(yàn)證都通過了,但是驗(yàn)證錯(cuò)誤信息提示老顯示在上方,有沒有什么辦法可以讓它顯示在驗(yàn)證行之后呢?還有有哪位老大把他那官方Using FieldValidators示例調(diào)式通過了的啊,為什么我老提示No result defined for action  回復(fù)  更多評(píng)論
            
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation) 2007-07-24 17:10 | 任遨游
          這個(gè)例子通過了,其實(shí)max的例子都是可以的,有時(shí)運(yùn)行不通過,很有可能是配置時(shí),只差了一點(diǎn)點(diǎn)。  回復(fù)  更多評(píng)論
            
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation) 2007-08-13 16:46 | tans
          能不能修改錯(cuò)誤信息顯示的位置啊?顯示在上方不太好看?  回復(fù)  更多評(píng)論
            
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation) 2007-08-14 13:55 | 陳利
          如果在表單中填入數(shù)字,而且是必填的,如何寫配置文件啊?  回復(fù)  更多評(píng)論
            
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation) 2007-08-16 11:14 | darvsum
          講解得相當(dāng)透徹。謝謝  回復(fù)  更多評(píng)論
            
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation) 2007-08-20 17:25 | 甲生
          如果使用框架驗(yàn)證,每一個(gè)action需要一個(gè)相應(yīng)的配置文件,那豈不是增加了工作量?  回復(fù)  更多評(píng)論
            
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation) 2007-08-20 17:33 | 甲生
          文章寫到后面,怎么草草收兵了,頗有不解之處  回復(fù)  更多評(píng)論
            
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation) 2007-08-20 23:53 | Max
          @甲生
          1、“增加了工作量”這個(gè)問題可以說是見仁見智;
          2、有些東西是“師傅領(lǐng)入門,修行靠自己”;我本人能力和時(shí)間有限,所以不可以面面俱到。  回復(fù)  更多評(píng)論
            
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation) 2007-08-21 08:27 | 甲生
          是的,雖然有些不懂,但也學(xué)了不少,非常感謝!  回復(fù)  更多評(píng)論
            
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation) 2007-08-22 11:03 | romatory
          為什么使用自定義校驗(yàn)器不行,
          嚴(yán)重: Servlet.service() for servlet default threw exception
          java.lang.ExceptionInInitializerError
          at com.opensymphony.xwork2.validator.ValidatorFileParser.
          addValidatorConfigs(ValidatorFileParser.java:192)  回復(fù)  更多評(píng)論
            
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation) 2007-08-22 16:51 | zouzhihua
          把validate="true"這個(gè)加上之后會(huì)出現(xiàn)
          FreeMarker template error!

          Method public java.lang.String com.opensymphony.xwork2.validator.validators.ValidatorSupport.getMessage(java.lang.Object) threw an exception when invoked on com.opensymphony.xwork2.validator.validators.RequiredStringValidator@10699ea
          The problematic instruction:
          ----------
          ==> ${validator.getMessage(action)?js_string} [on line 28, column 26 in template/xhtml/form-close-validate.ftl]
          in include "/${parameters.templateDir}/xhtml/form-close-validate.ftl" [on line 3, column 1 in template/xhtml/form-close.ftl]
          ----------

          Java backtrace for programmers:
          ----------
          freemarker.template.TemplateModelException: Method public java.lang.String com.opensymphony.xwork2.validator.validators.ValidatorSupport.getMessage(java.lang.Object) threw an exception when invoked on com.opensymphony.xwork2.validator.validators.RequiredStringValidator@10699ea  回復(fù)  更多評(píng)論
            
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation) 2007-08-22 16:52 | zouzhihua
          在線等待解決  回復(fù)  更多評(píng)論
            
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation) 2007-08-23 15:56 | pxcong
          @Max
          你寫的文章太好啦,講解的也很仔細(xì),可以出書了,呵呵~:)
          能幫我解決下 提交前就進(jìn)行驗(yàn)證的問題,(我不想在未提交前就輸出警告信息,如:字符不為空。)
          如果好的例子的話可以發(fā)給我嗎?
          郵箱:pxcong007@126.com
            回復(fù)  更多評(píng)論
            
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation) 2007-08-28 12:06 | louleigh
          max哥..小弟又來拜讀你的大作啦..
          請(qǐng)問一下。
          在alidation框架下面。
          如果想用紅色顯示該怎么做啊。.
            回復(fù)  更多評(píng)論
            
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation) 2007-08-28 12:11 | louleigh
          如果按照你的第一種方法來弄。.則會(huì)顯示兩個(gè).
          一個(gè)是紅色的.一個(gè)是黑色的。請(qǐng)問應(yīng)該怎么解決也  回復(fù)  更多評(píng)論
            
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation) 2007-08-28 23:09 | Max
          @louleigh
          不是很明白你的問題,能否詳細(xì)一點(diǎn)  回復(fù)  更多評(píng)論
            
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation) 2007-08-30 08:44 | louleigh
          我的問題就是你驗(yàn)證后要提示錯(cuò)誤信息嘛。

          怎么把那個(gè)錯(cuò)誤信息變成紅色的。。

          我看了一下我的表達(dá)好象是有點(diǎn)問題。。

          我現(xiàn)在的問題是他要提示錯(cuò)誤。

          但是錯(cuò)誤顯示是黑色的。。

          我可以在他前面加上

          <div style="color:red"><s:fielderror></div>

          但是這樣的話。他就會(huì)顯示兩次錯(cuò)誤信息。

          我想顯示一次。并且讓他成為紅色。

          請(qǐng)問該怎么做。

          麻煩你啦。。max哥  回復(fù)  更多評(píng)論
            
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation) 2007-09-01 15:59 | louleigh
          我配置出來的后。。
          validation他顯示的顏色是黑色。。。
          我的意思大概就是這個(gè)  回復(fù)  更多評(píng)論
            
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation) 2007-09-01 16:29 | gdm
          我的程序怎么出不來呢?加上驗(yàn)證的就過不去。請(qǐng)教高手除了寫actionname-validation.xml 以外還需要配置別的地方嗎?謝謝
            回復(fù)  更多評(píng)論
            
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation) 2007-09-01 16:33 | ts
          按照上面的配置之后,運(yùn)行出以下的錯(cuò)誤
          Document is invalid: no grammar found
          請(qǐng)問該如何解決  回復(fù)  更多評(píng)論
            
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation) 2007-09-01 16:41 | louleigh
          @gdm
          actionname-validation.xml除了這個(gè)玩意兒沒有地方需要寫了
          請(qǐng)你把max的例子。。仔細(xì)看下哪里整錯(cuò)了沒有。
          max的例子是絕對(duì)正確的

          仔細(xì)檢查  回復(fù)  更多評(píng)論
            
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation) 2007-09-01 16:42 | louleigh
          max我知道問題出在哪里了
          問題出在
          我以前沒有寫<s:head/>
          這個(gè)東西。。
          現(xiàn)在用了這個(gè)就可以變色了

          請(qǐng)問s:head是實(shí)現(xiàn)的什么東西啊

          我可以重寫他的內(nèi)容嗎。

          他改變了我頁面的其他顯示啊。。

          我不想用他的字體。。如果知道請(qǐng)回答  回復(fù)  更多評(píng)論
            
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation) 2007-09-01 16:47 | gdm
          首先感謝louleigh的回復(fù),我閱讀好幾遍了
          以下是我的RegisterAction-validation.xml中寫到的
          <?xml version="1.0" encoding="UTF-8"?>
          <validators>
          <field name ="user.username">
          <field-validator type ="requiredstring">
          <message> This string is required </message>
          </field-validator>
          </field>
          <field name="user.password">
          <field-validator type="requiredstring">
          <message>You must enter a value for password.</message>
          </field-validator>
          <field-validator type="fieldexpression">
          <param name="expression">
          user.password == user.verifyPassword
          </param>
          <message>Passwords don't match.</message>
          </field-validator>
          </field>
          <field name="user.birthday">
          <field-validator type="date">
          <param name="min">12/22/1980</param>
          <param name="max">9/1/2007</param>
          <message>The date must be between 12-22-2002 and 12-25-2002.</message>
          </field-validator>
          </field>

          <field name="user.email">
          <field-validator type="email">
          <message>You must enter a valid email.</message>
          </field-validator>
          </field>
          <field name="user.age">
          <field-validator type="int">
          <param name="min">6</param>
          <param name="max">100</param>
          <message>
          Age must be between ${min} and ${max}, current value is
          ${user.age}.
          </message>
          </field-validator>
          </field>
          </validators>
          下面是struts.xml
          <?xml version="1.0" encoding="UTF-8" ?>
          <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
          "http://struts.apache.org/dtds/struts-2.0.dtd">
          <struts>
          <package name="default" extends="struts-default">
          <action name="reg"
          class="com.gdm.actions.RegisterAction.RegisterAction">
          <result name="success" type="dispatcher">
          <param name="location">/result.jsp</param>
          </result>

          <result name="input" type="dispatcher">
          <param name="location">/register.jsp</param>
          </result>

          <interceptor-ref name="validationWorkflowStack"/>
          </action>
          </package>

          </struts>
          請(qǐng)教高手幫忙分析一下!在線等  回復(fù)  更多評(píng)論
            
          # validate失敗以后,畫面中的list重新復(fù)值得問題 2007-09-05 18:19 | elegant
          我用validate-別名-validate.xml方式驗(yàn)證畫面的數(shù)據(jù)項(xiàng)目,如果失敗的情況下,直接返回到提交畫面,但是這個(gè)畫面的list項(xiàng)目還沒有設(shè)定(因?yàn)闆]有進(jìn)入action)我怎么做才能重新這個(gè)list得值呢  回復(fù)  更多評(píng)論
            
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation) 2007-09-07 17:04 | 大米
          @zouzhihua
          跟你的問題一模一樣。沒人解答 算了...等我解決告訴你  回復(fù)  更多評(píng)論
            
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation) 2007-09-11 11:32 | bqshi
          @大米

          這個(gè)問題的直接原因是validationsupport.getMessage的時(shí)候需要根據(jù)你傳進(jìn)來的action對(duì)象o,得到o.class的log,產(chǎn)生了nullpoiter exception,根本原因是沒有通過action訪問jsp文件,所以傳進(jìn)來的action是null。
          我的mail:shiboqing@gmail.com  回復(fù)  更多評(píng)論
            
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation) 2007-10-09 14:59 | yangdamao
          @Max
          請(qǐng)問:"1.在Xxx-validation.xml文件中的<message>元素中加入key屬性;
          2.在Input.jsp中的<s:form>標(biāo)志中加入validate="true"屬性,就可以在用Javascript在客戶端校驗(yàn)數(shù)據(jù)。 "這兩條是不是不能同時(shí)實(shí)現(xiàn)啊?
          我試驗(yàn)了一下,如果滿足了第一條的情況下,再加上validate="true",就會(huì)出現(xiàn)
          和zouzhihua & 大米 一樣的錯(cuò)誤提示.但是只滿足第貳條時(shí),就可以在客戶端進(jìn)行驗(yàn)證.還請(qǐng)Max先生解釋一下!Tks!  回復(fù)  更多評(píng)論
            
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation) 2007-11-09 16:16 | jiang
          我在做驗(yàn)證的一個(gè)例子:
          在注冊(cè)時(shí),通常要輸入密碼和驗(yàn)證密碼兩項(xiàng)內(nèi)容,請(qǐng)問如何才能用validation.xml來進(jìn)行驗(yàn)證.
          我看了幾個(gè)例子,但是它們的輸入數(shù)據(jù)都是只能一個(gè),如何往validation.xml中傳入兩個(gè)數(shù)據(jù)呢?
          請(qǐng)你幫我解決一下,謝謝了!
            回復(fù)  更多評(píng)論
            
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation) 2007-11-17 15:48 | sophia
          頁面第一次顯示的時(shí)候,不想引發(fā)驗(yàn)證。該怎么設(shè)置呢?  回復(fù)  更多評(píng)論
            
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation)[未登錄] 2007-11-29 09:36 | Elven
          Struts2,好東西!  回復(fù)  更多評(píng)論
            
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation) 2007-11-29 17:01 | Elven
          各位,為什么我的校驗(yàn)框架,無論是在輸入出錯(cuò)或者沒有出錯(cuò)的時(shí)候都會(huì)拋出錯(cuò)誤呢?
          補(bǔ)充:我是按照max的流程來做的。  回復(fù)  更多評(píng)論
            
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation) 2007-12-16 16:49 | way
          為什么我完全按照例子來的 可是不輸入任何內(nèi)容的時(shí)候也會(huì)正常顯示 只是為空罷了 大家認(rèn)為錯(cuò)誤最可能出在哪了 ?  回復(fù)  更多評(píng)論
            
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation) 2008-01-02 11:52 | javer
          很不錯(cuò),收藏.  回復(fù)  更多評(píng)論
            
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation) 2008-01-03 22:19 | socretes
          我測試client端的驗(yàn)證,但是我發(fā)現(xiàn)其實(shí)根本是 虛的,我可以斷定表單依然提交到了后臺(tái)然后才進(jìn)行驗(yàn)證的,我不知道這里是否有人真正實(shí)現(xiàn)過。
          我發(fā)現(xiàn)的問題是,雖然驗(yàn)證js代碼都生成了,但是不能執(zhí)行,原因是找不到clearErrorMessages(form); 方法,而且我觀察可能是要加載的<script type="text/javascript" src="/testss1/struts/xhtml/validation.js"></script> 找不到的緣故,因?yàn)檫@個(gè)目錄根本就不存在,testss1是本人測試的應(yīng)用。

          望這里有高手回答我疑惑,萬分感激!!
          能給我郵件最好: yuchw(at)capitek.com.cn  回復(fù)  更多評(píng)論
            
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation)[未登錄] 2008-01-10 16:22 | bill
          謝謝您提供給我們這么好一篇文章,對(duì)我最近的工作帶來了很大幫助。

          有個(gè)小問題:在深入理解一段時(shí)間后,發(fā)現(xiàn)struts2的校驗(yàn)流程比您描述的還要復(fù)雜一點(diǎn)(您文章文章中的流程圖),應(yīng)該是js+攔截器1+攔截器2三個(gè)階段。  回復(fù)  更多評(píng)論
            
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation)[未登錄] 2008-01-18 13:26 | song
          @zouzhihua
          我也遇到了,你解決了嗎?  回復(fù)  更多評(píng)論
            
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation) 2008-01-29 15:56 | 小周
          請(qǐng)問如何才能修改struts 2.0中錯(cuò)誤顯示的位置呢。就是用驗(yàn)證框架后返回到頁面上顯示的報(bào)錯(cuò)信息,
          默認(rèn)是顯示控件的上方(紅色),但是我現(xiàn)在想讓它顯示在控件的右邊。
          如何處理.......  回復(fù)  更多評(píng)論
            
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation) 2008-01-29 15:57 | 小周
          這個(gè)問題有點(diǎn)急,項(xiàng)目里面要用。
          哎找了很多資料都沒有找到。
          請(qǐng)大家?guī)臀乙幌拢?
          謝謝了  回復(fù)  更多評(píng)論
            
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation) 2008-02-02 15:19 | 日本の項(xiàng)目に対する新人
          需要在指定位置輸出錯(cuò)誤信息時(shí),form主題theme不能設(shè)置成默認(rèn),應(yīng)是simple,默認(rèn)的主題會(huì)在每個(gè)控件上面輸出錯(cuò)誤信息。然后在你需要輸出錯(cuò)誤信息的地方用
          <s:fielderror>
          <s:param value="%{'fieldname'}"/></s:fielderror>  回復(fù)  更多評(píng)論
            
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation) 2008-02-14 15:51 | happy
          我是剛剛接觸struts2.0
          我寫的驗(yàn)證但是沒有反映,也沒有錯(cuò)誤  回復(fù)  更多評(píng)論
            
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation) 2008-03-04 16:41 | 小周
          @日本の項(xiàng)目に対する新人
          這個(gè)方法可以,但是頁面的格式和布局不是很好看,有沒有方法讓框架產(chǎn)生的HTML頁面顯示錯(cuò)誤信息時(shí)不產(chǎn)生<ui><li>標(biāo)簽?zāi)兀?nbsp; 回復(fù)  更多評(píng)論
            
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation) 2008-03-04 16:43 | 小周
          <s:fielderror>
          <s:param value="%{'fieldname'}"/></s:fielderror>

          上面的方法很好。
          但是頁面的格式和布局不是很好看,有沒有方法讓框架產(chǎn)生的HTML頁面顯示錯(cuò)誤信息時(shí)不產(chǎn)生<ui><li>標(biāo)簽?zāi)兀?  回復(fù)  更多評(píng)論
            
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation)[未登錄] 2008-03-05 10:56 | Nick
          @mz

          原因是在校驗(yàn)配置文件***-validation.xml中使用了package.properties中消息鍵,該消息資源中的消息在不調(diào)用Action是不能使用的,只有調(diào)用Action,該頁面對(duì)應(yīng)的校驗(yàn)配置文件***-validation.xml才能使用了package.properties中消息鍵。所以直接調(diào)用ordernew.jsp是不行的  回復(fù)  更多評(píng)論
            
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation)[未登錄] 2008-03-05 10:57 | Nick
          @test
          原因是在校驗(yàn)配置文件***-validation.xml中使用了package.properties中消息鍵,該消息資源中的消息在不調(diào)用Action是不能使用的,只有調(diào)用Action,該頁面對(duì)應(yīng)的校驗(yàn)配置文件***-validation.xml才能使用了package.properties中消息鍵。所以直接調(diào)用ordernew.jsp是不行的  回復(fù)  更多評(píng)論
            
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation)[未登錄] 2008-03-05 10:57 | Nick
          @zouzhihua

          原因是在校驗(yàn)配置文件***-validation.xml中使用了package.properties中消息鍵,該消息資源中的消息在不調(diào)用Action是不能使用的,只有調(diào)用Action,該頁面對(duì)應(yīng)的校驗(yàn)配置文件***-validation.xml才能使用了package.properties中消息鍵。所以直接調(diào)用ordernew.jsp是不行的  回復(fù)  更多評(píng)論
            
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation) 2008-04-25 11:10 | 懶人
          感謝樓主百忙中給我們整理資料  回復(fù)  更多評(píng)論
            
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation) 2008-05-13 15:21 | Min
          @Nick
          是的,可以改為
          < action name ="HelloWorld_*" class ="tutorial.HelloWorld" method="{1}">
          < result > /HelloWorld.jsp </ result >
          < result name ="input" > /HelloWorld.jsp </ result >
          </ action >
          然后訪問
          http://localhost:8080/Struts2_Validation/HelloWorld_input.action  回復(fù)  更多評(píng)論
            
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation) 2008-05-14 18:04 | 類風(fēng)
          請(qǐng)問在ActionName-validation.xml中如何對(duì)double類型的變量進(jìn)行驗(yàn)證,我是這樣寫的
          <field name="price">
          <field-validator type="conversion" short-circuit="true">
          <param name="repopulateField">true</param>
          <message>價(jià)格必須是數(shù)字類型</message>
          </field-validator>
          <field-validator type="double" >
          <param name="min">1</param>
          <message>價(jià)格必須大于1元</message>
          </field-validator>
          </field>

          它默認(rèn)在文本框中顯示0.0 ,價(jià)格的范圍還是驗(yàn)證不了,請(qǐng)問這到底是什么原因,我該如何解決?  回復(fù)  更多評(píng)論
            
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation) 2008-05-22 15:20 | oskin
          樓主您好,我是struts2新手.在調(diào)試你上面給的校驗(yàn)框架的那個(gè)例子的時(shí)候,出現(xiàn)問題了.代碼都是照搬過來的,但是在我這執(zhí)行就是不正確,不知道為什么?頭大!
          錯(cuò)誤代碼如下:

          2008-5-22 15:08:34 org.apache.struts2.components.Form evaluateExtraParamsServletRequest
          警告: No configuration found for the specified action: 'ValidationAction.action' in namespace: '/'. Form action defaulting to 'action' attribute's literal value.

          這個(gè)警告會(huì)出來兩遍~~然后程序是沒有執(zhí)行校驗(yàn),隨便輸入什么值都沒有執(zhí)行action...
          當(dāng)我把<s:form>換成普通的<form action=...>時(shí),上面的錯(cuò)誤警告就沒了,但是還是沒有執(zhí)行到action.只有把ValidationAction-validation.xml挪到別的地方,action才會(huì)被執(zhí)行...

          另外我把<s:form action="ValidationAction.action">寫成這樣才能找到action,看到一些文章說是不需要寫上.action的,我不知道哪里設(shè)置~~

          問題比較多,希望能幫幫忙,謝謝了.如果可能的話,能不能把上面的例子項(xiàng)目給發(fā)到我郵箱? oskin2002@gmail.com 再次感謝.

            回復(fù)  更多評(píng)論
            
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation) 2008-05-22 17:35 | oskin
          補(bǔ)充一下,上面那個(gè)警告是在刷新Input.jsp的時(shí)候就出現(xiàn)的  回復(fù)  更多評(píng)論
            
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation)[未登錄] 2008-05-26 12:02 | kevin
          submit后提示Invalid field value for field "loc".這是為什么啊?  回復(fù)  更多評(píng)論
            
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation) 2008-07-09 13:04 | kane82
          關(guān)于struts2的驗(yàn)證。我在做的demo的時(shí)候碰到這么個(gè)問題,struts.xml文件的input配置jsp頁面沒有問題,但是如果配置input跳到action的話,怎么也不能跳過去。
          請(qǐng)問LZ該怎么解決這個(gè)問題啊!  回復(fù)  更多評(píng)論
            
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation) 2008-07-28 18:33 | se
          @kevin
          用局部資源 全局的無法找到  回復(fù)  更多評(píng)論
            
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation)[未登錄] 2008-08-06 17:37 | matrix
          @Max
          文中“...Struts 2.0的校驗(yàn)框架自動(dòng)會(huì)讀取該文件,但這樣就會(huì)引出一個(gè)問題——如果我的Action繼承其它的Action類,而這兩個(gè)Action類都需要對(duì)表單數(shù)據(jù)進(jìn)行校驗(yàn),那我是否會(huì)在子類的配置文件(Xxx-validation.xml)中復(fù)制父類的配置嗎?答案是不,因?yàn)?..”

          怎么我看了后面的解釋,我覺得你應(yīng)該說“答案是肯定的”,怎么是“不”呢?
          因?yàn)檎漳愕囊馑际牵日腋割惻渲茫缓笤僬易宇悾ㄗ约海┡渲茫徽悄闼f的復(fù)制父類的配置嗎???  回復(fù)  更多評(píng)論
            
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation) 2008-08-12 11:11 | xmy
          @日本の項(xiàng)目に対する新人
          這個(gè)方法好像不行啊,我試了下,可是錯(cuò)誤提示還是在頂上,倒是設(shè)置了theme=“simple”后我的標(biāo)簽什么的都沒了  回復(fù)  更多評(píng)論
            
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation) 2008-10-21 20:01 | xiaosong
          看到您的博客收獲很多,文章寫的非常詳細(xì),很容易理解,祝博客越來越好  回復(fù)  更多評(píng)論
            
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation) 2009-01-18 22:37 | shuzigui
          我運(yùn)行你的第二個(gè)例子時(shí),在里面輸入了字符串,結(jié)果報(bào)錯(cuò)是:
          root cause

          org.apache.jasper.JasperException: org.apache.jasper.JasperException: File "/struts-tags " not found

          請(qǐng)問這是怎么回事,如果不輸入可以正常運(yùn)行  回復(fù)  更多評(píng)論
            
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation)[未登錄] 2009-04-22 09:36 | jezz
          呵呵不錯(cuò)!  回復(fù)  更多評(píng)論
            
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation) 2009-07-01 10:26 | dfd
          sfsafasf  回復(fù)  更多評(píng)論
            
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation) 2009-10-17 00:42 | Martson
          @socretes
          遇到同樣的問題,不知道為什么。  回復(fù)  更多評(píng)論
            
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation) 2010-09-26 10:45 | 風(fēng)里面
          麻煩也發(fā)我一份 謝謝 public_private@163.com  回復(fù)  更多評(píng)論
            
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation)[未登錄] 2010-11-14 15:35 |
          @kane82
          這個(gè)問題,和你寫了一個(gè)死循環(huán)沒有區(qū)別。  回復(fù)  更多評(píng)論
            
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation) 2011-03-29 00:42 | 劉軒
          你好,我想問個(gè)事,就是我在試用框架驗(yàn)證時(shí) 我的struts.xml中action節(jié)點(diǎn)是這樣的<action name="*_metaAction" class="com.ewaytec.merchant.product.action.AddAndEditMetaAction" method="{1}" > 那我那個(gè)驗(yàn)證配置文件的名字怎么命名?  回復(fù)  更多評(píng)論
            
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation)[未登錄] 2013-04-10 11:15 | tang
          要不您發(fā)個(gè)源碼給我吧,ianafollow@163.com,謝謝!  回復(fù)  更多評(píng)論
            
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation) 2013-11-08 15:40 | 胡應(yīng)
          怎么去掉圓點(diǎn)兒啊?  回復(fù)  更多評(píng)論
            
          # re: 在Struts 2.0中實(shí)現(xiàn)表單數(shù)據(jù)校驗(yàn)(Validation)[未登錄] 2014-04-08 12:56 | 李林
          怎么去掉圓點(diǎn)兒啊!  回復(fù)  更多評(píng)論
            
          評(píng)論共2頁: 1 2 下一頁 
          主站蜘蛛池模板: 余江县| 商都县| 绥化市| 本溪| 济宁市| 澎湖县| 积石山| 台湾省| 衡水市| 北辰区| 兴化市| 茶陵县| 西城区| 韩城市| 广德县| 汾阳市| 岳阳县| 双城市| 偃师市| 迁西县| 漳平市| 万全县| 虹口区| 兴海县| 榆树市| 隆安县| 浮梁县| 钟祥市| 织金县| 安宁市| 宁陕县| 镇康县| 西吉县| 华坪县| 嵩明县| 台前县| 昆山市| 西昌市| 格尔木市| 从江县| 莱芜市|