1. Struts2中的輸入校驗
2. 編碼方式校驗
1) Action一定要繼承自ActionSupport
2) 針對某個要進行校驗的請求處理方法編寫一個 public void validateXxx()方法,在方法內部進行表單數據校驗.
3) 也可針對所有的請求處理方法編寫public void validate()方法。
4) 在校驗方法中,可以通過addFieldError()方法來添加字段校驗錯誤消息。
5) 當校驗失敗時,Struts框架會自動跳轉到name爲input的Result頁面。在校驗失敗頁面中,可以使用<s:fielderror/>來顯示錯誤消息
6) 簡單,靈活。但重用性不高。
3. XML配置方式校驗。在編碼方式之前被執行。
1) 針對要校驗的Action類,在同包下編寫一個名爲:Action類名-validation.xml校驗規則文件。
2) 在校驗規則文件中添加校驗規則:具體的校驗器名,參數可參看Struts2的reference或Struts2的API。
a) Field校驗:針對Action類中每個非自定義類型的Field進行校驗的規則。
<field name="要校驗的Field名">
<field-validator type="校驗規則器名" short-circuit="是否要短路徑校驗(默認是false)">
<param name="校驗器要使用的參數名">值</param>
<message>校驗失敗時的提示消息</message>
</field-validator>
<!-- 還可添加其它的校驗規則 -->
</field>
b) 非Field校驗:針對Action類的某些Field使用OGNL表達進行組合校驗。
<validator type="fieldexpression">
<param name="fieldName">pwd</param>
<param name="fieldName">pwd2</param>
<param name="expression"><![CDATA[pwd==pwd2]]></param><!-- OGNL表達式 -->
<message>確認密碼和密碼輸入不一致</message>
</validator>
c) visitor校驗:主要是用來校驗Action類中的自定義類型Field。(針對使用模型驅動方式時)
i) 在Action類的的校驗規則文件中針對自定義類型Field使用visitor校驗規則。
<!-- 針對自定義Field使用visitor校驗 -->
<field name="user">
<field-validator type="required" short-circuit="true">
<message>用戶的信息必填</message><!-- 消息前綴 -->
</field-validator>
<field-validator type="visitor"><!-- 指定爲visitor校驗規則 -->
<param name="context">userContext</param><!-- 指定本visitor校驗的上下文名 -->
<param name="appendPrefix">true</param><!-- 是否要添加校驗失敗消息的前綴 -->
<message>用戶的</message><!-- 消息前綴 -->
</field-validator>
</field>
ii) 針對visitor的Field編寫一個校驗規則文件.文件名爲: visitor字段類型名[-visitor校驗的上下文名]-validation.xml. 例如: 本例中的文件名爲User-userContext-validation.xml
注意: 此文件要存放到visitor字段類型所在的包下.
iii) 在visitor的Field校驗規則文件中針對要校驗的Field添加校驗規則.
3) 在校驗失敗頁面(名爲input的result頁面)中,可以使用<s:fielderror/>來顯示錯誤消息。
4) 默認情況下,XML的校驗規則對Action中所有的請求處理方法生效.此時應該只針對每個要校驗的請求處理方法指定校驗。有兩種方式:
i) 只爲Action中的指定方法指定校驗規則文件,配置文件命名爲:Action類型名-別名-validation.xml,
別名是要校驗的方法對應的Action標籤的name屬性值。
如:UserAction在struts2.xml的配置爲:
<package name="my" extends="struts-default" namespace="/">
<action name="user_*" class="com.javacrazyer.web.action.UserAction" method="{1}">
<result name="success">/info.jsp</result>
<result name="input">/user_{1}.jsp</result>
</action>
</package>
● UserAction中有registe方法和login方法,要對registe方法進行校驗,則它的校驗規則文件名爲:UserAction-user_registe-validation.xml。
● 如果使用visitor校驗器,必需指定visitor校驗的上下文名。
ii) 在校驗攔截器中指定要驗證的方法。不太實用。
<action name="user_*" class="com.javacrazyer.web.action.UserAction" method="{1}">
<result name="success">/info.jsp</result>
<result name="input">/user_{1}.jsp</result>
<interceptor-ref name="defaultStack">
<!-- 給校驗攔截器指定不進行校驗的方法列表:用逗號隔開 -->
<param name="validation.excludeMethods">*</param>
<!-- 給校驗攔截器指定要進行校驗的方法列表:用逗號隔開 -->
<param name="validation.includeMethods">regist</param>
</interceptor-ref>
</action>
5) 同時使用客戶端校驗和服務器端校驗
i) 設置<s:form>標籤的validate屬性:
false:默認值。校驗框架只執行服務器端校驗。
true:先執行客戶端校驗,然後再執行服務器端校驗。
form標籤會根據你在服務器端配置的驗證規則生成對應的JavaScript驗證代碼。
目前支持的內置校驗器:required、requiredstring、stringlength、regex validator、email、url、int、double
ii) 不太好用,不建議使用。建議使用jQuery進行頁面表單校驗。
6) 自定義校驗器:
i) 繼承自FieldValidatorSupport抽象類。重寫validate(Object obj)方法
ii) 註冊校驗器類. 在應用程序的classpath下新建一校驗器註冊文件。名爲validators.xml,內容如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
"-//OpenSymphony Group//XWork Validator Config 1.0//EN"
"http://www.opensymphony.com/xwork/xwork-validator-config-1.0.dtd">
<validators>
<validator name="校驗器名" class="校驗器類的全限定名"/>
</validators>
4. Annotation方式校驗: Struts2提供了註解的方式校驗
1) @Validation 指明這個類或者接口將使用基於註解的校驗。Struts2.1中已被標識爲過時。
2) @Validations() 在同一個方法上要使用多個註解校驗時。
3) @SkipValidation 指定某個方法不需要校驗。否則所有方法都會使用校驗。也可以在檢驗攔截器中使用validateAnnotatedMethodOnly
4) 13個內置校驗器的註解版本:(注:這些註解都只能用在方法級別上) 具體參數參見Struts2的API或Reference。
@RequiredFieldValidator
@RequiredStringValidator
@StringLengthFieldValidator
@IntRangeFieldValidator
@DoubleRangeFieldValidator
@DateRangeFieldValidator
@ExpressionValidator
@FieldExpressionValidator
@RegexFieldValidator
@EmailValidator
@UrlValidator
@VisitorFieldValidator
@ConversionErrorFieldValidator
第一個示例:XML配置式校驗器---註冊頁面
acc_registe.jsp
- <span style="font-size: medium;"><%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
- <%@ taglib uri="/struts-tags" prefix="s" %>
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <html>
- <head>
- <title>Struts2中基於XML配置式的校驗器使用示例</title>
- </head>
- <body>
- <h3>XML配置式校驗器---註冊頁面</h3><hr/>
- <div style="color:red"><s:fielderror/></div>
- <form action="acc_registe.action" method="post">
- <table>
- <tr>
- <td>ID</td>
- <td><input type="text" name="id" value="${param.id}"/></td>
- </tr>
- <tr>
- <td>登錄名</td>
- <td><input type="text" name="name" value="${param.name}"/></td>
- </tr>
- <tr>
- <td>密碼</td>
- <td><input type="password" name="pwd"/></td>
- </tr>
- <tr>
- <td>重複密碼</td>
- <td><input type="password" name="pwd2"/></td>
- </tr>
- <tr>
- <td>時間</td>
- <td><input type="text" name="registed_date" value="${param.registed_date}"/></td>
- </tr>
- <tr>
- <td>email</td>
- <td><input type="text" name="email" value="${param.email}"/></td>
- </tr>
- <tr>
- <td>考試成績</td>
- <td><input type="text" name="score" value="${param.score}"/></td>
- </tr>
- <tr>
- <td colspan="2"><input type="submit" value=" 提交 "/></td>
- </tr>
- </table>
- </form>
- </body>
- </html></span>
src/struts.xml
- <span style="font-size: medium;"><?xml version="1.0" encoding="UTF-8" ?>
- <!DOCTYPE struts PUBLIC
- "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
- "http://struts.apache.org/dtds/struts-2.1.7.dtd">
- <struts>
- <!-- 請求參數的編碼方式 -->
- <constant name="struts.i18n.encoding" value="UTF-8"/>
- <!-- 指定被struts2處理的請求後綴類型。多個用逗號隔開 -->
- <constant name="struts.action.extension" value="action,do,go,xkk"/>
- <!-- 當struts.xml改動後,是否重新加載。默認值爲false(生產環境下使用),開發階段最好打開 -->
- <constant name="struts.configuration.xml.reload" value="true"/>
- <!-- 是否使用struts的開發模式。開發模式會有更多的調試信息。默認值爲false(生產環境下使用),開發階段最好打開 -->
- <constant name="struts.devMode" value="false"/>
- <!-- 設置瀏覽器是否緩存靜態內容。默認值爲true(生產環境下使用),開發階段最好關閉 -->
- <constant name="struts.serve.static.browserCache" value="false" />
- <!-- 是否允許在OGNL表達式中調用靜態方法,默認值爲false -->
- <constant name="struts.ognl.allowStaticMethodAccess" value="true"/>
- <!-- 指定由spring負責action對象的創建
- <constant name="struts.objectFactory" value="spring" />
- -->
- <!-- 是否開啓動態方法調用 -->
- <constant name="struts.enable.DynamicMethodInvocation" value="false"/>
- <package name="my" extends="struts-default" namespace="/">
- <action name="acc_*" class="com.javacrazyer.web.action.AccountAction" method="{1}">
- <result name="success">/info.jsp</result>
- <result name="input">/acc_{1}.jsp</result>
- </action>
- </package>
- </struts>
- </span>
AccountAction.java
- <span style="font-size: medium;">package com.javacrazyer.web.action;
- import java.util.Date;
- import com.opensymphony.xwork2.ActionSupport;
- public class AccountAction extends ActionSupport {
- private static final long serialVersionUID = -1418893621512812472L;
- private Integer id;
- private String name;
- private String pwd;
- private String pwd2;
- private Double score;
- private Date registed_date;
- private String email;
- public String registe() throws Exception{
- System.out.println("registe-------------------");
- return SUCCESS;
- }
- public String login()throws Exception{
- return SUCCESS;
- }
- public Integer getId() {
- return id;
- }
- public void setId(Integer id) {
- this.id = id;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public Double getScore() {
- return score;
- }
- public void setScore(Double score) {
- this.score = score;
- }
- public Date getRegisted_date() {
- return registed_date;
- }
- public void setRegisted_date(Date registedDate) {
- registed_date = registedDate;
- }
- public String getEmail() {
- return email;
- }
- public void setEmail(String email) {
- this.email = email;
- }
- public String getPwd() {
- return pwd;
- }
- public void setPwd(String pwd) {
- this.pwd = pwd;
- }
- public String getPwd2() {
- return pwd2;
- }
- public void setPwd2(String pwd2) {
- this.pwd2 = pwd2;
- }
- }</span>
AccountAction-validation.xml [與AccountAction同目錄]
- <span style="font-size: medium;"><?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE validators PUBLIC
- "-//OpenSymphony Group//XWork Validator 1.0.2//EN"
- "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
- <validators>
- <!-- 字段校驗 -->
- <field name="id">
- <field-validator type="required" short-circuit="true">
- <message>ID必填的</message>
- </field-validator>
- <field-validator type="int">
- <param name="min">20</param>
- <param name="max">50</param>
- <message>ID必須在 ${min} 到 ${max} 之間</message>
- </field-validator>
- </field>
- <field name="name">
- <field-validator type="requiredstring" short-circuit="true">
- <message>姓名是必填的</message>
- </field-validator>
- <field-validator type="regex">
- <param name="expression"><![CDATA[(^[a-zA-Z_]\w{3,9}$)]]></param>
- <message>姓名不合法</message>
- </field-validator>
- </field>
- <field name="pwd">
- <field-validator type="requiredstring" short-circuit="true">
- <message>密碼是必填的</message>
- </field-validator>
- </field>
- <!-- 非字段校驗 -->
- <validator type="fieldexpression">
- <param name="fieldName">pwd</param>
- <param name="fieldName">pwd2</param>
- <param name="expression"><![CDATA[pwd==pwd2]]></param><!-- OGNL表達式 -->
- <message>確認密碼和密碼輸入不一致</message>
- </validator>
- <field name="score">
- <field-validator type="double">
- <param name="minInclusive">0.0</param>
- <param name="maxInclusive">100.0</param>
- <message>成績必須在${minInclusive}和${maxInclusive}之間</message>
- </field-validator>
- </field>
- <field name="email" >
- <field-validator type="regex">
- <param name="expression"><![CDATA[(^[_A-Za-z0-9-]+(\.[_A-Za-z0-9-]+)*@([A-Za-z0-9-])+((\.com)|(\.cn)|(\.net)|(\.org)|(\.info)|(\.edu)|(\.mil)|(\.gov)|(\.biz)|(\.ws)|(\.us)|(\.tv)|(\.cc)|(\.aero)|(\.arpa)|(\.coop)|(\.int)|(\.jobs)|(\.museum)|(\.name)|(\.pro)|(\.travel)|(\.nato)|(\..{2,3})|(\..{2,3}\..{2,3}))$)]]></param>
- <message>郵箱不合法</message>
- </field-validator>
- </field>
- <field name="registed_date">
- <field-validator type="date">
- <param name="min">1970-01-01</param>
- <param name="max">2019-01-01</param>
- <message>註冊日期不合法</message>
- </field-validator>
- </field>
- </validators></span>
第二個示例:XML配置式校驗器---登錄和註冊頁面
user_login.jsp
- <span style="font-size: medium;"><%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
- <%@ taglib uri="/struts-tags" prefix="s" %>
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <html>
- <head>
- <title>Struts2中基於XML配置式的校驗器使用示例</title>
- </head>
- <body>
- <h3>XML配置式校驗器---登錄頁面</h3><hr/>
- <div style="color:red"><s:fielderror/></div>
- <form action="user_login.action" method="post">
- <table>
- <tr>
- <td>登錄名</td>
- <td><input type="text" name="user.name" value="${param['user.name']}"/></td>
- </tr>
- <tr>
- <td>密碼</td>
- <td><input type="password" name="user.pwd"/></td>
- </tr>
- <tr><td colspan="2"><input type="submit" value=" 提交 "/></td></tr>
- </table>
- </form>
- </body>
- </html></span>
user_registe.jsp
- <span style="font-size: medium;"><%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
- <%@ taglib uri="/struts-tags" prefix="s" %>
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <html>
- <head>
- <title>Struts2中基於XML配置式的校驗器使用示例</title>
- </head>
- <body>
- <h3>XML配置式校驗器---註冊頁面</h3><hr/>
- <div style="color:red"><s:fielderror/></div>
- <form action="user_registe.action" method="post">
- <table>
- <tr>
- <td>ID</td>
- <td><input type="text" name="user.id" value="${param['user.id']}"/></td>
- </tr>
- <tr>
- <td>登錄名</td>
- <td><input type="text" name="user.name" value="${param['user.name']}"/></td>
- </tr>
- <tr>
- <td>密碼</td>
- <td><input type="password" name="user.pwd"/></td>
- </tr>
- <tr>
- <td>重複密碼</td>
- <td><input type="password" name="user.pwd2"/></td>
- </tr>
- <tr>
- <td>時間</td>
- <td><input type="text" name="user.registed_date" value="${param['user.registed_date']}"/></td>
- </tr>
- <tr>
- <td>email</td>
- <td><input type="text" name="user.email" value="${param['user.email']}"/></td>
- </tr>
- <tr>
- <td>考試成績</td>
- <td><input type="text" name="user.score" value="${param['user.score']}"/></td>
- </tr>
- <tr>
- <td colspan="2"><input type="submit" value=" 提交 "/></td>
- </tr>
- </table>
- </form>
- </body>
- </html></span>
src/struts.xml
- <span style="font-size: medium;"><?xml version="1.0" encoding="UTF-8" ?>
- <!DOCTYPE struts PUBLIC
- "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
- "http://struts.apache.org/dtds/struts-2.1.7.dtd">
- <struts>
- <!-- 請求參數的編碼方式 -->
- <constant name="struts.i18n.encoding" value="UTF-8"/>
- <!-- 指定被struts2處理的請求後綴類型。多個用逗號隔開 -->
- <constant name="struts.action.extension" value="action,do,go,xkk"/>
- <!-- 當struts.xml改動後,是否重新加載。默認值爲false(生產環境下使用),開發階段最好打開 -->
- <constant name="struts.configuration.xml.reload" value="true"/>
- <!-- 是否使用struts的開發模式。開發模式會有更多的調試信息。默認值爲false(生產環境下使用),開發階段最好打開 -->
- <constant name="struts.devMode" value="false"/>
- <!-- 設置瀏覽器是否緩存靜態內容。默認值爲true(生產環境下使用),開發階段最好關閉 -->
- <constant name="struts.serve.static.browserCache" value="false" />
- <!-- 是否允許在OGNL表達式中調用靜態方法,默認值爲false -->
- <constant name="struts.ognl.allowStaticMethodAccess" value="true"/>
- <!-- 指定由spring負責action對象的創建
- <constant name="struts.objectFactory" value="spring" />
- -->
- <!-- 是否開啓動態方法調用 -->
- <constant name="struts.enable.DynamicMethodInvocation" value="false"/>
- <package name="my" extends="struts-default" namespace="/">
- <action name="user_*" class="com.javacrazyer.web.action.UserAction" method="{1}">
- <result name="success">/info.jsp</result>
- <result name="input">/user_{1}.jsp</result>
- </action>
- </package>
- </struts>
- </span>
UserAction.java
- <span style="font-size: medium;">package com.javacrazyer.web.action;
- import com.javacrazyer.domain.User;
- import com.opensymphony.xwork2.ActionSupport;
- public class UserAction extends ActionSupport {
- private static final long serialVersionUID = -2554018432709689579L;
- private User user; //自定義類型Field
- public String registe() throws Exception{
- System.out.println("registe======================");
- return SUCCESS;
- }
- public String login() throws Exception{
- return SUCCESS;
- }
- /*
- public void validate(){
- System.out.println("調用validate方法");
- }
- //執行exceute方法前調用
- public void validateRegiste(){
- System.out.println("調用validateRegiste方法");
- String lname = user.getLoginname();
- if(null != lname && !lname.trim().matches("[a-zA-Z_]\\w{3,19}")){
- this.addFieldError("loginname", "用戶名不能爲空,且只能由4-20個字母和數字組成");
- //this.addActionError("用戶名不能爲空,且只能由4-20個字母和數字組成");
- }
- }
- public void validateLogin(){
- System.out.println("調用validateLogin方法");
- }
- */
- public User getUser() {
- return user;
- }
- public void setUser(User user) {
- this.user = user;
- }
- }</span>
UserAction-user_login-validation.xml
- <span style="font-size: medium;"><?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE validators PUBLIC
- "-//OpenSymphony Group//XWork Validator 1.0.2//EN"
- "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
- <validators>
- <!-- 針對自定義Field使用visitor校驗 -->
- <field name="user">
- <field-validator type="required" short-circuit="true">
- <message>用戶的信息必填</message><!-- 消息前綴 -->
- </field-validator>
- <field-validator type="visitor">
- <param name="context">userLoginContext</param><!-- 指定本visitor校驗的上下文 -->
- <param name="appendPrefix">true</param><!-- 是否要添加校驗失敗消息的前綴 -->
- <message>用戶的</message><!-- 消息前綴 -->
- </field-validator>
- </field>
- </validators></span>
UserAction-user_registe-validation.xml
- <span style="font-size: medium;"><?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE validators PUBLIC
- "-//OpenSymphony Group//XWork Validator 1.0.2//EN"
- "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
- <validators>
- <!-- 針對自定義Field使用visitor校驗 -->
- <field name="user">
- <field-validator type="required" short-circuit="true">
- <message>用戶的信息必填</message><!-- 消息前綴 -->
- </field-validator>
- <field-validator type="visitor">
- <param name="context">userContext</param><!-- 指定本visitor校驗的上下文 -->
- <param name="appendPrefix">true</param><!-- 是否要添加校驗失敗消息的前綴 -->
- <message>用戶的</message><!-- 消息前綴 -->
- </field-validator>
- </field>
- </validators></span>
第三個示例:註解方式校驗器---註冊頁面
acc2_registe.jsp
- <span style="font-size: medium;"><%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
- <%@ taglib uri="/struts-tags" prefix="s" %>
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <html>
- <head>
- <title>Struts2中基於Annotation配置式的校驗器使用示例</title>
- </head>
- <body>
- <h3>Annotation配置式校驗器---註冊頁面</h3><hr/>
- <div style="color:red"><s:fielderror/></div>
- <form action="acc2_registe.action" method="post">
- <table>
- <tr>
- <td>ID</td>
- <td><input type="text" name="id" value="${param.id}"/></td>
- </tr>
- <tr>
- <td>登錄名</td>
- <td><input type="text" name="name" value="${param.name}"/></td>
- </tr>
- <tr>
- <td>密碼</td>
- <td><input type="password" name="pwd"/></td>
- </tr>
- <tr>
- <td>重複密碼</td>
- <td><input type="password" name="pwd2"/></td>
- </tr>
- <tr>
- <td>時間</td>
- <td><input type="text" name="registed_date" value="${param.registed_date}"/></td>
- </tr>
- <tr>
- <td>email</td>
- <td><input type="text" name="email" value="${param.email}"/></td>
- </tr>
- <tr>
- <td>考試成績</td>
- <td><input type="text" name="score" value="${param.score}"/></td>
- </tr>
- <tr>
- <td colspan="2"><input type="submit" value=" 提交 "/></td>
- </tr>
- </table>
- </form>
- </body>
- </html></span>
src/struts.xml
- <span style="font-size: medium;"><?xml version="1.0" encoding="UTF-8" ?>
- <!DOCTYPE struts PUBLIC
- "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
- "http://struts.apache.org/dtds/struts-2.1.7.dtd">
- <struts>
- <!-- 請求參數的編碼方式 -->
- <constant name="struts.i18n.encoding" value="UTF-8"/>
- <!-- 指定被struts2處理的請求後綴類型。多個用逗號隔開 -->
- <constant name="struts.action.extension" value="action,do,go,xkk"/>
- <!-- 當struts.xml改動後,是否重新加載。默認值爲false(生產環境下使用),開發階段最好打開 -->
- <constant name="struts.configuration.xml.reload" value="true"/>
- <!-- 是否使用struts的開發模式。開發模式會有更多的調試信息。默認值爲false(生產環境下使用),開發階段最好打開 -->
- <constant name="struts.devMode" value="false"/>
- <!-- 設置瀏覽器是否緩存靜態內容。默認值爲true(生產環境下使用),開發階段最好關閉 -->
- <constant name="struts.serve.static.browserCache" value="false" />
- <!-- 是否允許在OGNL表達式中調用靜態方法,默認值爲false -->
- <constant name="struts.ognl.allowStaticMethodAccess" value="true"/>
- <!-- 指定由spring負責action對象的創建
- <constant name="struts.objectFactory" value="spring" />
- -->
- <!-- 是否開啓動態方法調用 -->
- <constant name="struts.enable.DynamicMethodInvocation" value="false"/>
- <package name="my" extends="struts-default" namespace="/">
- <action name="acc2_*" class="com.javacrazyer.web.action.Account2Action" method="{1}">
- <result name="success">/info.jsp</result>
- <result name="input">/acc2_{1}.jsp</result>
- </action>
- </package>
- </struts>
- </span>
Account2Action.java
- <span style="font-size: medium;">package com.javacrazyer.web.action;
- import java.util.Date;
- import org.apache.struts2.interceptor.validation.SkipValidation;
- import com.opensymphony.xwork2.ActionSupport;
- import com.opensymphony.xwork2.validator.annotations.FieldExpressionValidator;
- import com.opensymphony.xwork2.validator.annotations.RegexFieldValidator;
- import com.opensymphony.xwork2.validator.annotations.RequiredStringValidator;
- import com.opensymphony.xwork2.validator.annotations.Validations;
- import com.opensymphony.xwork2.validator.annotations.ValidatorType;
- /**
- * 使用註解來配置校驗的示例
- *
- */
- public class Account2Action extends ActionSupport {
- private static final long serialVersionUID = -1418893621512812472L;
- private Integer id;
- private String name;
- private String pwd;
- private String pwd2;
- private Double score;
- private Date registed_date;
- private String email;
- @Validations(
- requiredStrings={@RequiredStringValidator(fieldName="name",message="我的用戶名是必須的",shortCircuit=true,trim=true,type=ValidatorType.FIELD),
- @RequiredStringValidator(fieldName="pwd",message="我的密碼是必須的",shortCircuit=true,trim=true,type=ValidatorType.FIELD)},
- fieldExpressions={@FieldExpressionValidator(fieldName="pwd", message="兩次密碼不相同",expression="pwd==pwd2")},
- regexFields={@RegexFieldValidator(expression="^[_A-Za-z0-9-]+(\\.[_A-Za-z0-9-]+)*@([A-Za-z0-9-])+((\\.com)|(\\.cn)|(\\.net)|(\\.org)|(\\.info)|(\\.edu)|(\\.mil)|(\\.gov)|(\\.biz)|(\\.ws)|(\\.us)|(\\.tv)|(\\.cc)|(\\.aero)|(\\.arpa)|(\\.coop)|(\\.int)|(\\.jobs)|(\\.museum)|(\\.name)|(\\.pro)|(\\.travel)|(\\.nato)|(\\..{2,3})|(\\..{2,3}\\..{2,3}))$")}
- )
- public String registe() throws Exception{
- System.out.println("registe-------------------");
- return SUCCESS;
- }
- @SkipValidation
- public String login()throws Exception{
- return SUCCESS;
- }
- public Integer getId() {
- return id;
- }
- public void setId(Integer id) {
- this.id = id;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public Double getScore() {
- return score;
- }
- public void setScore(Double score) {
- this.score = score;
- }
- public Date getRegisted_date() {
- return registed_date;
- }
- public void setRegisted_date(Date registedDate) {
- registed_date = registedDate;
- }
- public String getEmail() {
- return email;
- }
- public void setEmail(String email) {
- this.email = email;
- }
- public String getPwd() {
- return pwd;
- }
- public void setPwd(String pwd) {
- this.pwd = pwd;
- }
- public String getPwd2() {
- return pwd2;
- }
- public void setPwd2(String pwd2) {
- this.pwd2 = pwd2;
- }
- }</span>
第四個示例:註解方式校驗器---用戶註冊頁面
user2_registe.jsp
- <span style="font-size: medium;"><%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
- <%@ taglib uri="/struts-tags" prefix="s" %>
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <html>
- <head>
- <title>Struts2中基於XML配置式的校驗器使用示例</title>
- </head>
- <body>
- <h3>XML配置式校驗器---註冊頁面</h3><hr/>
- <div style="color:red"><s:fielderror/></div>
- <form action="user2_registe.action" method="post">
- <table>
- <tr>
- <td>ID</td>
- <td><input type="text" name="user.id" value="${param['user.id']}"/></td>
- </tr>
- <tr>
- <td>登錄名</td>
- <td><input type="text" name="user.name" value="${param['user.name']}"/></td>
- </tr>
- <tr>
- <td>密碼</td>
- <td><input type="password" name="user.pwd"/></td>
- </tr>
- <tr>
- <td>重複密碼</td>
- <td><input type="password" name="user.pwd2"/></td>
- </tr>
- <tr>
- <td>時間</td>
- <td><input type="text" name="user.registed_date" value="${param['user.registed_date']}"/></td>
- </tr>
- <tr>
- <td>email</td>
- <td><input type="text" name="user.email" value="${param['user.email']}"/></td>
- </tr>
- <tr>
- <td>考試成績</td>
- <td><input type="text" name="user.score" value="${param['user.score']}"/></td>
- </tr>
- <tr>
- <td colspan="2"><input type="submit" value=" 提交 "/></td>
- </tr>
- </table>
- </form>
- </body>
- </html></span>
src/struts.xml
- <span style="font-size: medium;"><?xml version="1.0" encoding="UTF-8" ?>
- <!DOCTYPE struts PUBLIC
- "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
- "http://struts.apache.org/dtds/struts-2.1.7.dtd">
- <struts>
- <!-- 請求參數的編碼方式 -->
- <constant name="struts.i18n.encoding" value="UTF-8"/>
- <!-- 指定被struts2處理的請求後綴類型。多個用逗號隔開 -->
- <constant name="struts.action.extension" value="action,do,go,xkk"/>
- <!-- 當struts.xml改動後,是否重新加載。默認值爲false(生產環境下使用),開發階段最好打開 -->
- <constant name="struts.configuration.xml.reload" value="true"/>
- <!-- 是否使用struts的開發模式。開發模式會有更多的調試信息。默認值爲false(生產環境下使用),開發階段最好打開 -->
- <constant name="struts.devMode" value="false"/>
- <!-- 設置瀏覽器是否緩存靜態內容。默認值爲true(生產環境下使用),開發階段最好關閉 -->
- <constant name="struts.serve.static.browserCache" value="false" />
- <!-- 是否允許在OGNL表達式中調用靜態方法,默認值爲false -->
- <constant name="struts.ognl.allowStaticMethodAccess" value="true"/>
- <!-- 指定由spring負責action對象的創建
- <constant name="struts.objectFactory" value="spring" />
- -->
- <!-- 是否開啓動態方法調用 -->
- <constant name="struts.enable.DynamicMethodInvocation" value="false"/>
- <package name="my" extends="struts-default" namespace="/">
- <!-- 使用Annotation配置校驗的Action -->
- <action name="user2_*" class="com.javacrazyer.web.action.User2Action" method="{1}">
- <result name="success">/info.jsp</result>
- <result name="input">/user2_{1}.jsp</result>
- </action>
- </package>
- </struts>
- </span>
User2Action.java
- <span style="font-size: medium;">package com.javacrazyer.web.action;
- import com.javacrazyer.domain.User;
- import com.opensymphony.xwork2.ActionSupport;
- import com.opensymphony.xwork2.validator.annotations.FieldExpressionValidator;
- import com.opensymphony.xwork2.validator.annotations.RegexFieldValidator;
- import com.opensymphony.xwork2.validator.annotations.RequiredStringValidator;
- import com.opensymphony.xwork2.validator.annotations.Validations;
- import com.opensymphony.xwork2.validator.annotations.ValidatorType;
- /**
- * 使用註解來配置校驗器
- *
- */
- public class User2Action extends ActionSupport {
- private static final long serialVersionUID = -2554018432709689579L;
- private User user; //自定義類型Field
- @Validations(
- requiredStrings={@RequiredStringValidator(fieldName="user.name",message="你的用戶名是必須的",shortCircuit=true,trim=true,type=ValidatorType.FIELD),
- @RequiredStringValidator(fieldName="user.pwd",message="人的密碼是必須的",shortCircuit=true,trim=true,type=ValidatorType.FIELD)},
- fieldExpressions={@FieldExpressionValidator(fieldName="user.pwd", message="兩次密碼不相同",expression="user.pwd==user.pwd2")},
- regexFields={@RegexFieldValidator(fieldName="user.email",message="郵箱不合法",expression="^[_A-Za-z0-9-]+(\\.[_A-Za-z0-9-]+)*@([A-Za-z0-9-])+((\\.com)|(\\.cn)|(\\.net)|(\\.org)|(\\.info)|(\\.edu)|(\\.mil)|(\\.gov)|(\\.biz)|(\\.ws)|(\\.us)|(\\.tv)|(\\.cc)|(\\.aero)|(\\.arpa)|(\\.coop)|(\\.int)|(\\.jobs)|(\\.museum)|(\\.name)|(\\.pro)|(\\.travel)|(\\.nato)|(\\..{2,3})|(\\..{2,3}\\..{2,3}))$")}
- )
- public String registe() throws Exception{
- System.out.println("registe======================");
- return SUCCESS;
- }
- public String login() throws Exception{
- return SUCCESS;
- }
- public User getUser() {
- return user;
- }
- public void setUser(User user) {
- this.user = user;
- }
- }</span>
另附:
User.java
- <span style="font-size: medium;">package com.javacrazyer.domain;
- import java.util.Date;
- public class User {
- private Integer id;
- private String name;
- private String pwd;
- private String pwd2;
- private Double score;
- private Date registed_date;
- private String email;
- public User(){}
- public Integer getId() {
- return id;
- }
- public void setId(Integer id) {
- this.id = id;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public String getPwd() {
- return pwd;
- }
- public void setPwd(String pwd) {
- this.pwd = pwd;
- }
- public String getPwd2() {
- return pwd2;
- }
- public void setPwd2(String pwd2) {
- this.pwd2 = pwd2;
- }
- public Double getScore() {
- return score;
- }
- public void setScore(Double score) {
- this.score = score;
- }
- public Date getRegisted_date() {
- return registed_date;
- }
- public void setRegisted_date(Date registedDate) {
- registed_date = registedDate;
- }
- public String getEmail() {
- return email;
- }
- public void setEmail(String email) {
- this.email = email;
- }
- }</span>
與user.java同一目錄的User-userContext-validation.xml
- <span style="font-size: medium;"><?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE validators PUBLIC
- "-//OpenSymphony Group//XWork Validator 1.0.2//EN"
- "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
- <validators>
- <!-- 字段校驗 -->
- <field name="id">
- <field-validator type="required" short-circuit="true">
- <message>ID必填的</message>
- </field-validator>
- <field-validator type="int">
- <param name="min">20</param>
- <param name="max">50</param>
- <message>ID必須在 ${min} 到 ${max} 之間</message>
- </field-validator>
- </field>
- <field name="name">
- <field-validator type="requiredstring" short-circuit="true">
- <message>姓名是必填的</message>
- </field-validator>
- <field-validator type="regex">
- <param name="expression"><![CDATA[(^[a-zA-Z_]\w{3,9}$)]]></param>
- <message>姓名不合法</message>
- </field-validator>
- </field>
- <field name="pwd">
- <field-validator type="requiredstring" short-circuit="true">
- <message>密碼是必填的</message>
- </field-validator>
- </field>
- <!-- 非字段校驗 -->
- <validator type="fieldexpression">
- <param name="fieldName">pwd</param>
- <param name="fieldName">pwd2</param>
- <param name="expression"><![CDATA[pwd==pwd2]]></param><!-- OGNL表達式 -->
- <message>確認密碼和密碼輸入不一致</message>
- </validator>
- <field name="score">
- <field-validator type="double">
- <param name="minInclusive">0.0</param>
- <param name="maxInclusive">100.0</param>
- <message>成績必須在${minInclusive}和${maxInclusive}之間</message>
- </field-validator>
- </field>
- <field name="email">
- <field-validator type="regex">
- <param name="expression"><![CDATA[(^[_A-Za-z0-9-]+(\.[_A-Za-z0-9-]+)*@([A-Za-z0-9-])+((\.com)|(\.cn)|(\.net)|(\.org)|(\.info)|(\.edu)|(\.mil)|(\.gov)|(\.biz)|(\.ws)|(\.us)|(\.tv)|(\.cc)|(\.aero)|(\.arpa)|(\.coop)|(\.int)|(\.jobs)|(\.museum)|(\.name)|(\.pro)|(\.travel)|(\.nato)|(\..{2,3})|(\..{2,3}\..{2,3}))$)]]></param>
- <message>郵箱不合法</message>
- </field-validator>
- </field>
- <field name="registed_date">
- <field-validator type="date">
- <param name="min">1970-01-01</param>
- <param name="max">2019-01-01</param>
- <message>註冊日期不合法</message>
- </field-validator>
- </field>
- </validators></span>
與User.java同一目錄下的User-userLoginContext-validation.xml
- <span style="font-size: medium;"><?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE validators PUBLIC
- "-//OpenSymphony Group//XWork Validator 1.0.2//EN"
- "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
- <validators>
- <field name="name">
- <field-validator type="requiredstring" short-circuit="true">
- <message>姓名是必填的</message>
- </field-validator>
- <field-validator type="regex">
- <param name="expression"><![CDATA[(^[a-zA-Z_]\w{3,9}$)]]></param>
- <message>姓名不合法</message>
- </field-validator>
- </field>
- <field name="pwd">
- <field-validator type="requiredstring" short-circuit="true">
- <message>密碼是必填的</message>
- </field-validator>
- </field>
- </validators></span>