【Struts2筆記整理十】數據有效性與國際化

版權聲明:本文爲 小異常 原創文章,非商用自由轉載-保持署名-註明出處,謝謝!
本文網址:https://blog.csdn.net/sun8112133/article/details/106698780







本篇博客主要給大家講解 數據有效性國際化,關於 國際化 我們可以只做瞭解即可,因爲我們開發的系統大部分都是在國內使用,一般不會涉及到國外,所以 國際化 這一塊簡單瞭解即可。


一、數據有效性

關於 數據有效性,其實就是對數據進行校驗,過濾掉不符合的數據。

1、數據校驗

數據校驗 可以分爲 前臺校驗後臺校驗,如果一個項目的 數據校驗 只有 前臺校驗 沒有 後臺校驗 的話是不安全的,因爲 前臺校驗 是通過 JS 完成的,JS 可以被繞行,比如我們直接通過地址欄傳參的方式就可以輕而易舉的繞過 JS 了,但是我們使用 JS 校驗可以很大程度上提升用戶體驗度。

本章主要爲大家介紹如何使用 Struts2 框架進行 後臺校驗

Struts2 框架中提供了兩種 數據校驗 的方式:

  1. 手動編碼的方式進行校驗;
  2. 採用配置文件的方式進行校驗。

2、手動編碼方式

1)步驟

  1. 繼承 ActionSupport 類;
  2. 重寫 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

  1. 引入 DTD 約束

    DTD 約束文件在 xwork-core-2.3.24.jar 中,名叫 xwork-validator-1.0.3.dtd 的約束文件。

  2. 進行配置

    <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 提供的校驗器

10Struts2提供的校驗器列表


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)註冊校驗規則

  1. src 下創建一個 validators.xml

  2. 引入 DTD 約束,在 xwork-core-2.3.24.jar 下的 xwork-validator-config-1.0.dtd

  3. 配置 validators.xml

    <validators>
    	<validator name="ages" class="com.demo.web.action2.MyAgeValidator"></validator>
    </validators>
    
  4. 使用校驗規則:RegisterAction-validation.xml

    <validators>
    	<field name="ages">
    		<field-validator type="age">
    			<message>年齡不能爲負數!</message>
    		</field-validator>
    	</field>
    </validators>
    


二、國際化

軟件的 國際化 是指軟件根據來訪者的不同,可以自動切換語言進行顯示。

它提供一組資源包,這組資源包要滿足一定的規則:

  1. 資源包需要有相同的基本名稱;
  2. 命名規則: 基本名稱_語言_國家.properties,如中國:message_zh_CN.properties,美國:message_en_US.properties

1、Struts2 中的國際化

1)全局的國際化

  1. 提供一組資源包:放在 src

    • message_zh_CN.properties

      name=張三
      
    • message_en_US.properties

      name=ZhangSan
      
  2. 需要在 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>


博客中若有不恰當的地方,請您一定要告訴我。前路崎嶇,望我們可以互相幫助,並肩前行!



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章