隨筆 - 11, 文章 - 1, 評論 - 20, 引用 - 0
          數(shù)據(jù)加載中……

          2006年4月20日

          小經(jīng)驗兩則

          1.Oracle 8i 下使用最新的oracle thin driver時用DatabaseMetaData獲取主鍵等信息時,需要將
          connection.getMetaData().getPrimaryKeys(connection.getCatalog(),null,tableName);
          中的tableName轉(zhuǎn)為大寫,否則無法得到數(shù)據(jù)。

          2.正則表達(dá)式中,需要以","分割字符串,但是要分割的字串中含有","號,為了避免沖突,引入前置轉(zhuǎn)義字符"\",這樣的正則怎么寫呢?
          例如:
          String txt = "STATE_COUNTY=kj\\\\,,ADDR_LINE1=l=j,ADDR_LINE2=mj\n\n,ADDR_LINE3=n\\,o,\n\nADDR_LINE4=\np";
          需要把鍵值對切分出來:
          ?Pattern.compile("[^\\\\],)");
          這個是不行的,會將","號前一個字符消耗掉。

          ?Pattern.compile("(?![\\\\]),)");
          也不行
          Pattern?p?=?Pattern.compile,",(?![\\\\])");
          倒是可以,但是把轉(zhuǎn)義字符放后面似乎有點詭異。
          找了一個折衷辦法,不切割使用正則獲取"鍵=值"子串:
          Pattern?p?=?Pattern.compile("\\w+\\s*=.*?[,]*.*?(?=,|$)",Pattern.DOTALL);
          但是還是帶來了子串中不能含有"="的問題。
          最后查了一個JDK1.4 DOC,發(fā)現(xiàn)了一個反向的非匹配串寫法:
          Pattern?p?=?Pattern.compile("(?<!\\\\),\\s*");
          這樣一來就解決了以上問題。

          posted @ 2006-08-03 09:54 wolfsquare 閱讀(563) | 評論 (0)編輯 收藏

          回復(fù) 亂彈權(quán)限系統(tǒng)續(xù)一

          亂彈權(quán)限系統(tǒng)續(xù)一
          原文在這:http://www.aygfsteel.com/RongHao/archive/2006/07/03/56258.html

          仔細(xì)分析一,二,三,四權(quán)限背后的實質(zhì)可以發(fā)現(xiàn):
          一系統(tǒng)權(quán)限的概念有一些冗余,很難想象這樣一種情況:你已經(jīng)有了子系統(tǒng)下的很多權(quán)限,結(jié)果因為沒有模塊權(quán)限而使得無法使用該模塊進(jìn)行任何操作,分配權(quán)限的人要非常小心才行.這個世界已經(jīng)夠復(fù)雜了,不要再給開發(fā),部署人員增加復(fù)雜度了.很明白的,這個權(quán)限是不需要資源的權(quán)限
          二數(shù)據(jù)庫操作權(quán)限的概念,有一點疑惑,不知道為什么要建立這樣的一個概念,和行級權(quán)限有什么區(qū)別呢? 從你的上下文理解來看,似乎是這樣子的:有操作X表的業(yè)務(wù),如果用戶有增加權(quán)限,則可以任意增加數(shù)據(jù),如果用戶有編輯權(quán)限,則可以編輯任意數(shù)據(jù).實際上對應(yīng)標(biāo)準(zhǔn)權(quán)限模型為:不需要限定資源的操作,即不需要資源標(biāo)識的權(quán)限.
          三行級數(shù)據(jù)權(quán)限,這個概念很直白,對應(yīng)標(biāo)準(zhǔn)權(quán)限模型就是: 資源(行數(shù)據(jù))+操作
          四列級數(shù)據(jù)權(quán)限,由于不是針對某特定行數(shù)據(jù),所以它也是無資源型權(quán)限
          就這樣,所有的權(quán)限最終可劃為需要資源標(biāo)識和不需要資源標(biāo)識,換句話說,所有權(quán)限可劃分為控制某些集合的權(quán)限和控制單體的權(quán)限兩種,在某些時候,也稱之為 功能權(quán)限和數(shù)據(jù)權(quán)限


          談到把權(quán)限分給別人,很自然的就是如何控制權(quán)限的權(quán)限的問題了,很拗口,是吧?仔細(xì)想想,這樣很直觀,也沒有什么后遺癥,權(quán)限自遞歸控制和自解釋,真是一個完美的循環(huán).
          有愛思考的同學(xué)想深了,會覺得非常麻煩,難實現(xiàn).當(dāng)然,概念上一回事,具體實現(xiàn)上可以是另一回事,可以做很多的變通來達(dá)到目的.只要保持概念上的簡單性,就足以使得非常多的人得以解脫了。

          另外,作為架構(gòu)設(shè)計者,非常非常不贊成動輒就把很底層的概念扯進(jìn)高層設(shè)計中(例如行級,數(shù)據(jù)庫什么的),很容易把自己和別人搞胡涂。
          可以最近狀態(tài)不好,要不好好blog一篇,8過,有句話怎么說來著:“都素那浮云而已。。。”

          posted @ 2006-07-04 22:45 wolfsquare 閱讀(1948) | 評論 (1)編輯 收藏

          不完美的世界-看到了IOC工具的又一個發(fā)展方向

               摘要: 在本篇文章中,作者在一個系統(tǒng)的構(gòu)建中深度地被各種配置邏輯所困擾,由此發(fā)現(xiàn)了IOC工具(如Spring,Nuts等)的又一個發(fā)展方向。  閱讀全文

          posted @ 2006-06-08 00:30 wolfsquare 閱讀(1951) | 評論 (7)編輯 收藏

          結(jié)合WebWork實現(xiàn)高復(fù)用度系統(tǒng)的探索(上)

          需求: 某機(jī)構(gòu)體系下,機(jī)構(gòu)類型分為子公司,部門,人員等,以后可能在某機(jī)構(gòu)或者其子孫機(jī)構(gòu)下可能會再分出其他子機(jī)構(gòu)類型,希望在增加新類型過程中,盡可能的避免修改已有代碼。

          情況:子公司,部分,人員等已完成所有編碼(界面,商業(yè)邏輯,數(shù)據(jù)邏輯)
          變化:需要把這個機(jī)構(gòu)體系組成為一顆樹狀結(jié)構(gòu)
          策略:鑒于除了樹結(jié)構(gòu)外的其他部分代碼已經(jīng)完成,那么應(yīng)該首先保持這些代碼不予改動。復(fù)用修改的優(yōu)先級從高到低的順序如下:
          ? 界面×JSP,Action層
          ? 商業(yè)邏輯 Service層
          ? 數(shù)據(jù)邏輯層
          ? 數(shù)據(jù)物理層
          有經(jīng)驗的人知道,大部分情況下,越是下層的改動,越是影響越廣泛(注意不是修改難度),所以我們只有在無計可施的情況下,才進(jìn)行低層的修改。

          分析: 回到我們的需求,從功能上看,維護(hù)一個組織機(jī)構(gòu)的需求,已經(jīng)涵蓋了每一個子結(jié)構(gòu)的維護(hù)需求,以部門的建立為例,在新建一個部門時,同時也必須建立機(jī)構(gòu)樹上的節(jié)點,
          ?這樣,如果需要直接使用原有的創(chuàng)建部門的所有代碼,需要在其上加上創(chuàng)建組織機(jī)構(gòu)所需要的父節(jié)點,以及當(dāng)前節(jié)點名稱信息(在這里department的增加界 面JSP是需要修改的,不過實際上我沒有修改該文件,而是利用DHTML來動態(tài)加入需要新增加的信息),然后提交給原創(chuàng)建部門的URI (departmentSave.action)和組織機(jī)構(gòu)創(chuàng)建URI(orgCreate.action),在這里我們利用ww提供的action chain功能來完成這兩個操作。
          ?這里需要修改department.action的配置,攔截save方法使其執(zhí)行完后跳過原來的relist結(jié)果頁面轉(zhuǎn)向組織結(jié)構(gòu)的創(chuàng)建orgCreate.action:
          ?<action name="unitSave" class="com.wolfsquare.ibase.org.action.UnitAction" method="save">
          ?? <result name="input">/org/unit/input.jsp</result>
          ?? <result name="relist" type="chain">
          ?????? <param name="actionName">orgCreate</param>
          ??????????????? <param name="namespace">/org</param>??
          ??????????? </result>
          ?? <result name="xxx" type="redirect">/org/unit.action?start=${start}</result>
          ?? <interceptor-ref name="validationStack"/>
          ? </action>
          可能有同學(xué)看到這里會問:創(chuàng)建組織節(jié)點時應(yīng)該還需要關(guān)聯(lián)前面創(chuàng)建的部門對象啊,這個操作是如何實現(xiàn)的?信息是如何傳遞的?
          在這里,由于整個架構(gòu)體系并沒有支持這種信息傳遞的功能,所以只好以一種比較”臟“的方式實現(xiàn):
          ??????? 在department.action類里增加了一個方法getModel()返回剛剛創(chuàng)建的部門對象,然后在org.action類中增加一個接收的方法setModel(object o)這樣在整action chain執(zhí)行的時候,ww會自動將getModel后的數(shù)據(jù)填入setModel中,這樣做的后果是以后增加新的機(jī)構(gòu)類型的功能時,action必須也照這樣的語意設(shè)置getModel方法。(如果要解決這個問題,這能需要使用一個特定的Context,然后攔截指定Service的創(chuàng)建方法,把創(chuàng)建結(jié)果放入Context,不過這又帶來如何清除Context的問題,于是又要求助與ww的interspector,專門寫一個攔截器來擦屁股,夠麻煩。。。)

          ??????? 就這樣,我們完成了新增,修改組織機(jī)構(gòu)的功能合成,雖然有點拖沓,但是還是達(dá)到了復(fù)用,少修改原有代碼,而且擴(kuò)展性也很好的目標(biāo)。這上篇說的是兩個簡單業(yè)務(wù)的功能揉合問題,下篇我們來看看稍微復(fù)雜點的情況,看看還能不能繼續(xù)依葫蘆畫瓢來完成功能合的成
          ??
          (未完待續(xù))??

          posted @ 2006-05-17 23:40 wolfsquare 閱讀(1231) | 評論 (0)編輯 收藏

          log4j配置簡要說明

          雖然以前一直在用log4j,但是對其配置不甚了了,突然間因為需解決某些問題,要理解log4j的配置,
          然而用google搜了一下,卻發(fā)現(xiàn)網(wǎng)上沒有一個簡單直觀的說明,于是只好看log4j的官方介紹,終于
          理解了log4j的配置用法,以下是我對log4j配置的一點認(rèn)識,如有謬誤還請不吝賜教.

          首先我們搞清楚log4j能干什么,簡單來說就是提供一個記錄不同級別信息內(nèi)容的日志工具,
          可以把不同級別,不同包路徑的信息,以指定格式輸出到多種設(shè)備(控制臺,文件等)
          在程序中,可以以以下方式來使用
          ?? Log log = org.apache.commons.logging.LogFactory.LogFactory.getLog(yourClassName.class);
          ??log.debug("debug message -------------------");
          ??log.info("info message ******************");
          ??log.warn("warn message +++++++++++++++");
          ??log.error("error msg=================");
          ??
          本文主要講的是如何配置log4j,先讓我們先看看一個典型的log4j配置:??

          ==========log4j.properties==================

          log4j.appender.stdout=org.apache.log4j.ConsoleAppender
          log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
          log4j.appender.stdout.layout.ConversionPattern=%d{MM-dd HH\:mm\:ss.SSS} %-5p [%F\:%L]%x %m%n

          log4j.appender.fileout=org.apache.log4j.RollingFileAppender
          log4j.appender.fileout.File=D:/workspace/log4jtest/log/application.log
          log4j.appender.fileout.MaxFileSize=10000KB
          log4j.appender.fileout.MaxBackupIndex=10
          log4j.appender.fileout.layout=org.apache.log4j.PatternLayout
          log4j.appender.fileout.layout.ConversionPattern=%d{MM-dd HH:mm:ss.SSS}[%24F:%-3L:%-5p]%x %m%n

          log4j.rootCategory=INFO, stdout, fileout
          log4j.logger.com.wolfsquare.log2=DEBUG,stdout
          ===================================

          這個文件可以劃為三小塊

          ===========第一塊定義了一個名為 stdout 的appender和layout (appender,layout的概念后面再解釋,目前先記著有這樣兩個名詞):

          log4j.appender.stdout=org.apache.log4j.ConsoleAppender
          定義stdout的實際輸出實現(xiàn)類,從這個appender實現(xiàn)類名可以猜到,這個類是負(fù)責(zé)控制臺輸出的。
          log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
          定義stdout的輸出裝飾器
          log4j.appender.stdout.layout.ConversionPattern=%d{MM-dd HH\:mm\:ss.SSS} %-5p [%F\:%L]%x %m%n
          裝飾器參數(shù)配置


          ============第二塊定義了一個名為 fileout 的appender和layout:
          log4j.appender.fileout=org.apache.log4j.RollingFileAppender
          同理可猜這個實現(xiàn)類是輸出到文件的
          log4j.appender.fileout.File=D:/workspace/log4jtest/log/application.log
          log4j.appender.fileout.MaxFileSize=10000KB
          log4j.appender.fileout.MaxBackupIndex=10
          log4j.appender.fileout.layout=org.apache.log4j.PatternLayout
          log4j.appender.fileout.layout.ConversionPattern=%d{MM-dd HH:mm:ss.SSS}[%24F:%-3L:%-5p]%x %m%n

          ============第三塊定義了名字分別為rootCategory,log4j.logger.com.wolfsquare.log2的兩個logger
          log4j.rootCategory=INFO, stdout, fileout
          log4j.logger.com.wolfsquare.log2=DEBUG,stdout

          rootCategory logger是缺省的logger,記錄所有的包的信息輸出。
          第二個logger是只輸出指定包com.wolfsquare.log2下的日志信息。
          那么INFO,DEBUG又是什么意思呢,他們是信息的分級標(biāo)識,通過繼承實現(xiàn)這個實現(xiàn)自定義級別的分級。
          第三塊配置兩句的意思是這樣的:
          rootCategory 把所有類的INFO級別以上的信息輸出到stdout和fileout兩個appender中,
          logger.com.wolfsquare.log2,把com.wolfsquare.log2包中的所有類(包括子包)DEBUG級別(含)以上的信息輸出到stdout 中
          一個logger可以輸出到很多個設(shè)備中(appender),如果需要增加輸出設(shè)備則用分號分隔開appender名稱即可。

          輸出信息的分類級別是DEBUG > INFO > WARN > ERROR,信息細(xì)節(jié)由細(xì)到粗,指定輸出某一級別的信息時,
          過細(xì)的信息輸出將會被忽略

          如果一個配置中有多個logger,他們之間會有什么關(guān)系呢?答案是,在輸出上,他們沒有任何關(guān)系,都是獨立運作的,
          不相關(guān)的,但是在配置上,父包的配置會傳給子包,如果子包沒有另外定義配置的話。
          例如上面配置文件中的兩個logger:
          log4j.logger.com.wolfsquare
          log4j.logger.com.wolfsquare.log2

          這里認(rèn)為 log4j.logger.com.wolfsquare.log2 繼承自 log4j.logger.com.wolfsquare,他們的配置聲明如下:
          log4j.rootCategory=INFO, stdout, fileout
          log4j.logger.com.wolfsquare.log2=,stdout
          注意第二句沒有指定輸出級別,那么根據(jù)配置繼承規(guī)則會繼承父logger的配置,在這里就是INFO。

          同時需要強調(diào)的是,如果兩個logger有繼承關(guān)系,且輸出到同一個appender,根據(jù)輸出獨立原則,那么將會出現(xiàn)兩行一樣的信息,
          例如上面的兩個logger定義會導(dǎo)致這樣的情況。
          最后以一幅圖來概括:

          posted @ 2006-04-20 23:21 wolfsquare 閱讀(988) | 評論 (0)編輯 收藏

          主站蜘蛛池模板: 兴宁市| 兴山县| 明溪县| 屏山县| 宁强县| 嘉兴市| 临泽县| 环江| 土默特右旗| 科技| 象山县| 南丰县| 六枝特区| 宜良县| 永昌县| 安龙县| 新化县| 鲁山县| 利津县| 贡山| 峨眉山市| 德保县| 和林格尔县| 社会| 信宜市| 吉林省| 定安县| 西丰县| 潼南县| 花莲县| 靖宇县| 成武县| 永胜县| 万全县| 荥阳市| 龙川县| 钦州市| 宜兰市| 木兰县| 阿荣旗| 阿鲁科尔沁旗|