JavaEE----Action接受請求參數

一、 Action中如何接受請求參數 parameter 
* 實際開發中 不推薦在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 有效


2) 全局配置,讓系統中所有java.util.Date 類型 都使用 cn.itcast.struts2.demo3.MyDateConvertor 配置 xwork-conversion.properties (放到src根目錄) --- 針對類型
配置格式 :類型 = 轉換器  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.屬性名= 錯誤信息
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章