日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

SSH框架中不为人知的细节(一)

發(fā)布時間:2024/4/15 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SSH框架中不为人知的细节(一) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

為什么80%的碼農(nóng)都做不了架構(gòu)師?>>> ??

一、 ModelDriven的運行機制

????大家都知道前臺表單數(shù)據(jù)向后臺傳遞的時候,調(diào)用的Action會實現(xiàn)ModelDriven接口。偽碼如下:

VO偽碼:

public?class?User?{private?String?userName;private?String?password;//setter?and?getter//.... }

Action偽碼:

public?class?UserAction?implements?ModelDriven?{private?User?user?=?new?User();public?String?addUser()?{//相應(yīng)的業(yè)務(wù)邏輯}@Overridepublic?Object?getModel()?{return?user;} }

JSP偽碼:

<form?action="xxx/user-add.action"?method="post">username:<input?type="text"?name="username"?/>password:<input?type="text"?name="password"?/><input?type="submit"?name="submit"?value="添加"?/> </form>

????上面的代碼相信大家非常熟悉,但是大家知道Strusts是如何把表單的值填到VO中的?如果你確實無法回答,那么建議認(rèn)真往下讀。

????用過Struts的人一定都聽說過值棧(后面還會專門介紹),ModelDriven背后的機制正是VlaueStack。JSP頁面上的username/password能夠被直接賦給user對象,這證明user對象是ValueStack中的一個root對象。那么,user對象是怎么進入ValueStack的呢?答案就是ModelDrivenInterceptor,攔截器大家一定也聽說過,在這個攔截器中,會判斷當(dāng)前要調(diào)用的Action對象是否實現(xiàn)了ModelDriven接口,如果是,這調(diào)用getModel方法,并把返回值壓入ValueStack。

ModelDrivenInterceptor的代碼:

public?class?ModelDrivenInterceptor?extends?AbstractInterceptor?{protected?boolean?refreshModelBeforeResult?=?false;public?void?setRefreshModelBeforeResult(boolean?val)?{this.refreshModelBeforeResult?=?val;}@Overridepublic?String?intercept(ActionInvocation?invocation)?throws?Exception?{Object?action?=?invocation.getAction();if?(action?instanceof?ModelDriven)?{??//判斷是否實現(xiàn)ModelDriver接口ModelDriven?modelDriven?=?(ModelDriven)?action;ValueStack?stack?=?invocation.getStack();Object?model?=?modelDriven.getModel();if?(model?!=??null)?{stack.push(model);?//將Action中g(shù)etModel()方法返回的對象壓入值棧}//下面這句條件判斷有什么作用呢,請繼續(xù)往下看if?(refreshModelBeforeResult)?{invocation.addPreResultListener(new?RefreshModelBeforeResult(modelDriven,?model));}}return?invocation.invoke();}

????我們通過一個例子來看下為什么要refreshModelBeforeResult。

Action偽碼:

public?class?UserAction?implements?ModelDriven?{private?User?user?=?new?User();public?String?viewUser()?{//相應(yīng)的業(yè)務(wù)邏輯user?=?userService.viewUser();?//從數(shù)據(jù)庫取出數(shù)據(jù)封裝到user對象中return?"更新頁面";????}@Overridepublic?Object?getModel()?{return?user;} }

JSP偽碼:

<form?action="xxx/user-update.action"?method="post">username:<input?type="text"?name="username"?value="<s:property?value="username"?/>"?/>password:<input?type="text"?name="password"?value="<s:property?value="username"?/>"?/><input?type="submit"?name="submit"?value="更新"?/> </form>

????在更新操作錢,肯定需要先獲取到數(shù)據(jù),如果沒有if(refreshModelBeforeResult),user對象通過getModel()方法被壓入到ValueStack中,這時候,UserAction和ValueStack都指向同一個user對象,但緊接著,UserAction中的user被一個新的user對象覆蓋,這時候,UserAction和ValueStack不再指向同一個user對象!ValueStack中仍是舊的user對象,而UserAction中是最新的user對象,但是我們知道,在jsp頁面訪問的都是ValueStack中的user對象,所以它的屬性都將是空的。

????通過以上的分析,可以猜測,通過if(refreshModelBeforeResult)最終要將最新的值壓入ValueStack。

相關(guān)源碼:

//?Add?the?new?model?on?the?stack if?(needsRefresh)?{//?Clear?off?the?old?model?instanceif?(originalModel?!=?null)?{root.remove(originalModel);}if?(newModel?!=?null)?{stack.push(newModel);} }

????即將酒的model從ValueStack中移除,將新的model壓入ValueStack!

轉(zhuǎn)載于:https://my.oschina.net/vbird/blog/202500

總結(jié)

以上是生活随笔為你收集整理的SSH框架中不为人知的细节(一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。