亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

關于struts2的modelDriven

2019-11-14 21:41:42
字體:
來源:轉載
供稿:網友
關于struts2的modelDriven

今天做畢業設計,前臺往后臺賦值,習慣性的用了modelDriven。但是剛寫完就奇怪它的機理是怎樣的,它怎么知道我前臺傳的參是哪個Model的屬性(之前用servlet都是手動),于是手賤的ctrl點進去,簡單了解了一下


之前記得要使用modelDriven必須使用modelDriven的攔截器,但是我沒加這個攔截器也實現了功能,看默認攔截器defaultStack原來所謂的默認攔截器就是一系列攔截器的集合

看modelDriven的源碼可以看到

 1     @Override 2  3 public String intercept(ActionInvocation invocation) throws Exception { 4  5 //獲取 Action 對象: EmployeeAction 對象, 此時該 Action 已經實現了 ModelDriven 接口 6  7     //public class EmployeeAction implements RequestAware, ModelDriven<Employee> 8  9         Object action = invocation.getAction();10 11 //判斷 action 是否是 ModelDriven 的實例12 13         if (action instanceof ModelDriven) {14 15 //強制轉換為 ModelDriven 類型16 17             ModelDriven modelDriven = (ModelDriven) action;18 19 //獲取值棧20 21             ValueStack stack = invocation.getStack();22 23 //調用 ModelDriven 接口的 getModel() 方法24 25             //即調用 EmployeeAction 的 getModel() 方法26 27             /*28 29             public Employee getModel() {30 31               employee = new Employee();32 33               return employee;34 35            }36 37             */38 39             Object model = modelDriven.getModel();40 41             if (model !=  null) {42 43 //把 getModel() 方法的返回值壓入到值棧的棧頂. 實際壓入的是 EmployeeAction 的 employee 成員變量44 45               stack.push(model);46 47             }48 49             if (refreshModelBeforeResult) {50 51                 invocation.addPReResultListener(new RefreshModelBeforeResult(modelDriven, model));52 53             }54 55         }56 57         return invocation.invoke();

發現它什么也沒實現,就是modelDriven接口,如果實現了就調用了它的getModel方法,然后把得到的壓入棧頂。沒有賦值操作

那么流程圖應該是這樣:

那么setName()賦值操作是誰做的?ParametersInterceptor

那么結論是:

1)ModelDrivenInterceptor只是將實現了ModelDriven的action的model放入值棧而已,所以你才可以直接使用<input type="text" name="type" />傳值。2)如果action沒有實現此接口,那么配置ModelDrivenInterceptor沒有任何意義3)ModelDrivenInterceptor并不負責注入值,賦值的是ParametersInterceptor


如果還要深究的話

ParametersInterceptor攔截器繼承自MethodFilterInterceptor,其主要功能是把ActionContext中的請求參數設置到ValueStack中,如果棧頂是當前Action則把請求參數設置到了Action中,如果棧頂是一個model(Action實現了ModelDriven接口)則把參數設置到了model中。

ParametersInterceptor攔截器主要源碼:

 1 @Override   2 public String doIntercept(ActionInvocation invocation) throws Exception {   3     Object action = invocation.getAction();//獲取當前執行的Action對象   4     if (!(action instanceof NoParameters)) {//判斷Action是否實現了NoParameters接口,實現該接口表示該Action沒有任何請求參數   5         ActionContext ac = invocation.getInvocationContext();//獲取ActionContext對象   6         final Map<String, Object> parameters = retrieveParameters(ac);//獲取請求參數Map   7         //省略...   8         if (parameters != null) {//如果請求參數不為null   9             Map<String, Object> contextMap = ac.getContextMap();//獲取ActionContext內部的context Map,即OgnlContext對象  10             try {  11                 //省略...  12                 ValueStack stack = ac.getValueStack();//獲取值棧  13                 setParameters(action, stack, parameters);//為值棧設置參數  14             } finally {  15                 //省略...  16             }  17         }  18     }  19     return invocation.invoke();//調用下一個攔截器  20 }  

可以知道為什么要實現自動賦值,只需要實現modelDriven接口就行了

其中最重要邏輯代碼是setParometers()方法

 1 protected void setParameters(Object action, ValueStack stack, final Map<String, Object> parameters) {   2     ParameterNameAware parameterNameAware = (action instanceof ParameterNameAware)   3             ? (ParameterNameAware) action : null;//判斷Action有無實現ParameterNameAware接口   4    5     Map<String, Object> params;   6     Map<String, Object> acceptableParameters;//合法參數集合   7     //判斷參數設置是否有序,ordered默認為false,即無序   8     if (ordered) {   9         params = new TreeMap<String, Object>(getOrderedComparator());//如果有序則要獲取比較器  10         acceptableParameters = new TreeMap<String, Object>(getOrderedComparator());  11         params.putAll(parameters);  12     } else {  13         params = new TreeMap<String, Object>(parameters);  14         acceptableParameters = new TreeMap<String, Object>();  15     }  16     //迭代請求參數  17     for (Map.Entry<String, Object> entry : params.entrySet()) {  18         String name = entry.getKey();  19         //判斷參數是否合法,如果Action實現了ParameterNameAware則acceptableName(name)返回true且parameterNameAware.acceptableParameterName(name)  20         //也返回true該參數才是合法的;如果Action沒有實現ParameterNameAware則參數是否合法由acceptableName(name)方法決定  21         boolean acceptableName = acceptableName(name)  && (parameterNameAware == null  || parameterNameAware.acceptableParameterName(name));  22         //如果參數合法  23         if (acceptableName) {  24             acceptableParameters.put(name, entry.getValue());//把合法參數添加到合法參數集合中  25         }  26     }  27   28     ValueStack newStack = valueStackFactory.createValueStack(stack);  29     //省略...  30     for (Map.Entry<String, Object> entry : acceptableParameters.entrySet()) {//迭代合法參數  31         String name = entry.getKey();//參數名  32         Object value = entry.getValue();//參數值  33         try {  34             newStack.setValue(name, value);//將該參數設置到ValueStack中  35         } catch (RuntimeException e) {  36             //省略...  37         }  38     }  39     //省略...  40     //看該方法的名稱是將合法參數添加到ActionContext中,但在該攔截器中,該方法為空實現,無任何代碼  41     //該方法被聲明為protected,即子類可以覆蓋該方法以改變行為  42     addParametersToContext(ActionContext.getContext(), acceptableParameters);  43 }  

先判斷提交過來的參數是否合法,因為提交過來的參數會影響到值棧所以struts2要對提交過來的參數進行合法性檢查,以防止惡意用戶的攻擊,凡是請求參數中表達式中含有等號(=),逗號(,),#號(#)的都是非法表達式

至于怎么判斷是否合法,我已經沒興趣了,知道是acceptableName(name)方法決定的。


了解了這么多感覺用的更隨心所欲了。急需做無聊的畢業設計



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲欧美日韩天堂一区二区| 亚洲xxxx在线| 欧美日韩在线视频一区二区| 欧美性猛交xxxx偷拍洗澡| 亚洲国产成人精品久久| 亚洲国产精品yw在线观看| 色综合久综合久久综合久鬼88| 欧美日韩午夜视频在线观看| 91久久国产综合久久91精品网站| 欧美午夜性色大片在线观看| 亚洲自拍偷拍色片视频| 久久久之久亚州精品露出| 欧美高清理论片| 在线日韩第一页| 国产精品嫩草影院久久久| 欧美一区二区三区四区在线| 亚洲色图第三页| 欧美日韩成人黄色| 亚洲成人动漫在线播放| 久久久久久com| 97视频在线观看免费| 亚洲精品v天堂中文字幕| 国产精品成人免费视频| 成人精品福利视频| 国产精品爱啪在线线免费观看| 成人免费视频xnxx.com| 亚洲黄色有码视频| 综合久久五月天| 91久久精品日日躁夜夜躁国产| 亚洲国产高潮在线观看| 97成人在线视频| 亚洲精品乱码久久久久久金桔影视| 国产婷婷成人久久av免费高清| 成人欧美一区二区三区黑人| 91产国在线观看动作片喷水| 日韩精品视频三区| 国产精品久久久久久网站| 日韩在线视频免费观看| 国产精品久久久久久av| 欧美中文在线免费| 欧美日韩人人澡狠狠躁视频| 97久久精品视频| 97在线观看视频| 久久久精品亚洲| 91中文在线视频| 国产做受高潮69| 日韩免费中文字幕| 国内精品一区二区三区| 国产成人一区二区三区电影| 日韩激情第一页| 精品高清美女精品国产区| 日韩av网址在线| 欧美一级视频一区二区| 欧美一区亚洲一区| 日本免费在线精品| 国产xxx69麻豆国语对白| 欧美日韩国产一区二区| 精品久久在线播放| 欧美成人免费全部观看天天性色| 亚洲精品免费在线视频| 日韩成人黄色av| 成人国产精品av| 亚洲视频在线视频| 国产精品第一视频| 亚洲成色777777女色窝| 亚洲欧美日韩网| 国产综合在线看| 欧美影院成年免费版| 国产成人啪精品视频免费网| 久热精品视频在线免费观看| 久久久久久久亚洲精品| 国产高清视频一区三区| 国内免费久久久久久久久久久| 久久激情视频免费观看| 中文字幕日韩欧美在线| 欧美在线观看视频| 亚洲理论在线a中文字幕| 久久噜噜噜精品国产亚洲综合| 中文字幕国产精品久久| 久久久久久久久久久久av| 精品人伦一区二区三区蜜桃免费| 亚洲电影免费观看高清| 91精品国产91久久久久久不卡| 中文字幕精品国产| 九色精品美女在线| 亚洲国产精品免费| 亚洲精品电影久久久| 亚洲精品国产精品国产自| 久久久99久久精品女同性| 一区二区三区回区在观看免费视频| 一区二区亚洲精品国产| 亚洲第一视频网| 欧美激情高清视频| 国产精品揄拍500视频| 搡老女人一区二区三区视频tv| 亚洲成人久久一区| 国产精品一区二区久久久久| 久久99热精品| 另类视频在线观看| 精品成人av一区| 亚洲欧洲日韩国产| 欧美午夜www高清视频| 成人在线观看视频网站| 日韩av三级在线观看| 日韩国产高清污视频在线观看| 亚洲精品在线不卡| 久久国产精品网站| 日韩美女视频免费在线观看| 国产精品亚洲欧美导航| 国产精品专区h在线观看| 午夜免费日韩视频| 欧美日韩在线视频首页| 亚洲性生活视频| 美女少妇精品视频| 日韩国产欧美精品在线| 两个人的视频www国产精品| 亚洲欧美视频在线| 日韩免费在线观看视频| 亚洲视频综合网| 日韩精品小视频| 国产精品久久久久久久久久久久久久| 成人免费直播live| 欧美性xxxxx极品娇小| 亚洲18私人小影院| 国内自拍欧美激情| 成人黄色免费看| 亚洲精品999| 久久久久久国产精品久久| 国产精品香蕉国产| 国产精品美乳在线观看| 欧美一级黑人aaaaaaa做受| 亚洲伊人久久大香线蕉av| 亚洲国产日韩欧美在线动漫| 久久国产视频网站| 欧美一区二区视频97| 日韩欧美亚洲国产一区| 欧美性猛交xxxx免费看久久久| 羞羞色国产精品| 日韩中文字幕第一页| 亚洲成成品网站| 热久久视久久精品18亚洲精品| 欧美午夜精品在线| 国产精品一区二区三| 91tv亚洲精品香蕉国产一区7ujn| 午夜精品一区二区三区在线播放| 午夜精品久久久久久久久久久久久| 国产精品视频白浆免费视频| 成人免费午夜电影| 亚洲欧美日韩国产中文| 亚洲国产又黄又爽女人高潮的| 国产国语videosex另类| 欧美精品在线免费观看| 亚洲香蕉成视频在线观看| 中文字幕v亚洲ⅴv天堂| 欧美精品第一页在线播放| 日韩中文字幕av| 国内揄拍国内精品| 中日韩美女免费视频网站在线观看| 中文字幕久久精品| 欧美激情欧美激情在线五月| 国产丝袜精品第一页| 69国产精品成人在线播放| 欧美高清视频一区二区| 国产精品一区二区电影|