版權聲明:本文爲 小異常 原創文章,非商用自由轉載-保持署名-註明出處,謝謝!
本文網址:https://blog.csdn.net/sun8112133/article/details/106698780
文章目錄
本篇博客主要給大家講解 數據有效性 和 國際化,關於 國際化 我們可以只做瞭解即可,因爲我們開發的系統大部分都是在國內使用,一般不會涉及到國外,所以 國際化 這一塊簡單瞭解即可。
一、數據有效性
關於 數據有效性,其實就是對數據進行校驗,過濾掉不符合的數據。
1、數據校驗
數據校驗 可以分爲 前臺校驗 和 後臺校驗,如果一個項目的 數據校驗 只有 前臺校驗 沒有 後臺校驗 的話是不安全的,因爲 前臺校驗 是通過 JS 完成的,JS 可以被繞行,比如我們直接通過地址欄傳參的方式就可以輕而易舉的繞過 JS 了,但是我們使用 JS 校驗可以很大程度上提升用戶體驗度。
本章主要爲大家介紹如何使用 Struts2 框架進行 後臺校驗。
Struts2 框架中提供了兩種 數據校驗 的方式:
- 手動編碼的方式進行校驗;
- 採用配置文件的方式進行校驗。
2、手動編碼方式
1)步驟
- 繼承
ActionSupport
類; - 重寫
validate()
方法。
我們在
validate()
方法中就可以編寫 數據校驗 的代碼了,但是validate()
方法針對 Action 中的所有方法,也就是說用戶請求這個 Action 時,不管請求的是哪個方法,都會先執行validate()
方法進行 數據校驗。這個時候問題來了,如果有的方法根本不需要 數據校驗,執行
validate()
方法就會顯得多此一舉,浪費資源。我們針對這個問題也有專門的解決方案,我們可以編寫一個與validate()
方法簽名相同的方法。比如我們需要校驗 Action 中的add()
方法,那我們就編寫一個方法名爲:validateAdd()
的校驗方法。
2)小栗子
/**
* 數據的校驗:
* 繼承 ActionSupport 之後纔會有一些功能:數據校驗、國際化、設置錯誤信息。
*/
public class LoginAction extends ActionSupport {
private String username;
private String password;
public void setUsername(String username) {
this.username = username;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String execute() throws Exception {
System.out.println(username);
System.out.println(password);
return NONE;
}
// 數據校驗的方法:
// 攔截器會先完成校驗纔會執行 execute方法
@Override
public void validate() {
// 判斷用戶名不能爲空
if (username == null || username.trim().length() == 0) {
// 阻止 execute方法執行
this.addFieldError("username", "用戶名不能爲空!");
}
// 判斷密碼不能爲空
if (password == null || password.trim().length() == 0) {
this.addFieldError("password", "密碼不能爲空!");
}
}
// 針對某一個方法的校驗,只針對 execute() 方法
public void validateExecute() {
if (password.length() < 6 || password.length() > 12) {
this.addFieldError("password", "密碼需要在 6-12 位之間!");
}
}
}
3、XML 配置方式
我們除了 手動編碼方式,還可以通過 XML 配置方式 完成 數據校驗。但是 XML 配置方式 需要提供對應屬性的
get()
方法才能使用。
1)針對 Action 中的所有方法校驗
我們只需要在 Action 所在的包下創建一個與 Action 類名相同的 XML 文件即可。
文件名格式:
Action 類名-validation.xml
。如:
LoginAction-validation.xml
-
引入 DTD 約束
DTD 約束文件在
xwork-core-2.3.24.jar
中,名叫xwork-validator-1.0.3.dtd
的約束文件。 -
進行配置
<validators> <!-- name:要校驗的字段名 --> <field name="username"> <field-validator type="requiredstring"> <message>用戶名不能爲空!(XML)</message> </field-validator> </field> <field name="password"> <field-validator type="requiredstring"> <message>密碼不能爲空!(XML)</message> </field-validator> </field> </validators>
其中
requiredstring
是校驗規則,意思是 必須的字符串類型,我們可以從com/opensymphony/xwork2/validator/validators/default.xml
中可以查看各種校驗規則。
2)針對 Action 中的某一個方法校驗
我們需要在 Action 所在的包下創建一個 XML 文件即可。
文件名格式:
Action 類名-Action 配置名-validation.xml
。如:
<action name="addLogin" class="com.action.demo.LoginAction" method="add" />
那麼文件名應該是:
LoginAction-addLogin-validation.xml
<validators>
<field name="password">
<field-validator type="stringlength">
<param name="minLength">6</param>
<param name="maxLength">12</param>
<message>密碼的長度爲6~12位!(XML)</message>
</field-validator>
</field>
</validators>
4、Struts2 提供的校驗器
5、綜合案例
<!DOCTYPE validators PUBLIC
"-//Apache Struts//XWork Validator 1.0.3//EN"
"http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
<validators>
<!-- 校驗用戶名 -->
<field name="username">
<field-validator type="requiredstring">
<message>用戶名不能爲空!</message>
</field-validator>
</field>
<!-- 校驗密碼 -->
<field name="password">
<field-validator type="requiredstring">
<message>密碼不能爲空!</message>
</field-validator>
<field-validator type="stringlength">
<param name="minLength">6</param>
<param name="maxLength">12</param>
<message>密碼的長度爲6~12位!</message>
</field-validator>
</field>
<!-- 校驗確認密碼 -->
<field name="repassword">
<field-validator type="fieldexpression">
<param name="expression"><![CDATA[(password==repassword)]]></param>
<message>兩次密碼輸入不一致!</message>
</field-validator>
</field>
<!-- 校驗年齡 -->
<field name="age">
<field-validator type="int">
<param name="min">18</param>
<param name="max">40</param>
<message>年齡輸入不合法!必須是18~40歲之間的!</message>
</field-validator>
</field>
<!-- 校驗郵箱 -->
<field name="email">
<field-validator type="email">
<message>郵箱格式不正確!</message>
</field-validator>
</field>
<!-- 校驗電話 -->
<field name="phone">
<field-validator type="regex">
<param name="expression"><![CDATA[^18\d{9}$]]></param>
<message>電話不合法!</message>
</field-validator>
</field>
<!-- 校驗生日 -->
<field name="birthday">
<field-validator type="date">
<param name="min">1974-01-01</param>
<param name="max">1996-01-01</param>
<message>生日不合法!</message>
</field-validator>
</field>
</validators>
6、自定義校驗規則(瞭解)
除了 Struts2 給我們提供的校驗規則外,我們還可以 自定義校驗規則。
自定義校驗規則 有兩種方式,大家可以根據自己的需求進行選擇:
- 若需要普通的驗證程序,可以繼承 ValidatorSupport 類(校驗的時候不是針對一個字段的);
- 若需要字段驗證程序,可以繼承 FieldValidatorSupport 類(針對一個字段的校驗)
1)編寫一個類繼承 FieldValidatorSupport 類
/**
* 自定義的校驗規則
*/
public class MyAgeValidator extends FieldValidatorSupport {
@Override
public void validate(Object obj) throws ValidationException {
// 獲得字段名稱
String name = this.getFieldName();
// 獲得字段的值
Object value = this.getFieldValue(name, obj);
if (value instanceof Integer) {
int age = (Integer) value;
if (age < 0) {
this.addFieldError(name, obj);
}
}
}
}
2)註冊校驗規則
-
在
src
下創建一個validators.xml
; -
引入 DTD 約束,在
xwork-core-2.3.24.jar
下的xwork-validator-config-1.0.dtd
; -
配置
validators.xml
:<validators> <validator name="ages" class="com.demo.web.action2.MyAgeValidator"></validator> </validators>
-
使用校驗規則:
RegisterAction-validation.xml
<validators> <field name="ages"> <field-validator type="age"> <message>年齡不能爲負數!</message> </field-validator> </field> </validators>
二、國際化
軟件的 國際化 是指軟件根據來訪者的不同,可以自動切換語言進行顯示。
它提供一組資源包,這組資源包要滿足一定的規則:
- 資源包需要有相同的基本名稱;
- 命名規則:
基本名稱_語言_國家.properties
,如中國:message_zh_CN.properties
,美國:message_en_US.properties
;
1、Struts2 中的國際化
1)全局的國際化
-
提供一組資源包:放在
src
下-
message_zh_CN.properties
name=張三
-
message_en_US.properties
name=ZhangSan
-
-
需要在
struts.xml
中開啓一個常量,value
寫的是國際化文件的基本名稱,我這裏叫message
:<constant name="struts.custom.i18n.resources" value="message" />
-
在 Action 類中:
String name = this.getText("name");
-
在 JSP 中:
<s:text name="name" />
-
在數據校驗配置文件中:
<validators> <field name="names"> <field-validator type="string"> <message key="name" /> </field-validator> </field> </validators>
2)Action 範圍的國際化
在 Action 類中使用。
在 Action 所在的包下創建一個屬性文件(名字與 Action 的類名一致,如:
Action類名_語言_國家.properties
)。
3)包範圍的國際化
在當前包以及當前包的子包下使用。
在某個包下創建屬性文件(
包名_語言_國家.properties
)。
4)臨時的國際化
在頁面 JSP 中的使用。
<!-- 讀包下的國際化文件 -->
<s:i18n name="com/demo/web/action">
<s:text name="package" />
</s:i18n>