* 實際開發中 不推薦在Action中 去使用Servlet API
1、三種方式:
1) 通過Action 成員變量, 自動接收請求參數
在Action中定義成員變量,變量名稱和form元素 name屬性一致,併爲成員變量 提供setter
<interceptor name="params" class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/> 完成參數封裝
2)使用單獨Model 對象,基於客戶端 OGNL 參數名寫法 完成封裝
在Action 中創建 model成員變量
頁面 用戶名 <input type="text" name="user.username" /> <br/>
注意點:Action中 爲model對象 提供 get和set方法
3)實現ModelDriven 接口 完成參數封裝
Struts2 提供ModelDriven接口 ,通過該接口方法指定 Action 哪個成員是model
public class LoginAction4 extends ActionSupport implements ModelDriven<User>
public User getModel() {
return user;
}
注意點:Model對象必須手動實例化
方式二和方式三 在使用上本質區別 :方式二可以定義多個model 、方式三 只能在一個Action中定義一個Model對象
<interceptor name="modelDriven" class="com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor"/> 提供單獨攔截器 調用ModelDriven 實現
2、集合對象類型 數據封裝 List 、Map
1) List封裝
Action private List<User> users;
JSP <input type="text" name="users[0].username" />
2) Map封裝
Action private Map<String, User> usermap;
JSP <input type="text" name="usermap['one'].username" />
3、自定義類型轉換器
struts2 內部提供很多類型轉換器,但是當用戶提交數據類型格式,是struts2 內部沒有提供的 ------------- 需要自定義類型轉換器
TypeConverter 定義 public Object convertValue(Map context, Object target, Member member, String propertyName, Object value, Class toType);
子類 DefaultTypeConverter 定義 public Object convertValue(Map context, Object value, Class toType)
* context ognl上下文對象、value要轉換值 、toType 轉換目標類型
子類 StrutsTypeConverter 將 convertValue(Map context, Object value, Class toType) 拆分爲兩個方法
* convertFromString(Map context, String[] values, Class toClass) 將String 轉換Action中複雜對象類型
* convertToString(Map context, Object o) 將Action中複製對象類型 轉換 String 類型
自定義轉換器 通常繼承 DefaultTypeConverter 或者 StrutsTypeConverter
寫轉換器
public Object convertValue(Map context, Object value, Class toType) {
// 該方法 有兩層含義
// 第一層,支持String 轉換 複雜類型
// 第二層,支持複雜類型 轉換String
DateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
if (toType == String.class) {
// 將複雜對象 轉換 String 類型
Date date = (Date) value;
return dateFormat.format(date);
} else if (toType == Date.class) {
// 將String 轉換 複雜數據類型
// value 是一個String 類型數組
String strDate = ((String[]) value)[0];
try {
return dateFormat.parse(strDate);
} catch (ParseException e) {
e.printStackTrace();
}
}
return super.convertValue(context, value, toType);
}
配置轉換器 :
1) 局部配置 ,配置Action中含有特殊 屬性類型,需要轉換器 ActionClassName-conversion.properties (放到Action 所在包) ---- 針對Action的屬性的
配置格式 : 屬性名 = 轉換器 buytime=cn.itcast.struts2.demo3.MyDateConvertor
* 局部配置只對當前Action 有效
配置格式 :類型 = 轉換器 java.util.Date = cn.itcast.struts2.demo3.MyDateConvertor
4. 類型轉換錯誤 處理
如果在類型轉換中 出現錯誤, 服務器端 會調用 addFieldError 添加錯誤信息, 自動跳轉 邏輯視圖input
<interceptor name="conversionError" class="org.apache.struts2.interceptor.StrutsConversionErrorInterceptor"/> 負責類型轉換錯誤的處理
1) 出錯後,在<action> 內部配置 result name="input" 跳轉到提交頁面
2) 在提交頁面,顯示錯誤信息
<!-- 引入struts 標籤庫 -->
<%@ taglib uri="/struts-tags" prefix="s"%>
<!-- 顯示錯誤信息 -->
<s:fielderror></s:fielderror>
3) 在Action類所在包 創建 類名.properties 例如 cn.itcast.struts2.demo3.ProductAction 在 cn.itcast.struts2.demo3包下 創建 ProductAction.properties
信息配置格式: invalid.fieldvalue.屬性名= 錯誤信息