1. 程式人生 > >Struts2 入門4 資料校驗_型別轉換_國際化

Struts2 入門4 資料校驗_型別轉換_國際化

一.資料校驗

前臺校驗:客戶段校驗
主要通過JavaScript,效率高,但不安全.
後臺校驗:伺服器校驗
這裡是struts2通過xml配置/java程式碼.效率比較低,但安全.

1.Struts2資料校驗

a.java程式碼資料驗證
        // 物件,封裝請求的資料
	private User user;
	public void setUser(User user) {
		this.user = user;
	}
	public User getUser() {
		return user;
	}
	/**
	 * 1.資料驗證的方法(簡單的手動資料驗證)
	 */
	//public void validate() {   // 驗證所有方法: validate()
	public void validateRegister() {   // 驗證指定的方法: validate要驗證的方法名()
		// 使用者名稱、密碼驗證
		//if (user != null) {
			// --> 驗證使用者名稱
			if (user.getName() == null || "".equals(user.getName())) {
				// 使用者名稱不合法!  新增錯誤資訊到map
				super.addFieldError("user.name", "使用者名稱不能為空!");  // 錯誤map不為空!
				
			}
			
			if (user.getPwd() == null || "".equals(user.getPwd())) {
				// 密碼不合法!
				super.addFieldError("user.pwd", "密碼不能為空!");
			}
			
		//}
	}
	//jsp中錯誤資訊的顯示:<s:fielderror fieldName="user.pwd"></s:fielderror>
b.配置檔案資料驗證
配置檔案的資料驗證
配置檔案的命名方法:
ActionClassName-validation.xml    驗證action中的所有方法
ActionClassName-actionName-validation.xml  驗證指定action中的方法
      
	<validators>
		<!-- 驗證“使用者名稱欄位”   user.name 對應Action中要驗證的屬性!-->
		<field name="user.name">
			<!-- 指定驗證器型別 -->
			<field-validator type="requiredstring">
				<message>使用者名稱不能為空!</message>
			</field-validator>
		</field>
	</validators>
	
	//驗證器檢視:xwork-core-2.3.4.1.jar/com.opensymphony.xwork2.validator.validators/default.xml

二.國際化

配置國際化資原始檔:
命名規則:基礎名_語言簡稱_國家簡稱.properties
如:msg_zh_CN.properties
1. 通過常量載入資原始檔
<!-- value的值是資原始檔的包名+資原始檔基礎名 -->
<constant name="struts.custom.i18n.resources" value="cn.itcast.b_i18n.msg"></constant>
2.jsp通過便籤載入資原始檔
<!-- name的值是資原始檔的包名+資原始檔基礎名 -->
<s:i18n name=" cn.itcast.b_i18n.msg "></s:i18n>
3. struts提供了國際化的標籤
 通過text標籤,可以顯示國際化字串
 name  值資原始檔中配置的key
<s:text name="username"></s:text>

三.型別轉換器

|-- interface TypeConverter 型別轉換的介面
|-- class DefaultTypeConverterstruts預設的型別轉換器
|-- abstract class  StrutsTypeConverter
自定義型別轉換器可以繼承此類

a.自定義型別轉換器

        //繼承StrutsTypeConverter類
	public class MyDataConvert extends StrutsTypeConverter{
		
		/**
		 * 把表單提交的字串,轉換為指定的目標型別!  (String--> Date)
		 * 
		 * 引數1: Action的上下文map(contextMap)
		 * 引數2: 表單提交的資料!為陣列型別,一般取陣列第一個元素!  <input type=texg name=userName /> 值
		 * 引數3: 要轉換的目標型別
		 */
		public Object convertFromString(Map context, String[] values, Class toClass) {
			
			// 判斷: 陣列如果為null,直接返回null
			if (values == null || values.length == 0){
				return null;  // 不需要轉換了
			}
			
			// 判斷: 提交的屬性型別,如果不是日期型別,不需要轉換
			if (Date.class != toClass) {
				return null;
			}
			
			/*
			 * 當前屬性是日期型別,需要轉換
			 */
				try {
					// 格式轉換,轉換成功,就直接返回!
					Date birth = formats[i].parse(values[0]);		// 字串轉換為日期
					return birth;
				} catch (ParseException e) {
					...
				}
			
			return null;
		}

		@Override
		public String convertToString(Map context, Object o) {
			return null;
		}
	}


b.配置轉換器資原始檔命名規則:ActionClassName-convertion.properties區域性型別轉換器
檔案放於Action同一個包目錄下
xwork-conversion.properties全域性型別轉換器(專案的所有Action都可以用)
將自定義型別轉換配置到資原始檔中:
RegisterAction-conversion.properties
user.birth=cn.itcast.c_convert.MyDataConvert

四.模型驅動

|--interface ModelDriven<T> 模型驅動介面,T為封裝的物件的類
模型驅動的實現,用到模型驅動攔截器:
<interceptor 
	name="modelDriven" 
	class="com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor"
/>
作用:
把請求表單的元素資料(表單的屬性名與物件屬性相同),自動填充到Action中的物件中.
public class UserAction extends ActionSupport implements ModelDriven<User>{
	
		private User user = new User();
	//	public void setUser(User user) {  // 可以不用寫set方法
	//		this.user = user;
	//	}
		public User getUser() {
			return user;
		}
		//使用者名稱: <input type="text" name="name"> 
		/*********重寫***********/
		@Override
		public User getModel() {
			return user;
		}
					
}