這里所謂的非侵入性,是指一定程度上的耦合性,比如IMVC和待開發(fā)項(xiàng)目的耦合性,servlet容器和IMVC的耦合性,IMVC內(nèi)部處理的耦合性等等。
1.action非繼承。由于java語言不允許多重繼承,如果action被框架所迫需要繼承類的話,那么這個action的擴(kuò)展性將受到一定的限制,比如struts的繼承性就設(shè)計(jì)的比較失敗。
2.formBean的無侵入,IMVC中的formBean不需要繼承人和類,甚至不需要實(shí)現(xiàn)任何接口,完全的一個pojo實(shí)體就能勝任。
3.半servlet容器相關(guān)性,之所以說是半,因?yàn)镮MVC的容器無關(guān)性是間于struts和webwork之間的,struts的action接受 httpServletRequest和HttpServletResponse類實(shí)例作為參數(shù),另測試變得避免麻煩(雖然有工具可以輔助測試),這種 servlet完全相關(guān)性的設(shè)計(jì),讓action中獲取servlet數(shù)據(jù)變得容易,但是卻帶來了測試痛苦的后果。而反過來,webwork的 action中不需要傳入任何servlet相關(guān)部件,webwork通過一個轉(zhuǎn)回去把servlet中的數(shù)據(jù)拷貝到一個容器無關(guān)類。非常有利于測試,但是對于在action中獲取servlet數(shù)據(jù)變得不夠直觀(可以獲取的),而且,每次請求都拷貝數(shù)據(jù)也有礙于性能的提升。IMVC的設(shè)計(jì)則介于兩者之間。在IMVC的action中沒有傳入servlet任何部件,但是可以通過InstantContext獲得request和response(注意不是獲取request的數(shù)據(jù),而是request,不用花費(fèi)拷貝到性能)。但是,在攔截器設(shè)計(jì)中,傳入的卻是 servlet部件,因?yàn)閿r截器一般不會用于action單元測試,而且如果你對上面的action半容器無關(guān)性對于單元測試和獲取cookies的數(shù)據(jù)有疑惑,那么可以在攔截器中獲取你想要的cookie,然后傳入攔截器的另一個參數(shù)Value,action通過Value獲取cookie,這樣一來,明明半容器無關(guān)性的action測試,卻可以通過攔截器來實(shí)現(xiàn)完全容器無關(guān)的action,這樣一來,既滿足性能需求,又滿足測試需求。
4 攔截器的天下。和webwork一樣,IMVC中的攔截器是相當(dāng)重要的組成部分。可以配置全局?jǐn)r截器,路徑攔截器,ajax鏈(這個以后會詳解)攔截器,有趣的是,我們還有一個文件上傳攔截器,IMVC是集成文件上傳到,可以通過在action幾行代碼實(shí)現(xiàn)一個文件上傳,而一般我們要更具自己的特性來處理上傳完后的文件或者自定義的取名字,在或者做自己的縮略圖等等。IMVC設(shè)計(jì)了一個文件上傳攔截器,可以通過實(shí)例一個攔截器來實(shí)現(xiàn)這些功能,非常方便。
--InstantMVC:j2ee輕量級mvc框架