在web中咱們使用beanutils直接將表單數據封裝到javaBean中。---類型轉換
struts2中action獲得請求參數,也能夠直接封裝到javaBean.java
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
就會出現問題.web
struts2中的類型轉換器根接口是:com.opensymphony.xwork2.conversion.TypeConverter。apache
步驟:
1.建立一個類實現TypeConverter接口.
2.重寫接口中方法,實現類型轉換操做.
3.註冊類型轉換器.
詳解說明:數組
public Object convertValue(Map<String, Object> context, Object target, Member member, String propertyName, Object value, Class toType);
若是實現接口,這個方法參數太多(6個)jsp
優勢:重寫的方法參數沒有那麼多
public Object convertValue(Map<String, Object> context, Object value, Class toType) {
return convertValue(value, toType);
}
ide
package cn.itcast.utils; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Map; import org.apache.struts2.util.StrutsTypeConverter; public class MyTypeConverter extends StrutsTypeConverter { // 接收頁面傳遞的數據封裝到javaBean. @Override public Object convertFromString(Map context, String[] values, Class toClass) { /* values數組,存入的值就是用戶輸入的值 toClass 要轉換的數據的類型 Date.class*/ String value = values[0]; SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd"); Date date = null; try { date = sdf.parse(value); } catch (ParseException e) { // e.printStackTrace(); throw new RuntimeException(); } return date; } @Override public String convertToString(Map context, Object o) { /*把具體的類型轉換成字符串 o 表明的要轉換的數據*/ return null; } }
緣由:在這個類中將從頁面傳遞的數據怎樣封裝,以及action中的數據怎樣在頁面上顯示作了分離.
public abstract Object convertFromString(Map context, String[] values, Class toClass);
public abstract String convertToString(Map context, Object o);
spa
配置文件所在位置以及名稱: 在Action類所在包 建立 Action類名-conversion.properties ,
配置文件書寫: 格式 : 屬性名稱=類型轉換器的全類名code
配置文件所在位置以及名稱: 在model類所在包 建立 model類名-conversion.properties ,
配置文件書寫: 格式 : 屬性名稱=類型轉換器的全類名 orm
配置文件所在位置以及名稱:在src下建立一個xwork-conversion.properties
配置文件書寫: 格式: 要轉換的類型全名=類型轉換器的全類名 blog
對於struts2中類型轉換器,若是表單數據提交時,將數據向model封裝,出現了問題,會報錯:
No result defined for action cn.itcast.action.RegistAction and result input
上面的意思是說,在RegistAction的配置中沒有配置input結果視圖.
<action name="regist" class="cn.itcast.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視圖,在類型轉換器中,必須拋出異常才能夠。