06-struts2的類型轉換

struts2中提供的類型轉換



在web中咱們使用beanutils直接將表單數據封裝到javaBean中。---類型轉換

struts2中action獲得請求參數,也能夠直接封裝到javaBean.java

 

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
就會出現問題.web


關於struts2中的類型轉換器:

struts2中的類型轉換器根接口是:com.opensymphony.xwork2.conversion.TypeConverter。apache

 

 

自定義類型轉換器:


步驟:
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個)jsp


2.不推薦實現接口,能夠繼承 DefaultTypeConverter類


優勢:重寫的方法參數沒有那麼多
public Object convertValue(Map<String, Object> context, Object value, Class toType) {
return convertValue(value, toType);
}
ide


3.我的推薦使用 繼承DefaultTypeConverter類的一個子類StrutsTypeConverter.

             

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

2.怎樣註冊一個自定義類型轉換器.


1.局部--針對於action(action裏面直接封裝屬性時使用,接收參數屬性驅動的第一種)


配置文件所在位置以及名稱: 在Action類所在包 建立 Action類名-conversion.properties ,
配置文件書寫: 格式 : 屬性名稱=類型轉換器的全類名code


2.局部--針對於model(action存在一個model時使用,接受參數屬性驅動第二種,模型驅動)


配置文件所在位置以及名稱: 在model類所在包 建立 model類名-conversion.properties ,
配置文件書寫: 格式 : 屬性名稱=類型轉換器的全類名 orm


3.全局


配置文件所在位置以及名稱:在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視圖,在類型轉換器中,必須拋出異常才能夠。

相關文章
相關標籤/搜索