網站包括 商家博客,個人博客,論壇,新聞等
設計采用了MVC模式,具體調用的時候采用了命令模式
數據操作層Model中,例如;BlockDAO,TopicDAO,ResponseDAO,UserDAO等。
里面封裝了一個對象所有的數據操作
視圖/傳輸層 View 例如BlockDTO,TopicDTO等,主要是對象的屬性
jsp用它來顯示,dao用它作為DTO
最后就是控制層 Controll 控制層的類都繼承了Service接口
里面有一個方法
execute(ServletContext context, HttpServletRequest request,
HttpServletResponse response) {
}
,因為使用命令模式,后面會說明
例如 ManageBlock, ManageTopic等
主要是接收請求然后調用DAO,把結果返回給jsp
調用的時候,我采用的是命令模式
一個所有請求的總入口Servlet被影射到controll.do;他獲取Service的類名,然后
實例化這個類,調用對應的方法
例如 ../controll.do?Service=ManageBlock&action=save
下面說說安全架構:
網站采用J2EE的身份認證系統,通過對不同路徑的權限限制來做到不用角色具有不同操作捐獻
例如:bbs/user/* 下主要是普通用戶的操作權限
想新建帖子的時候,請求地址是 bbs/user/insertTopic.jsp
bbs/blockAdmin/*主要是板塊管理員的權限
bbs/bbsAdmin/* 下是論壇管理員的權限
bbs/sysAdmin/* 下主要是系統管理員的權限
最后再說說緩存,
緩存的內容主要是數據源,所有板塊分類,所有板塊的信息[因為這些內容不多,而且使用
比較頻繁];還緩存了最新的N個帖子,和點擊率最高的N個帖子;
另外還緩存了N[差不多是每個板塊前5頁的]個帖子點擊數
因為緩存主要有兩類,一個是只讀,一種是讀寫。數據源就屬于只讀的,點擊數就屬于讀寫的
我設計了兩個緩存接口,一個CacheRObject,一個CacheRWObject
CacheRObject里有個init()和 get(key)方法,
init()當然是初始化或者更新緩存的時候用 get方法就是獲取被緩存的對象
CacheRWObject里有init(),save()和get(key)方法
這里多出來的save()就是把緩存里的內容更新到sql數據庫中
具體要緩存什么東西,只要寫一個類繼承CacheRObject,或者CacheRWObject
例如
緩存的屬性設置都是些在cache.xml配置文件中,包括緩存大小,要更新那些緩存對象
更新的間隔等等
服務器啟動的時候,獲取這些設置,初始化緩存;
同時服務器關閉的時候把所有CacheRWObject類型緩存中的內容保存到數據庫
---其實做這個網站前我從來沒做過什么大的java項目,在jdon中也只是一個潛水者,通過這個網站真的學了很多東西,在這里要特別感謝bang大哥和其他各位jdon的兄弟,
說實在的這個網站還有很多自己不滿意的地方,希望大家一起交流一起進步
哦,網站地址:www.cityxiu.com 大家可以去看看
還有bang大哥,我把咱們jdon的logo放到我們論壇的下面了,算是做點貢獻吧
///老大回復
客氣。整體設計把握了良好架構和優異性能兩個點,作為經驗不多的初學者實屬難能可貴。
如果你希望在現在架構上有所提高,下面提供幾點建議:
1.表現層的controller是通過class.forName來加載業務Service的,一般業務Service都比較大,在并發很大情況下,new Service尚且覺得耗時,所以這里是否需要優化一下?使用資源池pool來預先生成這些大的Service。當然,小型的代碼少的service現在這樣就可以了。
2.安全架構使用了J2EE的容器驗證,但是ACL除了URL資源、還有組件方法的ACL,提供了組件方法的ACL,基本杜絕了安全漏洞,否則,多個Jsp調用同一個組件方法,不同級別權限設置的Jsp資源必然導致這個組件方法訪問權限的漏洞。
3.對你緩存分成讀和寫比較感興趣,特別是緩存寫專門做了一個接口,說明你充分認識到緩存重要性,緩存作為數據庫一種臨時替代,起到減少數據庫連接池的占用等,象這個帖子中詢問數據庫連接池設置問題,當我們覺得數據庫連接池設置再大都不能解決問題時,我們是需要象你這樣考慮緩存了,原帖:
http://www.jdon.com/jive/thread.jsp?forum=46&thread=27083
但是使用緩存寫需要考慮因素很多,比如兩個用戶同時寫,如何解決資源爭奪,如何解決死鎖等問題,這些都要求寫緩存質量相當高,所以一般在訪問大情況下發生這樣問題,我們還是依賴數據庫強大的ACID事務機制來解決沖突;或者使用支持事務的緩存如JBossTreeCache等。
一般應用下,讀緩存就可以了,關鍵要做好讀緩存的更新問題,特別是模型類的嵌套情況下,一個AModel嵌套BModel,那么如何保證AModel中的BModel就是讀緩存中的那個BModel,也就是兩者同一,這樣,萬一BModel更新時,只要更新緩存中BModel即可,否則就麻煩了,這些都是非常復雜的域模型緩存問題,這些在JiveJdon3中有些解決,當然還有待提高。
我一直認為:緩存屬于業務邏輯編寫,因為數據庫操作也屬于業務邏輯部分,為什么不把等同于數據庫的緩存也作為業務邏輯對待呢?正是緩存屬于業務邏輯組件,所以,處理緩存是不能完全使用框架替代的,除非使用EJB,但是使用EJB不了解其緩存機制,也會走上使用誤區,最后唾棄EJB,這是一些所謂高人經常范的毛病。
設計采用了MVC模式,具體調用的時候采用了命令模式
數據操作層Model中,例如;BlockDAO,TopicDAO,ResponseDAO,UserDAO等。
里面封裝了一個對象所有的數據操作
視圖/傳輸層 View 例如BlockDTO,TopicDTO等,主要是對象的屬性
jsp用它來顯示,dao用它作為DTO
最后就是控制層 Controll 控制層的類都繼承了Service接口
里面有一個方法
execute(ServletContext context, HttpServletRequest request,
HttpServletResponse response) {
}
,因為使用命令模式,后面會說明
例如 ManageBlock, ManageTopic等
主要是接收請求然后調用DAO,把結果返回給jsp
調用的時候,我采用的是命令模式
一個所有請求的總入口Servlet被影射到controll.do;他獲取Service的類名,然后
實例化這個類,調用對應的方法
例如 ../controll.do?Service=ManageBlock&action=save
String Name = request.getParameter("Service"); if (Name == null||Name.equals("")){ ErrorView error=new ErrorView("系統獲取Service錯誤。"); request.setAttribute("error",error); request.getRequestDispatcher(Constant.ErrorPage).forward(request,response); } String serviceName = "aill.bbs.controll." + Name; try { Class serviceClass = Class.forName(serviceName); Service service = (Service) serviceClass.newInstance(); boolean isSuc = service.execute(this.getServletContext(), request, response); }catch(Exception e){}
下面說說安全架構:
網站采用J2EE的身份認證系統,通過對不同路徑的權限限制來做到不用角色具有不同操作捐獻
例如:bbs/user/* 下主要是普通用戶的操作權限
想新建帖子的時候,請求地址是 bbs/user/insertTopic.jsp
bbs/blockAdmin/*主要是板塊管理員的權限
bbs/bbsAdmin/* 下是論壇管理員的權限
bbs/sysAdmin/* 下主要是系統管理員的權限
最后再說說緩存,
緩存的內容主要是數據源,所有板塊分類,所有板塊的信息[因為這些內容不多,而且使用
比較頻繁];還緩存了最新的N個帖子,和點擊率最高的N個帖子;
另外還緩存了N[差不多是每個板塊前5頁的]個帖子點擊數
因為緩存主要有兩類,一個是只讀,一種是讀寫。數據源就屬于只讀的,點擊數就屬于讀寫的
我設計了兩個緩存接口,一個CacheRObject,一個CacheRWObject
CacheRObject里有個init()和 get(key)方法,
init()當然是初始化或者更新緩存的時候用 get方法就是獲取被緩存的對象
CacheRWObject里有init(),save()和get(key)方法
這里多出來的save()就是把緩存里的內容更新到sql數據庫中
具體要緩存什么東西,只要寫一個類繼承CacheRObject,或者CacheRWObject
例如
publicclass BlockKindCache implements CacheRWObject{ HashMap cache=new HashMap(); int size;//還有其他一些屬性, init(){調用dao獲取初始化的內容} save(){//保存} get(key){//獲取} }
緩存的屬性設置都是些在cache.xml配置文件中,包括緩存大小,要更新那些緩存對象
更新的間隔等等
服務器啟動的時候,獲取這些設置,初始化緩存;
同時服務器關閉的時候把所有CacheRWObject類型緩存中的內容保存到數據庫
---其實做這個網站前我從來沒做過什么大的java項目,在jdon中也只是一個潛水者,通過這個網站真的學了很多東西,在這里要特別感謝bang大哥和其他各位jdon的兄弟,
說實在的這個網站還有很多自己不滿意的地方,希望大家一起交流一起進步
哦,網站地址:www.cityxiu.com 大家可以去看看
還有bang大哥,我把咱們jdon的logo放到我們論壇的下面了,算是做點貢獻吧
///老大回復
客氣。整體設計把握了良好架構和優異性能兩個點,作為經驗不多的初學者實屬難能可貴。
如果你希望在現在架構上有所提高,下面提供幾點建議:
1.表現層的controller是通過class.forName來加載業務Service的,一般業務Service都比較大,在并發很大情況下,new Service尚且覺得耗時,所以這里是否需要優化一下?使用資源池pool來預先生成這些大的Service。當然,小型的代碼少的service現在這樣就可以了。
2.安全架構使用了J2EE的容器驗證,但是ACL除了URL資源、還有組件方法的ACL,提供了組件方法的ACL,基本杜絕了安全漏洞,否則,多個Jsp調用同一個組件方法,不同級別權限設置的Jsp資源必然導致這個組件方法訪問權限的漏洞。
3.對你緩存分成讀和寫比較感興趣,特別是緩存寫專門做了一個接口,說明你充分認識到緩存重要性,緩存作為數據庫一種臨時替代,起到減少數據庫連接池的占用等,象這個帖子中詢問數據庫連接池設置問題,當我們覺得數據庫連接池設置再大都不能解決問題時,我們是需要象你這樣考慮緩存了,原帖:
http://www.jdon.com/jive/thread.jsp?forum=46&thread=27083
但是使用緩存寫需要考慮因素很多,比如兩個用戶同時寫,如何解決資源爭奪,如何解決死鎖等問題,這些都要求寫緩存質量相當高,所以一般在訪問大情況下發生這樣問題,我們還是依賴數據庫強大的ACID事務機制來解決沖突;或者使用支持事務的緩存如JBossTreeCache等。
一般應用下,讀緩存就可以了,關鍵要做好讀緩存的更新問題,特別是模型類的嵌套情況下,一個AModel嵌套BModel,那么如何保證AModel中的BModel就是讀緩存中的那個BModel,也就是兩者同一,這樣,萬一BModel更新時,只要更新緩存中BModel即可,否則就麻煩了,這些都是非常復雜的域模型緩存問題,這些在JiveJdon3中有些解決,當然還有待提高。
我一直認為:緩存屬于業務邏輯編寫,因為數據庫操作也屬于業務邏輯部分,為什么不把等同于數據庫的緩存也作為業務邏輯對待呢?正是緩存屬于業務邏輯組件,所以,處理緩存是不能完全使用框架替代的,除非使用EJB,但是使用EJB不了解其緩存機制,也會走上使用誤區,最后唾棄EJB,這是一些所謂高人經常范的毛病。