轉自http://blog.csdn.net/fj359941160/article/details/7037932
直接上代碼。 驗證問題。
遇到了點問題。
regist.jsp中的表單代碼
- <s:form action="registAction" validate="true">
- <s:textfield name="name" label="用戶名"></s:textfield>
- <s:textfield name="pass" label="密 碼"></s:textfield>
- <s:textfield name="age" label="年齡"></s:textfield>
- <s:textfield name="birth" label="生日"></s:textfield>
- <s:submit name="註冊"/>
- </s:form>
4個屬性分別是user對象裏的四個屬性
注意<s:form>標籤裏有個屬性validate爲true。這樣纔是客戶端驗證。struts2中的配置package中的action配置
- <action name="registAction" class="fj.struts.action.RegistAction">
- <result name="input">/regist.jsp</result>
- <result name="success">/show.jsp</result>
- </action>
驗證代碼
- <?xml version="1.0" encoding="GBK"?>
- <!DOCTYPE validators PUBLIC
- "-//OpenSymphony Group//XWork Validator 1.0.3//EN"
- "http://www.opensymphony.com/xwork/xwork-validator-1.0.3.dtd">
- <validators>
- <field name="name">
- <field-validator type="requiredstring" short-circuit="true">
- <param name="trim">true</param>
- <message key="name.requried"></message>
- </field-validator>
- <field-validator type="regex">
- <param name="expression"><![CDATA[(\w{4,25})]]></param>
- <message key="name.regex"></message>
- </field-validator>
- </field>
- <field name="pass">
- <field-validator type="requiredstring" short-circuit="true">
- <param name="trim">true</param>
- <message key="pass.requried"></message>
- </field-validator>
- <field-validator type="regex">
- <param name="expression"><![CDATA[(\w{4,25})]]></param>
- <message key="pass.regex"></message>
- </field-validator>
- </field>
- <field name="age">
- <field-validator type="int" short-circuit="true">
- <param name="min">1</param>
- <param name="max">150</param>
- <message key="age.range"></message>
- </field-validator>
- </field>
- <field name="birth">
- <field-validator type="date" short-circuit="true">
- <param name="min">1900-01-01</param>
- <param name="max">2050-02-21</param>
- <message key="birth.range"></message>
- </field-validator>
- </field>
- </validators>
看結果
由於我們在validate文件中加入了短路屬性
- short-circuit="true"
所以第一個不符合條件後後面就不執行了。
服務器端驗證不同。它還是會把所有的屬性都驗證一遍。
這裏說下遇到的問題。
首先第一個在regist.jsp文件中
- <s:form action="registAction.action" validate="true">
- <s:textfield name="name" label="用戶名"></s:textfield>
- <s:textfield name="pass" label="密 碼"></s:textfield>
- <s:textfield name="age" label="年齡"></s:textfield>
- <s:textfield name="birth" label="生日"></s:textfield>
- <s:submit name="註冊"/>
- </s:form>
一開始我的action是registAction.action多了個後綴action。 結果就變成了服務器端驗證。每個屬性都驗證了一遍。
第二點。
在struts.xml文件中配置如下內容
<action name="*">
<result>/{1}.jsp</result>
</action>
不然會出現錯誤
錯誤的原因是 我們希望Struts2的客戶端驗證能發生作用,那我們進入該regist.jsp頁面之前必須經過Struts2的核心Filter,而上面我們直接請求了regist.jsp,所以出錯了。
後來又做了個例子。
- <package name="regist" extends="struts-default" namespace="/test">
- <action name="registAction" class="fj.struts.action.RegistAction">
- <result name="input">/regist.jsp</result>
- <result name="success">/show.jsp</result>
- </action>
- <action name="*">
- <result>/{1}.jsp</result>
- </action>
- </package>
下面這個東西是爲了通過Struts的核心Filter。而不直接regist.jsp。 不然會出錯
- <action name="*">
- <result>/{1}.jsp</result>
- </action>
註冊頁面表單代碼如下
- <s:form action="registAction" validate="true" namespace="/test" method="post">
- <s:textfield name="name" label="用戶名"></s:textfield>
- <s:textfield name="pass" label="密 碼"></s:textfield>
- <s:textfield name="age" label="年齡"></s:textfield>
- <s:textfield name="birth" label="生日"></s:textfield>
- <s:submit name="註冊" />
- </s:form>
如果我們寫了這樣的代碼
- <s:form action="/test/registAction.action" validate="true" method="post">
- <s:textfield name="name" label="用戶名"></s:textfield>
- <s:textfield name="pass" label="密 碼"></s:textfield>
- <s:textfield name="age" label="年齡"></s:textfield>
- <s:textfield name="birth" label="生日"></s:textfield>
- <s:submit name="註冊" />
- </s:form>
這樣就變成了服務器端驗證。
在這搞了半天。
後來上網查了資料。在Struts2的官方客戶端驗證例子中有這個一段話http://struts.apache.org/2.1.8.1/docs/client-validation.html
下面這段話正是我剛纔錯誤的配置。 看While the following will "work" in the sense that the form will function correctly, client-side validation will not. That is because Struts must know the exact namespace and action (rather than a URL) to properly support validation.