struts2之數據校驗
概述
在提交表單數據時,如果數據需要保存到數據庫,空輸入等可能會引發一些異常,為了避免引起用戶的輸入引起底層異常,通常在進行業務邏輯操作之前,先執行基本的數據校驗。
下面通過四種方式來闡述Struts 2的數據校驗功能。
校驗前準備工作
1.創建實體類
public class UserInfo { private String uname; private String upwd; private String repwd; public String getUname() { return uname; } public void setUname(String uname) { this.uname = uname; } public String getUpwd() { return upwd; } public void setUpwd(String upwd) { this.upwd = upwd; } public String getRepwd() { return repwd; } public void setRepwd(String repwd) { this.repwd = repwd; } }
2.創建Action
public class LoginAction extends ActionSupport { private UserInfo info; @Override public String execute() throws Exception { return SUCCESS; } public UserInfo getInfo() { return info; } public void setInfo(UserInfo info) { this.info = info; } }
3.jsp頁面
<h1>用戶注冊</h1> <s:fielderror></s:fielderror> <s:form action="aaaaa" method="POST"> <s:textarea label="用戶名" name="info.uname"/><br> <s:password label="密碼" name="info.upwd"/><br> <s:password label="確認密碼" name="info.repwd"/><br> <s:submit value="注冊"/>
一 用execute()實現校驗
@Override public String execute() throws Exception { if (info.getUname().length()==0){ addFieldError("uname","用戶名不能為空"); } if (info.getUpwd().length()==0){ addFieldError("upwd","密碼不能為空"); } if(!info.getRepwd().equals(info.getUpwd())){ addFieldError("repwd","兩次輸入密碼不一致"); } if(this.hasFieldErrors()){ return INPUT; } return SUCCESS; }
struts.xml配置
<!--使用execute()方法實現數據校驗--> <action name="loginAction" class="cn.happy.action.LoginAction"> <result name="input">login.jsp</result> <result name="success">sucess.jsp</result> </action>
二.使用validate()實現數據校驗
@Override public void validate() { if (info.getUname().length()==0){ addFieldError("uname","用戶名不能為空"); } if (info.getUpwd().length()==0){ addFieldError("upwd","密碼不能為空"); } if(!info.getRepwd().equals(info.getUpwd())){ addFieldError("repwd","兩次輸入密碼不一致"); } }
struts.xml配置
<!--使用validate()實現數據校驗-->
<action name="loginAction" class="cn.happy.action.LoginAction">
<result name="input">login.jsp</result>
<result name="success">sucess.jsp</result>
</action>
三.使用validateXxx()方法實現數據校驗
public void validateRegist(){ if(info.getUname().length()<6||info.getUname().length()>15){ addFieldError("uname","用戶名長度在6-15位"); } if(info.getUpwd().length()<6){ addFieldError("upwd","密碼要大于6位"); } } public String Regist(){ return SUCCESS; } public void validate() { if (info.getUname().length()==0){ addFieldError("uname","用戶名不能為空"); } if (info.getUpwd().length()==0){ addFieldError("upwd","密碼不能為空"); } if(!info.getRepwd().equals(info.getUpwd())){ addFieldError("repwd","兩次輸入密碼不一致"); } }
struts.xml配置
配置action元素,指定Action由Regist()方法來進行請求的處理
<!--使用validateXxx()方法實現數據校驗-->
<action name="loginAction" class="cn.happy.action.LoginAction" method="Regist">
<result name="input">login.jsp</result>
<result name="success">sucess.jsp</result>
</action>
四.使用框架驗證
已有的校驗器
Struts 2.0已經為您實現很多常用的校驗了,以下在jar的default.xml中的注冊的校驗器。
< 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 >
使用校驗框架既可以方便地實現表單數據校驗,又能夠將校驗與Action分離,故我們應該盡可能使用校驗框架。
1編寫驗證文件,驗證文件要和驗證的Action放在同一個包下,并且采用ClassName-validation.xml方式命名,其中ClassName表示Action的類名
LoginAction-validation.xml編寫
<!DOCTYPE validators PUBLIC "-//Apache Struts//XWork Validator 1.0.3//EN" "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd"> <validators> <!--用戶名不能為空,長度在6-15位--> <field name="info.uname"> <field-validator type="requiredstring"> <param name="trim">true</param> <message>用戶名不能為空</message> </field-validator> <field-validator type="stringlength"> <param name="maxLength">15</param> <param name="minLength">6</param> <message>用戶名長度必須在${minLength}和${maxLength}之間</message> </field-validator> </field> <!--驗證密碼不為空,長度不小于6--> <field name="info.upwd"> <field-validator type="requiredstring"> <param name="trim">true</param> <message>密碼不能為空</message> </field-validator> <field-validator type="stringlength"> <param name="minLength">6</param> <message>密碼長度應大于等于${minLength}</message> </field-validator> </field> <!--驗證確認密碼--> <field name="info.repwd"> <field-validator type="fieldexpression"> <param name="expression">info.upwd==info.repwd</param> <message>兩次輸入密碼要相同</message> </field-validator> </field> </validators>
struts.xml配置
<!--使用框架驗證-->
<action name="aaaaa" class="cn.happy.action.LoginAction" >
<result name="input">login.jsp</result>
<result name="success">sucess.jsp</result>
</action>
上述的輸出說明了Struts 2.0的數據校驗工作方式,它需要經過下面幾個步驟:
- 通過轉換器將請求參數轉換成相應的Bean屬性;
- 判斷轉換過程是否出現異常。如果有,則將其保存到ActionContext中,conversionError攔截器再封裝為fieldError;如果沒有,進行下一步;
- 通過反射(Reflection)來調用validateXxx()方法(其中,Xxx表示Action的方法名);
- 調用validate()方法;
- 如果經過上述步驟沒有出現fieldError,則調用Action方法;如果有,則會跳過Action方法,通過國際化將fieldError輸出到頁面。
不喜歡看文字的朋友,可以參考下面的圖1。

看到這里可能大家會疑問:“這么多地方可以校驗表單數據,到底我應該在那里做呢?”有選擇是好事,但抉擇的過程往往是痛苦的,往往讓人不知所措。如果大家參照以下幾點建議,相信會比較容易地做出正確的抉擇。
- 如果需要轉換的數據,通常做法在轉換的時候做格式的校驗,在Action中的校驗方法中校驗取值。假如用戶填錯了格式,我們可以通過在資源文件配置invalid.fieldvalue.xxx(xxx為屬性名)來提示用戶正確的格式,不同的階段出錯顯示不同的信息。具體做法請參考上面的例子;
- 至于用validate()還是validateXxx(),我推薦使用validate()。原因是validateXxx()使用了反射,相對來說性能稍差,而validate()則是通過接口com.opensymphony.xwork2.Validateable調用。當然如果你的表單數據取值是取決于特定Action方法,則應該使用validateXxx()。
浙公網安備 33010602011771號