struts2學習

struts2獲取請求參數:
在Struts中,因爲struts2爲一個MVC框架,那麼對應的關係爲:
V:jsp頁面
M:action
C:action StrutsPrepareAndExecuteFilter
在Struts2中,獲取請求參數:
1.屬性驅動
   1.直接將action作爲一個model,就可以得帶請求參數(這種方式 ,底層是通過反射來實現的。)
問題1:action封裝請求參數,會不會存在線程安全問題?
不會,因爲每次請求都是一個新的action。
缺點:需要單獨定義javaBean,將action中屬性copy到javaBean中。
優點:簡單。
2.在action中聲明一個model(這種方式數據是通過struts2中的interceptor進行封裝的<interceptor name="params"
class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/>)。
private User user;提供get/set方法
在頁面上使用ognl來描述。
優點:簡單,解決了第一種封裝的問題;
缺點:在頁面上使用了ognl表達式,頁面不通用了。

2.模型驅動(在開發中應用比較多)
步驟:1.讓action類實現ModelDriven接口;
 2.重寫getModel方法;
 3.在action中是實例化一個model對象,讓getModel方法返回這個對象。
優點:解決了屬性驅動存在的問題。
缺點:一次只能封裝一個model對象。
1.將數據封裝到List集合:
頁面:username1:<input type="text" name="users[0].username"><br>
 password1:<input type="password" name="users[0].password"><br>
 
 username2:<input type="text" name="users[1].username"><br>
 password2:<input type="password" name="users[1].password"><br>
action類:private List<User> users;
get/set方法
2.將數據封裝到Map集合
頁面:username1:<input type="text" name="map['aaa'].username"><br>
 password1:<input type="password" name="map['aaa'].password"><br>

 username2:<input type="text" name="map['bbb'].username"><br>
 password2:<input type="password" name="map['bbb'].password"><br>
action類:
 private Map<String, User> map;
 提供get/set
 
struts2中提供的類型轉換
在web中我們使用beanutils直接將表單數據封裝到javaBean中。
struts2中action得到請求參數,也可以直接封裝到javaBean.struts2 內部提供大量類型轉換器,用來完成數據類型轉換問題
boolean 和 Boolean
char和 Character
int 和 Integer
long 和 Long
float 和 Float
double 和 Double
Date 可以接收 yyyy-MM-dd格式字符串(例如:日期類型,我們傳遞  yyyy-MM-dd  yyyy年MM月dd日格式都可以,但是如果
是yyyy/MM/dd就會出現問題.)
關於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類,優點:重寫的方法參數沒有那麼多。
public Object convertValue(Map<String, Object> context, Object value, Class toType) {
return convertValue(value, toType);
}
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視圖,在類型轉換器中,必須拋出異常纔可以。
發佈了42 篇原創文章 · 獲贊 8 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章