1. 程式人生 > >struts2中提供的型別轉換

struts2中提供的型別轉換

在web中我們使用beanutils直接將表單資料封裝到javaBean中。—型別轉換

struts2中action得到請求引數,也可以直接封裝到javaBean.

	struts2 內部提供大量型別轉換器,用來完成資料型別轉換問題 
	boolean 和 Boolean
	char和 Character
	int 和 Integer
	long 和 Long
	float 和 Float
	double 和 Double
	Date 可以接收 yyyy-MM-dd格式字串
	陣列  可以將多個同名引數,轉換到陣列中
	集合  支援將資料儲存到 List 或者 Map 集合
	
	例如:日期型別,我們傳遞  yyyy-MM-dd  yyyy年MM月dd日格式都可以,但是如果是yyyy/MM/dd
		就會出現問題.
		
關於struts2中的型別轉換器:
	struts2中的型別轉換器根介面是:com.opensymphony.xwork2.conversion.TypeConverter。
	
-------------------------------------------------------
自定義型別轉換器:
	
	步驟:
		1.建立一個類實現TypeConverter介面.
		2.重寫介面中方法,實現型別轉換操作.
		3.註冊型別轉換器.
		
	詳解說明:
		1.建立一個自定義型別轉換器
			1.實現TypeConverter需要重寫
				public Object convertValue(Map<String, Object> context, Object target, Member member, String propertyName, Object value, Class toType);
				如果實現介面,這個方法引數太多(6個)
				
			2.不推薦實現介面,可以繼承 DefaultTypeConverter類
				優點:重寫的方法引數沒有那麼多
				 public Object convertValue(Map<String, Object> context, Object value, Class toType) {
						return convertValue(value, toType);
				}
	
			3.個人推薦使用 繼承DefaultTypeConverter類的一個子類StrutsTypeConverter.
				原因:在這個類中將從頁面傳遞的資料怎樣封裝,以及action中的資料怎樣在頁面上顯示做了分離.
				
				  public abstract Object convertFromString(Map context, String[] values, Class toClass);
				  public abstract String convertToString(Map context, Object o);
	


		2.怎樣註冊一個自定義型別轉換器.
			
			1.區域性--針對於action
				 配置檔案所在位置以及名稱:  在Action類所在包 建立 Action類名-conversion.properties , 
				 配置檔案書寫:    格式 : 屬性名稱=型別轉換器的全類名
			2.區域性--針對於model
				 配置檔案所在位置以及名稱:  在model類所在包 建立 model類名-conversion.properties , 
				 配置檔案書寫:    格式 : 屬性名稱=型別轉換器的全類名 
			3.全域性
				配置檔案所在位置以及名稱:在src下建立一個xwork-conversion.properties
				配置檔案書寫:  格式:  要轉換的型別全名=型別轉換器的全類名 
				java.util.Date=com.baidu.convert.MyConvert
				
	-----------------------------------------------------------------------------
	注意:
		對於struts2中型別轉換器,如果表單資料提交時,將資料向model封裝,出現了問題,會報錯:
		No result defined for action com.baidu.action.RegistAction and result input
		
		上面的意思是說,在RegistAction的配置中沒有配置input結果檢視.
		<action name="regist" class="com.baidu.action.RegistAction">
			<result name="input">/success.jsp</result>
		</action>
		如果配置了,出現型別轉換問題,就會跳轉到input指定的檢視。
		
		問題:為什麼會向input檢視跳轉?
			是因為struts2中的攔截器(interceptor).
			
			在struts2中的
				 <interceptor name="conversionError" class="org.apache.struts2.interceptor.StrutsConversionErrorInterceptor"/>
				 用於記錄型別轉換問題
				 
			在struts2中
				 <interceptor name="workflow" class="com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor"/>
				 用於得到問題,向input檢視跳轉。
				 
		關於錯誤資訊展示:
					
			通過分析攔截器作用,得知當型別轉換出錯時,自動跳轉input檢視 ,在input檢視頁面中 <s:fieldError/> 顯示錯誤資訊	
			* 在Action所在包中,建立 ActionName.properties,在區域性資原始檔中配置提示資訊 : invalid.fieldvalue.屬性名= 錯誤資訊

			
	如果是自定義型別轉換器,出現型別轉換問題,要跳轉到input檢視,在型別轉換器中,必須丟擲異常才可以。