Struts2學(xué)習(xí)教程之輸入校驗示例詳解
前言
數(shù)據(jù)校驗幾乎是每個應(yīng)用都要做的工作。用戶輸入的數(shù)據(jù),發(fā)送到服務(wù)器端,天知道用戶輸入的數(shù)據(jù)是否是合法的,是否為惡意輸入。所以一個健壯的應(yīng)用系統(tǒng)必須對用戶的輸入進(jìn)行校驗,將非法的輸入阻止在應(yīng)用之外,防止這些非法的輸入進(jìn)入系統(tǒng),從而保證系統(tǒng)的穩(wěn)定性、安全性。
我們都知道,為了更好的用戶體驗,以及更高的效率,現(xiàn)在的Web應(yīng)用都存在以下兩重數(shù)據(jù)校驗:
- 客戶端數(shù)據(jù)校驗
- 服務(wù)器端數(shù)據(jù)校驗
對于客戶端數(shù)據(jù)校驗主要是通過JavaScript代碼來完成;而對于服務(wù)器端數(shù)據(jù)校驗是整個應(yīng)用阻止非法數(shù)據(jù)的最后防線,主要通過在應(yīng)用中編程實現(xiàn)。
Struts2框架為了減輕開發(fā)人員的工作量,提高工作效率,在數(shù)據(jù)校驗這方面也下了很大功夫,那么Struts2是如何完成數(shù)據(jù)校驗的呢?(由于Struts2框架的客戶端校驗?zāi)芰^弱,不予總結(jié),這篇文章主要總結(jié)Struts2框架的服務(wù)器端數(shù)據(jù)校驗功能)
編寫校驗規(guī)則文件
我們都知道數(shù)據(jù)校驗都是一些繁瑣的代碼,為了從這些繁瑣的代碼中抽身出來,Struts2框架提供了基于配置文件的數(shù)據(jù)校驗,只需要編寫校驗規(guī)則文件即可,校驗規(guī)則文件指定每個表單域應(yīng)該滿足怎樣的規(guī)則。
下面通過一個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屬性必須滿足必填規(guī)則 --> <field-validator type="requiredstring"> <param name="trim">true</param> <message>必須填入名字</message> </field-validator> <!-- 指定name屬性必須匹配正則表達(dá)式 --> <field-validator type="regex"> <param name="regexExpression"><![CDATA[(\w{4,25})]]></param> <message>您輸入的用戶名只能是字母和數(shù)字,且長度必須在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>您輸入的用戶名只能是字母和數(shù)字,且長度必須在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的校驗文件規(guī)則與Struts1的校驗文件設(shè)計方式不同,Struts2中每個Action都有一個校驗文件,因此該校驗文件的文件名應(yīng)該遵守如下規(guī)則:
<Action名字>-validation.xml
前面的Action名是可以改變的,后面的-validation.xml部分總是固定的,且該校驗文件應(yīng)該被保存在與Action class文件相同的路徑下。
與類型轉(zhuǎn)換失敗相似的是,當(dāng)輸入校驗失敗后,Struts2也是自動返回名為"input"的Result,因此需要在struts.xml文件中配置名為"input"的Result。
國際化提示信息
對于校驗失敗的情況下,就需要給用戶提示錯誤信息,那么現(xiàn)在就出現(xiàn)了個問題,在多語言環(huán)境下,如何正確的提示對應(yīng)語言的提示信息呢?像上面那樣直接在校驗文件中寫死可不行。為了國際化提示信息,為message元素指定key屬性,該key屬性指定是國際化提示信息對應(yīng)key。
例如,上述的校驗文件,可以大致寫成這樣:
<!-- 校驗Action的name屬性 --> <field name="name"> <!-- 指定name屬性必須滿足必填規(guī)則 --> <field-validator type="requiredstring"> <param name="trim">true</param> <message key="name.required"/> </field-validator> <!-- 指定name屬性必須匹配正則表達(dá)式 --> <field-validator type="regex"> <param name="regexExpression"><![CDATA[(\w{4,25})]]></param> <message key="name.regex"/> </field-validator> </field>
內(nèi)建校驗器
在上面的校驗文件中,可以看到這樣的語句:
<field-validator type="requiredstring"> <field-validator type="regex"> ...
這里的type屬性值就是校驗器。在Struts2框架內(nèi)部提供了大量的內(nèi)建校驗器,這些內(nèi)建的校驗器可以滿足大部分應(yīng)用的校驗需求,我們只需要使用這些校驗器即可。
我們可以使用解壓縮工具打開xwork-core-2.3.24.1.jar文件,在xwork-core-2.3.24.1.jar\com\opensymphony\xwork2\validator\validators路徑下可以找到一個default.xml文件,這個文件就是Struts2默認(rèn)的校驗器注冊文件,內(nèi)容如下:
<?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"/> <!-- 整數(shù)校驗器 --> <validator name="int" class="com.opensymphony.xwork2.validator.validators.IntRangeFieldValidator"/> <!-- 長整數(shù)校驗器 --> <validator name="long" class="com.opensymphony.xwork2.validator.validators.LongRangeFieldValidator"/> <!-- 短整數(shù)校驗器 --> <validator name="short" class="com.opensymphony.xwork2.validator.validators.ShortRangeFieldValidator"/> <!-- 雙精度浮點數(shù)校驗器 --> <validator name="double" class="com.opensymphony.xwork2.validator.validators.DoubleRangeFieldValidator"/> <!-- 日期校驗器 --> <validator name="date" class="com.opensymphony.xwork2.validator.validators.DateRangeFieldValidator"/> <!-- 表達(dá)式校驗器 --> <validator name="expression" class="com.opensymphony.xwork2.validator.validators.ExpressionValidator"/> <!-- 字段表達(dá)式校驗器 --> <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"/> <!-- 轉(zhuǎn)換校驗器 --> <validator name="conversion" class="com.opensymphony.xwork2.validator.validators.ConversionErrorFieldValidator"/> <!-- 字符串長度校驗器 --> <validator name="stringlength" class="com.opensymphony.xwork2.validator.validators.StringLengthFieldValidator"/> <!-- 正則表達(dá)式校驗器 --> <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 -->
關(guān)于這些校驗器的具體使用,這里就不一一舉例了。
總結(jié)
這篇文章對Struts2框架中的校驗器進(jìn)行了簡單的總結(jié),對于這里說的校驗器,基礎(chǔ)的是如何使用,而最重要的是掌握Struts2校驗器這種思想,將寫代碼來做的事情,通過配置來完成,這種方法很值得我們借鑒,在我們學(xué)習(xí)其它框架中,我們也會碰到這種方式。學(xué)習(xí),痛并快樂著。
好了,以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
Struts2學(xué)習(xí)教程之自定義類型轉(zhuǎn)換器的方法
類型轉(zhuǎn)換器的作用是將請求中的字符串或字符串?dāng)?shù)組參數(shù)與action中的對象進(jìn)行相互轉(zhuǎn)換。下面這篇文章主要給大家介紹了關(guān)于Struts2學(xué)習(xí)教程之自定義類型轉(zhuǎn)換器的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2018-05-05springboot掃描自定義的servlet和filter代碼詳解
本文是一篇根據(jù)作者工作經(jīng)歷總結(jié)出來的關(guān)于springboot掃描自定義的servlet和filter代碼詳解的文章,小編覺得非常不錯,這里給大家分享下,和朋友們一起學(xué)習(xí),進(jìn)步。2017-10-10關(guān)于Tomcat出現(xiàn)The origin server did not find a current represent
這篇文章主要介紹了關(guān)于Tomcat出現(xiàn)The origin server did not find a current representation for the target resourc...的問題,感興趣的小伙伴們可以參考一下2020-08-08實例分析Java中public static void main(String args[])是什么意思
這篇文章主要介紹了實例分析Java中public static void main(String args[])的意義,詳細(xì)分析了Java主函數(shù)main關(guān)鍵字聲明的具體含義和用法,需要的朋友可以參考下2015-12-12