溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Struts2學習教程之輸入校驗示例詳解

發布時間:2020-08-30 22:21:04 來源:腳本之家 閱讀:374 作者:果凍想 欄目:編程語言

前言

數據校驗幾乎是每個應用都要做的工作。用戶輸入的數據,發送到服務器端,天知道用戶輸入的數據是否是合法的,是否為惡意輸入。所以一個健壯的應用系統必須對用戶的輸入進行校驗,將非法的輸入阻止在應用之外,防止這些非法的輸入進入系統,從而保證系統的穩定性、安全性。

我們都知道,為了更好的用戶體驗,以及更高的效率,現在的Web應用都存在以下兩重數據校驗:

  • 客戶端數據校驗
  • 服務器端數據校驗

對于客戶端數據校驗主要是通過JavaScript代碼來完成;而對于服務器端數據校驗是整個應用阻止非法數據的最后防線,主要通過在應用中編程實現。

Struts2框架為了減輕開發人員的工作量,提高工作效率,在數據校驗這方面也下了很大功夫,那么Struts2是如何完成數據校驗的呢?(由于Struts2框架的客戶端校驗能力較弱,不予總結,這篇文章主要總結Struts2框架的服務器端數據校驗功能)

編寫校驗規則文件

我們都知道數據校驗都是一些繁瑣的代碼,為了從這些繁瑣的代碼中抽身出來,Struts2框架提供了基于配置文件的數據校驗,只需要編寫校驗規則文件即可,校驗規則文件指定每個表單域應該滿足怎樣的規則。

下面通過一個Demo示例來說說Struts2框架的輸入校驗。

前臺頁面:

<body>
 <form action="login" method="post"> 
  用戶名:<input type="text" name="name" /><s:fielderror fieldName="name" /><br>
  密碼:<input type="password" name="password" /><s:fielderror fieldName="password" /><br>
  年齡:<input type="text" name="age" /><s:fielderror fieldName="age" /><br>
  生日:<input type="text" name="birthday" /><s:fielderror fieldName="birthday" /><br>
   <input type="submit" value="提交" />
 </form>
</body>

后臺Action處理代碼:

public class LoginAction extends ActionSupport
{
 private String name;
 private String password;
 private int age;
 private Date birthday;
 private String tip;

 public void setName(String name)
 {
  this.name = name;
 }

 public String getName()
 {
  return name;
 }

 public void setPassword(String password)
 {
  this.password = password;
 }

 public String getPassword()
 {
  return password;
 }

 public void setAge(int age)
 {
  this.age = age;
 }

 public int getAge()
 {
  return age;
 }

 public void setBirthday(Date birthday)
 {
  this.birthday = birthday;
 }

 public Date getBirthday()
 {
  return birthday;
 }

 public void setTip(String tip)
 {
  this.tip = tip;
 }

 public String getTip()
 {
  return tip;
 }

 public String execute() throws Exception
 {
  // 這里簡化了操作
  return SUCCESS;
 }
}

通過上面的Action代碼可以看到,我并沒有為添加任何的字段校驗代碼,而我們只需要編寫一個校驗文件,如下:

<?xml version="1.0" encoding="UTF-8"?>
<!-- 指定校驗配置文件的DTD信息 -->
<!DOCTYPE validators PUBLIC "-//Apache Struts//XWork Validator 1.0.2//EN"
 "http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd">
<!-- 校驗文件的根元素 -->
<validators>
 <!-- 校驗Action的name屬性 -->
 <field name="name">
  <!-- 指定name屬性必須滿足必填規則 -->
  <field-validator type="requiredstring">
   <param name="trim">true</param>
   <message>必須填入名字</message>
  </field-validator>
  <!-- 指定name屬性必須匹配正則表達式 -->
  <field-validator type="regex">
   <param name="regexExpression"><![CDATA[(\w{4,25})]]></param>
   <message>您輸入的用戶名只能是字母和數字,且長度必須在4到25之間</message>
  </field-validator>
 </field>

 <!-- 校驗Action的password屬性 -->
 <field name="password">
  <field-validator type="requiredstring">
   <param name="trim">true</param>
   <message>必須輸入密碼</message>
  </field-validator>
  <field-validator type="regex">
   <param name="regexExpression"><![CDATA[(\w{4,25})]]></param>
   <message>您輸入的用戶名只能是字母和數字,且長度必須在4到25之間</message>
  </field-validator>
 </field>

 <!-- 校驗Action的age屬性 -->
 <field name="age">
  <field-validator type="int">
   <param name="min">1</param>
   <param name="max">150</param>
   <message>年齡必須在1到150之間</message>
  </field-validator>
 </field>

 <!-- 校驗Action的birthday屬性 -->
 <field name="birthday">
  <field-validator type="date">
   <param name="min">1900-01-01</param>
   <param name="max">2050-02-21</param>
   <message>生日必須在 ${min}到${max}之間</message>
  </field-validator>
 </field>
</validators>

Struts2的校驗文件規則與Struts1的校驗文件設計方式不同,Struts2中每個Action都有一個校驗文件,因此該校驗文件的文件名應該遵守如下規則:

<Action名字>-validation.xml

前面的Action名是可以改變的,后面的-validation.xml部分總是固定的,且該校驗文件應該被保存在與Action class文件相同的路徑下。

與類型轉換失敗相似的是,當輸入校驗失敗后,Struts2也是自動返回名為"input"的Result,因此需要在struts.xml文件中配置名為"input"的Result。

國際化提示信息

對于校驗失敗的情況下,就需要給用戶提示錯誤信息,那么現在就出現了個問題,在多語言環境下,如何正確的提示對應語言的提示信息呢?像上面那樣直接在校驗文件中寫死可不行。為了國際化提示信息,為message元素指定key屬性,該key屬性指定是國際化提示信息對應key。

例如,上述的校驗文件,可以大致寫成這樣:

<!-- 校驗Action的name屬性 -->
<field name="name">
 <!-- 指定name屬性必須滿足必填規則 -->
 <field-validator type="requiredstring">
  <param name="trim">true</param>
  <message key="name.required"/>
 </field-validator>
 <!-- 指定name屬性必須匹配正則表達式 -->
 <field-validator type="regex">
  <param name="regexExpression"><![CDATA[(\w{4,25})]]></param>
  <message key="name.regex"/>
 </field-validator>
</field>

內建校驗器

在上面的校驗文件中,可以看到這樣的語句:

<field-validator type="requiredstring">
<field-validator type="regex">
...

這里的type屬性值就是校驗器。在Struts2框架內部提供了大量的內建校驗器,這些內建的校驗器可以滿足大部分應用的校驗需求,我們只需要使用這些校驗器即可。

我們可以使用解壓縮工具打開xwork-core-2.3.24.1.jar文件,在xwork-core-2.3.24.1.jar\com\opensymphony\xwork2\validator\validators路徑下可以找到一個default.xml文件,這個文件就是Struts2默認的校驗器注冊文件,內容如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
  "-//Apache Struts//XWork Validator Definition 1.0//EN"
  "http://struts.apache.org/dtds/xwork-validator-definition-1.0.dtd">

<!-- START SNIPPET: validators-default -->
<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="long" class="com.opensymphony.xwork2.validator.validators.LongRangeFieldValidator"/>

 <!-- 短整數校驗器 -->
 <validator name="short" class="com.opensymphony.xwork2.validator.validators.ShortRangeFieldValidator"/>

 <!-- 雙精度浮點數校驗器 -->
 <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"/>

 <!-- URL校驗器 -->
 <validator name="url" class="com.opensymphony.xwork2.validator.validators.URLValidator"/>

 <!-- visitor校驗器 -->
 <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"/>
 <validator name="conditionalvisitor" class="com.opensymphony.xwork2.validator.validators.ConditionalVisitorFieldValidator"/>
</validators>
<!-- END SNIPPET: validators-default -->

關于這些校驗器的具體使用,這里就不一一舉例了。

總結

這篇文章對Struts2框架中的校驗器進行了簡單的總結,對于這里說的校驗器,基礎的是如何使用,而最重要的是掌握Struts2校驗器這種思想,將寫代碼來做的事情,通過配置來完成,這種方法很值得我們借鑒,在我們學習其它框架中,我們也會碰到這種方式。學習,痛并快樂著。

好了,以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女