版權(quán)所有:(xiaodaoxiaodao)藍(lán)小刀
??
xiaodaoxiaodao@gmail.com
http://m.tkk7.com/xiaodaoxiaodao/archive/2007/08/04/134384.html
???
??
轉(zhuǎn)載請注明來源/作者
?
?
關(guān)于項(xiàng)目框架設(shè)計(jì)的一點(diǎn)學(xué)習(xí)
?
這兩天又在接觸一個新項(xiàng)目,對于如何設(shè)計(jì)一個項(xiàng)目的框架有了點(diǎn)概念,關(guān)于web項(xiàng)目(對于oa系統(tǒng)來說)的主體感覺比較需要設(shè)計(jì)的幾部分為:
1.?
頁面模板定義:關(guān)于view層展示,無論對于top(頂層菜單)+left(左邊樹狀菜單)+right(主體內(nèi)容)結(jié)構(gòu)還是left+right結(jié)構(gòu),都需要首先定制一些模板,如struts中可使用tiles定義。
2.?
分頁標(biāo)簽:自定義一個比較通用的分頁標(biāo)簽或者使用一些框架中自帶的(如struts-menu或者JSF中的t:dataScroller),不過比較好的做法是基于其源碼編寫自己的分頁標(biāo)簽。
3.?
DB
設(shè)計(jì):可使用Power Deisign等設(shè)計(jì)數(shù)據(jù)庫表結(jié)構(gòu),產(chǎn)生相關(guān)的表。
4.?
代碼自動生成:編寫代碼生成腳本如build.xml文件的編寫(根據(jù)DB生成代碼,也可以忽略3,先建model,再從model生成代碼和數(shù)據(jù)庫schema),生成Struts、Spring、Hibernate相關(guān)文件。
?
關(guān)于代碼的整體架構(gòu)如下:
?
action
層:處理從view層傳遞過來的數(shù)據(jù)。
service
層:封裝業(yè)務(wù)邏輯,一般同時(shí)在spring中聲明事務(wù)代理。
dao
層:進(jìn)行事務(wù)中的原子操作,同時(shí)在spring中注入相應(yīng)的sessionFactory。
?
Spring + Struts
取得spring的bean的兩種常用方法:
1.????
DelegatingActionProxy
:將所有action標(biāo)簽中type屬性設(shè)為org.springframework.web.struts.DelegatingActionProxy 也就是將action委托給了spring,同時(shí)在
action-servlets.xml
中配置一個于action標(biāo)簽path屬性對應(yīng)的bean(也就是bean的name值等于action的path值),如:
struts-config.xml
中,以struts的plugin的方式,讓spring接管struts的action:
<
action
name
=
"portalForm"
parameter
=
"method"
path
=
"/portalAction"
type
=
"org.springframework.web.struts.DelegatingActionProxy"
scope
=
"request"
>
???
<
forward
name
=
"portalEdit"
path
=
"
pages/portalEdit.jsp"
/>
???
<
forward
name
=
"portalList"
path
=
"
pages/portalList.jsp "
/>
</
action
>
<
plug-in
className
=
"org.springframework.web.struts.ContextLoaderPlugIn"
>
???
<
set-property
property
=
"contextConfigLocation"
?????????
value
=
"/WEB-INF/action-servlets.xml"
/>
</
plug-in
>
?
action-servlets.xml
(配置文件格式和spring配置一樣)中:
<
beans
>
???
<
bean
name
=
"/portalAction"
?????????
class
=
"com.cn.lively.action.PortalMainAction"
>
???????
<
property
name
=
"portalService"
>
???????????
<
ref
bean
=
"portalService"
/>
???????
</
property
>
???
</
bean
>
</
beans
>
?
2.????
WebApplicationContextUtils.getRequiredWebApplicationContext
:在action中獲得spring的bean,
public Object
getService
(String name) {??
??? ApplicationContext
wac
=???? WebApplicationContextUtils.getRequiredWebApplicationContext(servlet.getServletContext());??
??? return
wac
.getBean(name);??
}??
這種方式?jīng)]有在struts里邊加入spring的plugin,實(shí)際上是使用了依賴查找來獲得對象,并且在servlet代碼中硬編碼了應(yīng)用對象的bean名字。
?
附:
感覺一個國內(nèi)小型項(xiàng)目(周期半年左右)的開發(fā),完美的團(tuán)隊(duì)大概四個人左右就夠了,
A
:前期框架設(shè)計(jì) + 開發(fā)過程中不斷改進(jìn)完美整個框架,角色——架構(gòu)師
B
:前期需求調(diào)研 + 開發(fā)過程中負(fù)責(zé)技術(shù)難度比較大的模塊開發(fā),角色——程序員
C
:前期需求調(diào)研負(fù)責(zé)人 + 開發(fā)過程中負(fù)責(zé)業(yè)務(wù)邏輯復(fù)雜的模塊開發(fā),角色——項(xiàng)目負(fù)責(zé)人
D
:前期需求調(diào)研 + 開發(fā)過程中負(fù)責(zé)模塊開發(fā),角色——程序員
同時(shí)B、C負(fù)責(zé)共同解決開發(fā)中出現(xiàn)的技術(shù)和業(yè)務(wù)問題,C負(fù)責(zé)控制項(xiàng)目進(jìn)度,
項(xiàng)目后期,B、C、D進(jìn)行交叉測試,A負(fù)責(zé)review代碼。
?
如果公司已經(jīng)比較成熟的框架(即基本系統(tǒng)管理模塊 + 代碼自動生成),那么角色A可以省略,只需要B、C、D三個人即可進(jìn)行項(xiàng)目開發(fā),其中角色B在開發(fā)中擔(dān)當(dāng)一部分A的角色。
甚至可以只由B、C兩個人進(jìn)行開發(fā),把角色D的工作分擔(dān)到B、C身上,B側(cè)重技術(shù),C側(cè)重業(yè)務(wù)邏輯。
?
版權(quán)所有:(xiaodaoxiaodao)藍(lán)小刀
??
xiaodaoxiaodao@gmail.com
?