Java Web目錄結(jié)構(gòu)
Java Web應(yīng)用的目錄有嚴(yán)格的存放規(guī)則。一般為:
WEB-INF和META-INF是java web項(xiàng)目特有目錄顾复,放在根目錄下,且全部是大寫。
WEB-INF
基本內(nèi)容有: /WEB-INF/web.xml Web應(yīng)用程序配置文件荐绝,非常常用。這是一個(gè)XML文件避消,其中描述了 servlet 和其他的應(yīng)用組件配置及命名規(guī)則低滩。程序的入口描述也在這里召夹。
/WEB- INF/classes/ 編譯好的類文件會放到這個(gè)目錄里。
/WEB- INF/lib/ 項(xiàng)目引用到的各種JAR文件恕沫,如spring jar文件
META-INF
存放程序入口信息监憎,里面的MANIFEST文件記錄了這些信息,可以歸納出下面幾個(gè)大類:
一. 一般屬性
1.Manifest-Version 用來定義manifest文件的版本婶溯,例如:Manifest-Version: 1.0
2.Created-By 聲明該文件的生成者鲸阔,一般該屬性是由jar命令行工具生成的,例如:Created-By: Apache Ant 1.5.1
3.Signature-Version 定義jar文件的簽名版本
4.Class-Path 應(yīng)用程序或者類裝載器使用該值來構(gòu)建內(nèi)部的類搜索路徑 二. 應(yīng)用程序相關(guān)屬性
5.Main-Class 定義jar文件的入口類迄委,該類必須是一個(gè)可執(zhí)行的類褐筛,一旦定義了該屬性即可通過 java -jar x.jar來運(yùn)行該jar文件。 三. 小程序(Applet)相關(guān)屬性
6.Extendsion-List 該屬性指定了小程序需要的擴(kuò)展信息列表叙身,列表中的每個(gè)名字對應(yīng)以下的屬性
7.-Extension-Name
8.-Specification-Version
9.-Implementation-Version
10.-Implementation-Vendor-Id
11.-Implementation-URL 四. 擴(kuò)展標(biāo)識屬性
12.Extension-Name 該屬性定義了jar文件的標(biāo)識渔扎,例如Extension-Name: Struts Framework 五. 包擴(kuò)展屬性
13.Implementation-Title 定義了擴(kuò)展實(shí)現(xiàn)的標(biāo)題
14.Implementation-Version 定義擴(kuò)展實(shí)現(xiàn)的版本
15.Implementation-Vendor 定義擴(kuò)展實(shí)現(xiàn)的組織
16.Implementation-Vendor-Id 定義擴(kuò)展實(shí)現(xiàn)的組織的標(biāo)識
17.Implementation-URL : 定義該擴(kuò)展包的下載地址(URL)
18.Specification-Title 定義擴(kuò)展規(guī)范的標(biāo)題
19.Specification-Version 定義擴(kuò)展規(guī)范的版本
20.Specification-Vendor 聲明了維護(hù)該規(guī)范的組織
21.Sealed 定義jar文件是否封存,值可以是true或者false (這點(diǎn)我還不是很理解) 六. 簽名相關(guān)屬性 簽名方面的屬性我們可以來參照J(rèn)avaMail所提供的mail.jar中的一段 Name: javax/mail/Address.class Digest-Algorithms: SHA MD5 SHA-Digest: AjR7RqnN//cdYGouxbd06mSVfI4= MD5-Digest: ZnTIQ2aQAtSNIOWXI1pQpw== 這段內(nèi)容定義類簽名的類名曲梗、計(jì)算摘要的算法名以及對應(yīng)的摘要內(nèi)容(使用BASE64方法進(jìn)行編碼)
系統(tǒng)分層
推薦如下分層結(jié)構(gòu)赞警,圖中默認(rèn)上層依賴于下層,箭頭關(guān)系表示可直接依賴虏两,如:OpenApi層可以依賴于Web層愧旦,也可以直接依賴于Service層,依此類推:
OpenApi層:可直接封裝Service接口暴露成HSF接口定罢,或者通過Web封裝成http接口笤虫。 顯示層:模板渲染層。當(dāng)前主要是velocity渲染祖凫,JS渲染琼蚯,JSP渲染等。 Web層:主要是對訪問控制進(jìn)行轉(zhuǎn)發(fā)惠况,各類基本參數(shù)校驗(yàn)遭庶,或者不復(fù)用的業(yè)務(wù)簡單處理等。 Service層:相對具體的業(yè)務(wù)邏輯服務(wù)層稠屠。 Manager層:通用業(yè)務(wù)處理層峦睡,它有如下特征:
1) 對第三方平臺封裝的層,預(yù)處理返回結(jié)果及轉(zhuǎn)化異常信息权埠; 2) 對Service層通用能力的下沉榨了,如緩存方案、中間件通用處理攘蔽; 3) 與DAO層交互龙屉,對DAO的業(yè)務(wù)通用能力的封裝。
DAO層:數(shù)據(jù)訪問層满俗,與底層Mysql转捕、Oracle作岖、Hbase、OB進(jìn)行數(shù)據(jù)交互瓜富。 第三方平臺:包括其它部門HSF開放接口鳍咱,基礎(chǔ)平臺,其它公司的HTTP接口与柑。
異常處理規(guī)約分層
在DAO層谤辜,產(chǎn)生的異常類型有很多,無法用細(xì)粒度異常進(jìn)行catch价捧,使用catch(Exception e)方式丑念,并throw new DaoException(e),不需要打印日志结蟋,因?yàn)槿罩驹贛anager/Service層一定需要捕獲并打到日志文件中去脯倚,如果同臺服務(wù)器再打日志,浪費(fèi)性能和存儲嵌屎。
??在Service層往上拋的同時(shí)就必須使用日志推正,因?yàn)槭荝PC調(diào)用,可能本地出錯(cuò)宝惰,未必能正常反饋到業(yè)務(wù)端植榕。這里就必須盡可能帶上參數(shù)信息,相當(dāng)于保護(hù)案發(fā)現(xiàn)場尼夺,并打印異常堆棧尊残。
??如果Manager層與Service同機(jī)部署,日志方式與DAO層處理一致淤堵,如果是單獨(dú)部署寝衫,則采用與Service一致的處理方式。
??Web層絕不應(yīng)該繼續(xù)往上拋異常拐邪,因?yàn)橐呀?jīng)處于頂層慰毅,無繼續(xù)處理異常的方式,如果意識到這個(gè)異常將導(dǎo)致頁面無法正常渲染扎阶,那么就應(yīng)該直接跳轉(zhuǎn)到友好錯(cuò)誤頁面事富,盡量加上友好的錯(cuò)誤提示信息。
??openApi層要將異常處理成錯(cuò)誤碼和錯(cuò)誤信息方式返回
領(lǐng)域模型分層
DO(Data Object)
與數(shù)據(jù)庫表結(jié)構(gòu)一一對應(yīng)乘陪,通過DAO層向上傳輸數(shù)據(jù)源對象。
DTO(Data Transfer Object)
數(shù)據(jù)傳輸對象雕擂,Service和Manager向外傳輸?shù)膶ο蟆?br>
BO(Business Object)
業(yè)務(wù)對象啡邑。可以由Service層輸出的封裝業(yè)務(wù)邏輯的對象井赌。
QUERY
數(shù)據(jù)查詢對象谤逼,各層接收上層的查詢請求贵扰。
注:超過2個(gè)參數(shù)的查詢封裝,禁止使用Map類來傳輸流部。
VO(View Object)
顯示層對象戚绕,通常是Web向模板渲染引擎層傳輸?shù)膶ο蟆?/p>