posts - 0, comments - 77, trackbacks - 0, articles - 356
            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          J2EE網(wǎng)站經(jīng)驗(yàn)共享

          Posted on 2007-03-12 11:35 semovy 閱讀(176) 評(píng)論(0)  編輯  收藏 所屬分類: J2EE綜合
          網(wǎng)站包括 商家博客,個(gè)人博客,論壇,新聞等

          設(shè)計(jì)采用了MVC模式,具體調(diào)用的時(shí)候采用了命令模式
          數(shù)據(jù)操作層Model中,例如;BlockDAO,TopicDAO,ResponseDAO,UserDAO等。
          里面封裝了一個(gè)對(duì)象所有的數(shù)據(jù)操作

          視圖/傳輸層 View 例如BlockDTO,TopicDTO等,主要是對(duì)象的屬性
          jsp用它來(lái)顯示,dao用它作為DTO


          最后就是控制層 Controll 控制層的類都繼承了Service接口
          里面有一個(gè)方法
          execute(ServletContext context, HttpServletRequest request,
          HttpServletResponse response) {
          }
          ,因?yàn)槭褂妹钅J?,后面?huì)說(shuō)明
          例如 ManageBlock, ManageTopic等
          主要是接收請(qǐng)求然后調(diào)用DAO,把結(jié)果返回給jsp


          調(diào)用的時(shí)候,我采用的是命令模式
          一個(gè)所有請(qǐng)求的總?cè)肟赟ervlet被影射到controll.do;他獲取Service的類名,然后
          實(shí)例化這個(gè)類,調(diào)用對(duì)應(yīng)的方法
          例如 ../controll.do?Service=ManageBlock&action=save

          String Name = request.getParameter("Service");
            if (Name == null||Name.equals("")){
              ErrorView error=new ErrorView("系統(tǒng)獲取Service錯(cuò)誤。");
              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){}
          


          下面說(shuō)說(shuō)安全架構(gòu):
          網(wǎng)站采用J2EE的身份認(rèn)證系統(tǒng),通過(guò)對(duì)不同路徑的權(quán)限限制來(lái)做到不用角色具有不同操作捐獻(xiàn)
          例如:bbs/user/* 下主要是普通用戶的操作權(quán)限
          想新建帖子的時(shí)候,請(qǐng)求地址是 bbs/user/insertTopic.jsp

          bbs/blockAdmin/*主要是板塊管理員的權(quán)限
          bbs/bbsAdmin/* 下是論壇管理員的權(quán)限
          bbs/sysAdmin/* 下主要是系統(tǒng)管理員的權(quán)限

          最后再說(shuō)說(shuō)緩存,
          緩存的內(nèi)容主要是數(shù)據(jù)源,所有板塊分類,所有板塊的信息[因?yàn)檫@些內(nèi)容不多,而且使用
          比較頻繁];還緩存了最新的N個(gè)帖子,和點(diǎn)擊率最高的N個(gè)帖子;
          另外還緩存了N[差不多是每個(gè)板塊前5頁(yè)的]個(gè)帖子點(diǎn)擊數(shù)

          因?yàn)榫彺嬷饕袃深悾粋€(gè)是只讀,一種是讀寫。數(shù)據(jù)源就屬于只讀的,點(diǎn)擊數(shù)就屬于讀寫的

          我設(shè)計(jì)了兩個(gè)緩存接口,一個(gè)CacheRObject,一個(gè)CacheRWObject
          CacheRObject里有個(gè)init()和 get(key)方法,
          init()當(dāng)然是初始化或者更新緩存的時(shí)候用 get方法就是獲取被緩存的對(duì)象
          CacheRWObject里有init(),save()和get(key)方法
          這里多出來(lái)的save()就是把緩存里的內(nèi)容更新到sql數(shù)據(jù)庫(kù)中

          具體要緩存什么東西,只要寫一個(gè)類繼承CacheRObject,或者CacheRWObject

          例如
          publicclass BlockKindCache implements CacheRWObject{
                  HashMap cache=new HashMap();
                  int size;//還有其他一些屬性,
                  init(){調(diào)用dao獲取初始化的內(nèi)容}
                  save(){//保存}
                  get(key){//獲取}
                 }
          

          緩存的屬性設(shè)置都是些在cache.xml配置文件中,包括緩存大小,要更新那些緩存對(duì)象
          更新的間隔等等
          服務(wù)器啟動(dòng)的時(shí)候,獲取這些設(shè)置,初始化緩存;
          同時(shí)服務(wù)器關(guān)閉的時(shí)候把所有CacheRWObject類型緩存中的內(nèi)容保存到數(shù)據(jù)庫(kù)

          ---其實(shí)做這個(gè)網(wǎng)站前我從來(lái)沒(méi)做過(guò)什么大的java項(xiàng)目,在jdon中也只是一個(gè)潛水者,通過(guò)這個(gè)網(wǎng)站真的學(xué)了很多東西,在這里要特別感謝bang大哥和其他各位jdon的兄弟,

          說(shuō)實(shí)在的這個(gè)網(wǎng)站還有很多自己不滿意的地方,希望大家一起交流一起進(jìn)步

          哦,網(wǎng)站地址:www.cityxiu.com 大家可以去看看

          還有bang大哥,我把咱們jdon的logo放到我們論壇的下面了,算是做點(diǎn)貢獻(xiàn)吧





          ///老大回復(fù)

          客氣。整體設(shè)計(jì)把握了良好架構(gòu)和優(yōu)異性能兩個(gè)點(diǎn),作為經(jīng)驗(yàn)不多的初學(xué)者實(shí)屬難能可貴。

          如果你希望在現(xiàn)在架構(gòu)上有所提高,下面提供幾點(diǎn)建議:

          1.表現(xiàn)層的controller是通過(guò)class.forName來(lái)加載業(yè)務(wù)Service的,一般業(yè)務(wù)Service都比較大,在并發(fā)很大情況下,new Service尚且覺(jué)得耗時(shí),所以這里是否需要優(yōu)化一下?使用資源池pool來(lái)預(yù)先生成這些大的Service。當(dāng)然,小型的代碼少的service現(xiàn)在這樣就可以了。

          2.安全架構(gòu)使用了J2EE的容器驗(yàn)證,但是ACL除了URL資源、還有組件方法的ACL,提供了組件方法的ACL,基本杜絕了安全漏洞,否則,多個(gè)Jsp調(diào)用同一個(gè)組件方法,不同級(jí)別權(quán)限設(shè)置的Jsp資源必然導(dǎo)致這個(gè)組件方法訪問(wèn)權(quán)限的漏洞。


          3.對(duì)你緩存分成讀和寫比較感興趣,特別是緩存寫專門做了一個(gè)接口,說(shuō)明你充分認(rèn)識(shí)到緩存重要性,緩存作為數(shù)據(jù)庫(kù)一種臨時(shí)替代,起到減少數(shù)據(jù)庫(kù)連接池的占用等,象這個(gè)帖子中詢問(wèn)數(shù)據(jù)庫(kù)連接池設(shè)置問(wèn)題,當(dāng)我們覺(jué)得數(shù)據(jù)庫(kù)連接池設(shè)置再大都不能解決問(wèn)題時(shí),我們是需要象你這樣考慮緩存了,原帖:
          http://www.jdon.com/jive/thread.jsp?forum=46&thread=27083

          但是使用緩存寫需要考慮因素很多,比如兩個(gè)用戶同時(shí)寫,如何解決資源爭(zhēng)奪,如何解決死鎖等問(wèn)題,這些都要求寫緩存質(zhì)量相當(dāng)高,所以一般在訪問(wèn)大情況下發(fā)生這樣問(wèn)題,我們還是依賴數(shù)據(jù)庫(kù)強(qiáng)大的ACID事務(wù)機(jī)制來(lái)解決沖突;或者使用支持事務(wù)的緩存如JBossTreeCache等。

          一般應(yīng)用下,讀緩存就可以了,關(guān)鍵要做好讀緩存的更新問(wèn)題,特別是模型類的嵌套情況下,一個(gè)AModel嵌套BModel,那么如何保證AModel中的BModel就是讀緩存中的那個(gè)BModel,也就是兩者同一,這樣,萬(wàn)一BModel更新時(shí),只要更新緩存中BModel即可,否則就麻煩了,這些都是非常復(fù)雜的域模型緩存問(wèn)題,這些在JiveJdon3中有些解決,當(dāng)然還有待提高。

          我一直認(rèn)為:緩存屬于業(yè)務(wù)邏輯編寫,因?yàn)閿?shù)據(jù)庫(kù)操作也屬于業(yè)務(wù)邏輯部分,為什么不把等同于數(shù)據(jù)庫(kù)的緩存也作為業(yè)務(wù)邏輯對(duì)待呢?正是緩存屬于業(yè)務(wù)邏輯組件,所以,處理緩存是不能完全使用框架替代的,除非使用EJB,但是使用EJB不了解其緩存機(jī)制,也會(huì)走上使用誤區(qū),最后唾棄EJB,這是一些所謂高人經(jīng)常范的毛病。
          主站蜘蛛池模板: 田东县| 新干县| 库伦旗| 绥阳县| 辉县市| 鄂托克旗| 石棉县| 岳普湖县| 丰城市| 桃源县| 景东| 固原市| 韶山市| 汨罗市| 定远县| 容城县| 乌恰县| 北流市| 江北区| 连平县| 汤原县| 温泉县| 诸城市| 武安市| 正宁县| 铅山县| 佛坪县| 阜宁县| 蓬安县| 贡山| 东阿县| 恭城| 十堰市| 阿拉善左旗| 临潭县| 阿坝| 巴里| 九龙城区| 黑河市| 鄂托克前旗| 淮阳县|