国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

SSH框架網上商城項目第24戰之Struts2中處理多個Model請求的方法

2019-11-26 14:14:20
字體:
來源:轉載
供稿:網友

1. 問題的提出

  Struts2中如果實現了ModelDriven<model>接口就可以將傳來的參數注入到model中了,就可以在Action中使用該model,但是如果現在有兩個model都需要在同一個Action中使用該咋整呢?比如上一節我們完成了在線支付功能,但是支付完成了還沒結束,我們需要接收從第三方那邊反饋回來的信息,比如成功支付后,我們需要給付款方發送郵件和短信等。所以我們還需要在payAction中獲取從第三方傳過來的參數,由于從第三方傳過來的參數與我們傳過去的參數是不同的,所以接收那些參數我們也得寫一個Model(BackData),那么問題來了,我們的PayAction已經寫成這樣子了:public class PayAction extends BaseAction<SendData>,即已經在BaseAction中實現了ModelDriven<SendData>接口了,那么如何在一個action中再接收一個Model,并且還得對它們進行不同的處理呢?
  有種解決辦法(其實也不能稱為解決辦法……因為根本就沒解決……)就是寫一個Model,然后讓SendData和BackData繼承它,但是問題是這兩個Model根本就沒關系,為啥要繼承同一個Model,所以這種解決辦法實際上是在逃避上面的問題。
  在SpringMVC(SpringMVC還沒真正開始學,如果有說錯,請指正!)很好的解決了這個問題,因為SpringMVC中每個方法對應一個Model,而不是每個Action對應一個Model,這就方便了,我在同一個Action中寫兩個方法即可,不同的方法處理不同的Model。

2. 問題的解決

  針對這個問題,Struts2也提供了一種解決辦法:
  Struts2在ActionContext中存儲了很多個Map,比如之前提到的request, session, application等,其中還有個parameterMap,該Map中存儲了request所有的請求參數,只要我們的Action實現了parameterAware接口,就能拿到這個parameterMap,這就跟ModelDriven的道理是一樣的,如果我們實現了ModelDriven<Model>接口,那么我們在Action中就能獲得該Model,即定義一個Model并實現set方法即可。
  好了,那現在問題好辦了,支付的參數和返回的參數是不同的,也就是說兩次進入PayAcition中的參數是不同的,即兩次的parameterMap中裝的數據不一樣,那只要我們在Action中選取一個參數(該參數只要能區分兩次是不同的request請求即可)作為判斷,就知道當前該用哪個Model來接收參數(SendData還是BackData)。下面我們改寫一下PayAction中的代碼:

@Controller("payAction")@Scope("prototype")public class PayAction extends BaseAction<Object> implements ParameterAware {//注意上面繼承的BaseAction中不能寫SendData了,要寫Object,等下我們再判斷具體使用哪個  //定義一個Map接收request的請求參數 private Map<String, String[]> parameters; @Override public void setParameters(Map<String, String[]> parameters) {  this.parameters = parameters; }  /*在struts-default.xml文中,ServletConfig攔截器在ModelDriven之前先執行,所以我們在注入model的時候, request參數已經有了,這樣我們就可以在getModel()方法中通過參數來判斷是哪個請求了*/ @Override public Object getModel() { //付款的時候有支付通道編碼的參數(pd_FrpId),返回的時候沒有 //這樣我們就可以通過該參數判斷是支付還是返回了  if(parameters.get("pd_FrpId") != null) {   model = new SendData();  } else {   model = new BackData();  }  return model; } //向易寶發送數據的方法 public String goBank() {  //對應發送的model:SendData  SendData sendData = (SendData)model;  //處理發送數據的邏輯,前一節已經實現過了…… } //接收返回的數據的方法 public void backBank() {  //對應接收的model:BackData  BackData backData = (BackData)model;  //處理返回數據的邏輯……后面再來實現,  //先講Struts2處理多個Model請求這個知識點 }}

3. Struts2的處理流程

  我們再來分析一下Struts2的執行流程,這樣更加利于理解上面的原理。Struts處理流程:

1)、獲取請求后,先創建Action的代理,在創建代理的時候順便創建了Action;
2)、執行18個攔截器,攔截器執行成功后再調用Action的方法;
3)、Action的方法執行完畢后,再調用18個攔截器
所以根據這個流程,我們知道:先創建Action

主站蜘蛛池模板: 建瓯市| 盐山县| 北京市| 阳曲县| 文成县| 嘉义市| 宁德市| 临湘市| 墨竹工卡县| 普兰店市| 墨脱县| 新沂市| 开封县| 洪泽县| 寻甸| 永德县| 公安县| 田东县| 卫辉市| 湾仔区| 永泰县| 淮安市| 资兴市| 桃园县| 柳林县| 富阳市| 新宁县| 阿坝| 双柏县| 逊克县| 闽侯县| 应用必备| 赣榆县| 甘泉县| 临邑县| 常州市| 龙游县| 龙州县| 富宁县| 荔波县| 大埔区|