struts2 action接收請求參數和類型轉換

1,action接收請求參數

  • struts2做爲一個標準的MVC模式,其action既可做爲Model(),也可做爲Control。
  • 在struts2中獲取請求參數三種方式:

        a.屬性驅動
            1.直接將action作一個model,就能夠獲得請求參數,這樣會不會產生線程安全問題呢?java

    答案是否認的,由於每一次請求,都是一個新的action。web

    這種方式優勢就是簡單,缺點也是很明顯的,須要單獨定義javaBean,將action中屬性copy到javaBean中。    apache

    其底層是經過反射來實現的。
                
            2.在action中聲明一個model。
                private User user;提供get/set方法
                
                在頁面上使用ognl來描述
                <input type="text" name="user.username">
                
                優勢:簡單,同時解決了第一種封裝的問題
                缺點:在頁面上使用了ognl表達式,頁面不通用了。
               
                數據經過struts2中的interceptor進行封裝.數組

      <interceptor name="params" class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/>安全

        b.模型驅動(在開發中應用比較多)
            讓action類實現ModelDriven,重寫getModel方法,在action中實例化一個model對象,讓getModel方法返回這個對象。jsp

     public class LoginAction extends ActionSupport implements ModelDriven<User>spa

       private User user = new User();線程

       public User getModel() { code

       return user; 對象

       } 

      }

            優勢:解決了屬性驅動存在的問題
            缺點:一次只能封裝一個model對象.
            
             struts2 有不少圍繞模型驅動的特性
            * <interceptor name="modelDriven" class="com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor"/> 爲模型驅動提供了更多特性

2, 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類
            優勢:重寫的方法參數沒有那麼多

1 public Object convertValue(Map<String, Object> context, Object value, Class toType) {
2     return convertValue(value, toType);
3 }

        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
            配置文件書寫:  格式:  要轉換的類型全名=類型轉換器的全類名
           
注意:
    對於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視圖,在類型轉換器中,必須拋出異常才能夠。

相關文章
相關標籤/搜索