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"/> 爲模型驅動提供了更多特性
在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視圖,在類型轉換器中,必須拋出異常才能夠。