滌生的天空
BlogJava
首頁
新隨筆
新文章
聯系
聚合
管理
posts - 11, comments - 28, trackbacks - 0
iBatis的JpetStore示例中MVC機制實現的研究,BeanAction,BaseBean
JpetStore中的Action與普通Struts的Action處理方式不一樣。遍歷JpetStore的src文件夾,并無一個具體的Action,那么它是如何來完成普通Struts的Action工作了?
查看JpetStore的Struts.xml可以發現,它的Action只有一個,即“org.apache.stuts.beanaction.Beanaction”。通過Eclipse查看beanaction.jar的源代碼,可以發現Beanaction繼承與普通Action,即具備普通的action的功能。那么它無具體Action的奧妙在哪,繼續研究BeanAction的代碼,截取BeanAction的excute方法中核心部分代碼如下:?
/**/
/*
遍歷此方法的業務邏輯可知,*的優先級最高,如果是*,則不調用任何方法直接Forward,類似于ForwardAction
*/
?
private
?
static
?
final
?String?NO_METHOD_CALL?
=
?
"
*
"
;?
…….?
/**/
/*
所有的FormBean都繼承于BaseBean
*/
?
BaseBean?bean?
=
?(BaseBean)?form;?
??????ActionContext.initCurrentContext(request,?response);?
??????
if
?(bean?
!=
?
null
)?
{?
????????
//
?Explicit?Method?Mapping?
/**/
/*
下面是檢查struts.xml配置中是否有parameter屬性
*/
?
????????Method?method?
=
?
null
;?
????????String?methodName?
=
?mapping.getParameter();?
????????
if
?(methodName?
!=
?
null
?
&&
?
!
NO_METHOD_CALL.equals(methodName))?
{?
??????????
try
?
{?
/**/
/*
通過反射,根據得到的方法名稱取得方法的句柄
*/
?
????????????method?
=
?bean.getClass().getMethod(methodName,?
null
);?
????????????
synchronized
?(bean)?
{?
/**/
/*
下面是關鍵一句,調用basebean擁有的接口ActionInterceptor的實現DefaultActionInterceptor,來完成具體方法的調用
*/
?
??????????????forward?
=
?bean.getInterceptor().intercept(
new
?ActionInvoker(bean,?method));?
????????????}
?
?????????……..?
/**/
/*
無Parameter屬性,檢查path路徑的最后一個/后的名稱,即為調用的方法名
*/
?
????????
//
?Path?Based?Method?Mapping?
????????
if
?(method?
==
?
null
?
&&
?
!
NO_METHOD_CALL.equals(methodName))?
{?
??????????methodName?
=
?mapping.getPath();?
??????????
if
?(methodName.length()?
>
?
1
)?
{?
????????????
int
?slash?
=
?methodName.lastIndexOf(
"
/
"
)?
+
?
1
;?
????????????methodName?
=
?methodName.substring(slash);?
????????????
if
?(methodName.length()?
>
?
0
)?
{?
??????????????
try
?
{?
????????????????method?
=
?bean.getClass().getMethod(methodName,?
null
);?
????????????????
synchronized
?(bean)?
{?
??????????????????forward?
=
?bean.getInterceptor().intercept(
new
?ActionInvoker(bean,?method));?
????????????????}
?
?????????????……..?
/**/
/*
根據調用方法返回的String,得到頁面的轉移路徑
*/
?
return
?mapping.findForward(forward);?
?
通過研究上面這段代碼,我們可知,JpetStore中沒有具體Action實現的關鍵原因即在于下面這幾句
/**/
/*
通過反射,根據得到的方法名稱取得方法的句柄
*/
?
????????????method?
=
?bean.getClass().getMethod(methodName,?
null
);?
????????????
synchronized
?(bean)?
{?
/**/
/*
下面是關鍵一句,調用basebean擁有的接口ActionInterceptor的實現DefaultActionInterceptor,來完成具體方法的調用
*/
?
??????????????forward?
=
?bean.getInterceptor().intercept(
new
?ActionInvoker(bean,?method));?
????????????}
?
即將原來Action中的excute方法的實現轉移到FormBean中,這樣實現顯得更為簡捷,方便。研究ActionInvoke,它的核心代碼如下:
public
?String?invoke()?
{?
????
try
?
{?
??????
return
?(String)?method.invoke(bean,?
null
);?
????}
?
catch
?(Exception?e)?
{?
??????
throw
?
new
?BeanActionException(
"
Error?invoking?Action.??Cause:?
"
?
+
?e,?e);?
????}
?
??}
?
至此可知,它調用的是formbean中的函數。且從這段代碼可知,formbean的這類特殊函數,此處稱為action方法,要符合兩個特征:1)無參數;2)返回值為string,此返回string即是Struts-config.xml的全局或局部的forward。
以上是整個beanaction的實現機制。個人感覺此種實現方法對于開發者而言已經類似于ASP.NET的.aspx與.cs開發模式了。下面是通過實例來說明一下BeanAction如何控制formbean的
?
Struts-config.xml的配置里有3種映射方式,來告訴BeanAction把控制轉到哪個form bean對象的哪個方法來處理。
(1)parameter=”*’直接跳轉;(2)Parameter中含具體的方法名;(3)Path中最后一個/后的方法名
以這個請求連接為例http://localhost/jpetstore4/shop/viewOrder.shtml
1. URL Pattern
???
<
action?
path
="/shop/viewOrder"
?type
="com.ibatis.struts.BeanAction"
????name
="orderBean"
?scope
="session"
????validate
="false"
>
????
<
forward?
name
="success"
?path
="/order/ViewOrder.jsp"
/>
??
</
action
>
?
此種方式表示,控制將被轉發到"orderBean"這個form bean對象 的"viewOrder"方法(行為)來處理。方法名取"path"參數的以"/"分隔的最后一部分。
2. Method Parameter?
<
action?
path
="/shop/viewOrder"
?type
="com.ibatis.struts.BeanAction"
????name
="orderBean"
?parameter
="viewOrder"
?scope
="session"
????validate
="false"
>
????
<
forward?
name
="success"
?path
="/order/ViewOrder.jsp"
/>
??
</
action
>
?
此種方式表示,控制將被轉發到"orderBean"這個form bean對象的"viewOrder"方法(行為)來處理。配置中的"parameter"參數表示form bean類上的方法。"parameter"參數優先于"path"參數。
3. No Method call
?
<
action?
path
="/shop/viewOrder"
?type
="com.ibatis.struts.BeanAction"
????name
="orderBean"
?parameter
="*"
?scope
="session"
????validate
="false"
>
????
<
forward?
name
="success"
?path
="/order/ViewOrder.jsp"
/>
??
</
action
>
此種方式表示,form bean上沒有任何方法被調用。如果存在"name"屬性,則struts把表單參數等數據填充到form bean對象后,把控制轉發到"success"。否則,如果name為空,則直接轉發控制到"success"。
這就相當于struts內置的org.apache.struts.actions.ForwardAction的功能
<
action?
path
="/shop/viewOrder"
?type
="org.apache.struts.actions.ForwardAction"
????parameter
="/order/ViewOrder.jsp?"
?scope
="session"
?validate
="false"
>
?
</
action
>
?
?
posted on 2007-01-12 16:34
滌生
閱讀(3883)
評論(8)
編輯
收藏
FeedBack:
#
re: iBatis的JpetStore示例中MVC機制實現的研究,BeanAction,BaseBean
2007-01-12 18:46 |
小武藏
scope="session"
不知道為什么要使用session呢?request不行么?
回復
更多評論
#
re: iBatis的JpetStore示例中MVC機制實現的研究,BeanAction,BaseBean
2007-01-13 11:46 |
江南白衣
好文,滌生的分析方便了一大堆覺得BaseAction非常棒,又懶得去看去理解源碼,沒有理解之前又不敢用它的懶人,比如我:)
回復
更多評論
#
re: iBatis的JpetStore示例中MVC機制實現的研究,BeanAction,BaseBean[未登錄]
2007-01-14 22:31 |
jooroo
好文!不知為何beanaction包只是試驗性質的用一用,是否有些什么defect我們不知道?
回復
更多評論
#
re: iBatis的JpetStore示例中MVC機制實現的研究,BeanAction,BaseBean
2007-01-15 13:21 |
滌生
beanaction,這個是否有defect,不清楚了。我只是在學習這個JpetStore,把學習時的疑惑給理清楚。具體的beanaction有什么defect,需要深入的研究、使用才知道。
回復
更多評論
#
re: iBatis的JpetStore示例中MVC機制實現的研究,BeanAction,BaseBean
2007-01-15 13:22 |
滌生
為什么使用Session不使用request,這個應該是由于它的實際需求+統一風格決定的。其實很多地方是可以使用request的
回復
更多評論
#
re: iBatis的JpetStore示例中MVC機制實現的研究,BeanAction,BaseBean
2007-01-16 12:54 |
小武藏
謝謝滌生,我明白了。
回復
更多評論
#
re: iBatis的JpetStore示例中MVC機制實現的研究,BeanAction,BaseBean
2008-01-22 22:27 |
龐宏濤
我覺得這種方式有性能的損失,struts不是線程安全的,通過這種方式的話必須要求synchronized,也就是在一個時刻只能有一個用戶執行 forward = bean.getInterceptor().intercept(new ActionInvoker(bean, method));
其他的都要排隊等待,在大并發量的系統上肯定不行,這種也只能做做例子什么的。
回復
更多評論
#
re: iBatis的JpetStore示例中MVC機制實現的研究,BeanAction,BaseBean
2008-01-28 18:03 |
it942
怎么現在JpetStore又用BaseAction了。
回復
更多評論
新用戶注冊
刷新評論列表
只有注冊用戶
登錄
后才能發表評論。
網站導航:
博客園
IT新聞
Chat2DB
C++博客
博問
管理
Copyright ©2025 滌生 Powered by:
博客園
模板提供:
滬江博客
<
2007年1月
>
日
一
二
三
四
五
六
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
7
8
9
10
常用鏈接
我的隨筆
我的評論
我的參與
最新評論
留言簿
(5)
給我留言
查看公開留言
查看私人留言
隨筆檔案
2007年1月 (11)
UML
類與類關系的UML圖與代碼表現
描述的簡單、清楚
搜索
最新評論
1.?re: ibatis JshopStore5的sqlmap的xml錯誤,NestedSQLException錯誤
@junmy
你走得路,先人已經走過N多次了.
你再走來,不覺得可恥嗎?
--LingShame
2.?re: ibatis JshopStore5的sqlmap的xml錯誤,NestedSQLException錯誤
好內容,以前研究過,不過好久了, 最近寫了幾句,也發現了這個問題
--ossoftwaare
3.?re: 如何在Eclipse中運行ibatis的JpetStore
寫的不錯,看了作者的描述,已經把問題解決了,謝謝。
--dashen
4.?re: 如何在Eclipse中運行ibatis訪問MsSqlServer
好,正需要,回去試試先.謝謝了
--一個人
5.?re: 如何在Eclipse中使用ibatis的自動代碼生成工具Abator
iBatis
大全~
--墻頭草
閱讀排行榜
1.?IBatis的分頁研究(8459)
2.?如何在Eclipse中運行ibatis的JpetStore(4280)
3.?iBatis的JpetStore示例中MVC機制實現的研究,BeanAction,BaseBean(3883)
4.?ibatis JshopStore5的sqlmap的xml錯誤,NestedSQLException錯誤(3364)
5.? 根據iBatis的JPetStore學習測試示例的寫法(3333)
評論排行榜
1.?iBatis的JpetStore示例中MVC機制實現的研究,BeanAction,BaseBean(8)
2.?ibatis JshopStore5的sqlmap的xml錯誤,NestedSQLException錯誤(6)
3.?IBatis的分頁研究(6)
4.?如何在Eclipse中運行ibatis的JpetStore(4)
5.?ibaits的JPetStore中持久層的研究、事務的處理(2)
主站蜘蛛池模板:
精品韩国亚洲av无码不卡区
|
在线观看日本亚洲一区
|
一级毛片免费毛片毛片
|
香蕉大伊亚洲人在线观看
|
日本免费网站视频www区
|
亚洲色图校园春色
|
女人裸身j部免费视频无遮挡
|
成人毛片免费观看视频大全
|
亚洲综合在线一区二区三区
|
影音先锋在线免费观看
|
亚洲成a∧人片在线观看无码
|
白白国产永久免费视频
|
亚洲五月六月丁香激情
|
免费精品无码AV片在线观看
|
亚洲美女视频网站
|
成人毛片免费网站
|
免费手机在线看片
|
亚洲国产成人片在线观看无码
|
久久aa毛片免费播放嗯啊
|
免费夜色污私人影院在线观看
|
亚洲理论在线观看
|
久久精品免费一区二区喷潮
|
亚洲欧美不卡高清在线
|
四虎成年永久免费网站
|
亚洲午夜无码久久
|
亚洲精品成人区在线观看
|
久久精品国产影库免费看
|
亚洲国产综合在线
|
四虎永久在线精品免费影视
|
久久99精品免费一区二区
|
亚洲精品乱码久久久久久下载
|
亚洲精品动漫人成3d在线
|
一级毛片大全免费播放下载
|
亚洲成av人影院
|
性色av免费观看
|
拍拍拍无挡视频免费观看1000
|
亚洲fuli在线观看
|
亚洲国产综合人成综合网站
|
日韩精品久久久久久免费
|
亚洲国产高清国产拍精品
|
亚洲国产另类久久久精品小说
|