<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    積累,創(chuàng)造,分享!

    BlogJava 首頁 新隨筆 聯(lián)系 聚合 管理
      25 Posts :: 13 Stories :: 26 Comments :: 0 Trackbacks

    2005年9月16日 #

    問題現(xiàn)象:在做web應(yīng)用時會碰到這種情況,某些地方無法通過web當(dāng)中的ApplicationContext來獲得springIOC容器提供的bean,比如提供給外界的webservice接口,這個時候就需要手工通過ClassPathXmlApplicationContext等方式來獲取ApplicationContext,代碼如下:
    ApplicationContext context = new ClassPathXmlApplicationContext(
        "applicationContext-*.xml");
    IXXXService xxxservice = (IXXXService ) context
        .getBean("xxxservice ");
    這是一段很典型的加載。
    然而,正是這種看似到處都是的加載卻為后面的BUG埋下伏筆。
    xxxservice是具體的業(yè)務(wù)類,它向下與DAO依賴并控制著事務(wù),這里代表了一個經(jīng)典而且簡單的service,具體配置略去,值得一提的是scope,這里沒有指定,默認(rèn)的是單例。
    一切都是那么順利,像這樣的service代碼寫的應(yīng)該不下幾百個,可能諸位寫的更多,過程依然很陶醉,修改完畢。測試,再測試。什么?ORA-12519錯誤!見鬼,我打造的這套號稱簡易快速的SSH2框架已經(jīng)在多個項目好評無數(shù)久經(jīng)考驗了,寫了不下幾百次的service居然報ORA-12519錯誤。
    迅速打開PLSQL,檢查數(shù)據(jù)庫session,Select Count(1) From v$session t Where t.SCHEMANAME='XXX';
    隨著service的執(zhí)行,session數(shù)在增加,沒有減少的意思。是的,當(dāng)時就是這樣。

    解決思路:這種錯誤出現(xiàn)在久經(jīng)考驗的框架當(dāng)中,我心里是相當(dāng)不安的,居然會有這種低級趣味的錯誤。整理思路開始分析:這段代碼唯一與以前不同的地方就是,我們在web應(yīng)用中,是通過容器加載提供bean的,只有容器啟動的時候才會加載xml。那么重點(diǎn)就應(yīng)該是關(guān)注XML的加載方式了。
    在這里我們用的是ApplicationContext接口。注意看spring文檔3.5.1.2.2 在非web應(yīng)用中優(yōu)雅地關(guān)閉springioc容器。它這里用到的是AbstractApplicationContext,在取得bean后,再執(zhí)行一個context.registerShutdownHook();
    這里實(shí)驗一把,將ApplicationContext改成AbstractApplicationContext,執(zhí)行context.close()。結(jié)果出來了,session已被正常回收,真相漸漸浮出水面。


    結(jié)論:每次加載context的做法相當(dāng)于每次都生成了一次新的spring容器,在默認(rèn)單例的情況下,如果不及時關(guān)閉context。service所依賴的DAO當(dāng)中創(chuàng)建的dataSource也一直存在(包括所有的單例情況下所生成的類),從日志看,service事務(wù)管轄中的session確實(shí)已經(jīng)關(guān)閉,但SessionFactory還是存在的。只有在容器關(guān)閉的情況下,并指定了dataSource實(shí)例配置中的destroy-method="close",dataSource單例才會被釋放。
    spring文檔當(dāng)中對生命周期也描述的很清楚。通過DisposableBean或者指定destroy-method都能很好的釋放單例對象。而prototype類型的對象需要客戶端顯式的指定釋放,釋放對象完全是客戶端控制,spring不負(fù)責(zé)釋放。
    所以,要改善context的加載方式,盡量的少多次去加載,實(shí)在沒辦法的情況下,一定要記得關(guān)閉。
    最后,寫代碼的隨意性,圖省事,不經(jīng)思考,是造成這種BUG的罪惡根源。

    posted @ 2009-04-16 17:27 nighthawk 閱讀(2736) | 評論 (3)編輯 收藏

         摘要: 關(guān)注領(lǐng)域模型有一段時間了,不論是分析階段的還是設(shè)計階段的。
    其實(shí)領(lǐng)域模型的概念很早就有了,但是其概念非常容易被人混淆,首先我們要明確一下這個詞的語境:
    它在軟件開發(fā)的分析與設(shè)計的兩個階段分別代表不同的含義。
      閱讀全文
    posted @ 2008-03-23 00:01 nighthawk 閱讀(1654) | 評論 (0)編輯 收藏

    至于docbook的好處,我也不多說了,就跟吃菜一樣,嘗過了就知道到底有幾好
    趁目前有空,部門內(nèi)部準(zhǔn)備補(bǔ)充一下之前缺乏的技術(shù)文檔。利用這次機(jī)會,我再次收想到了docbook。
    記得第一次接觸docbook的時候,還是3年前的時候了,可惜那個時候沒有堅持使用下來。
    當(dāng)初拋棄它的原因是多方面的,缺乏恒心是一方面,配置煩瑣也是一方面,另外還有一個很重要的原因就

    是缺乏一個所見即所得的編輯器。而這次,這些煩惱徹底解決。XMLmind XML Editor!第一次發(fā)現(xiàn)它的時

    候有點(diǎn)相見恨晚的感覺,它讓我的文檔寫的如此輕松。
    不過有一點(diǎn)要注意,在官網(wǎng)下載的XMLmind XML Editor個人版是不支持直接將xml生成的html,pdf等格式

    的。還好,目前有xsltproc,fop,openjade這些工具支持,有了這些在windows下也可以轉(zhuǎn)換的工具,生

    成其他格式也不是什么難事。我目前就使用xsltproc來生成html。

    附上XMLmind XML Editor的下載地址http://www.xmlmind.com/xmleditor/persoedition.html
    附加上xsltproc的下載地址 http://www.zlatkovic.com/pub/libxml/
    再附上docbook的地址http://www.oasis-open.org/docbook/

    之前的麻煩統(tǒng)統(tǒng)消失,那么剩下的就是享受它的好處了。

    不用word,文檔也可以寫的這么漂亮。docbook,看第二眼發(fā)現(xiàn)你依然還是那么好。

    posted @ 2008-03-22 18:21 nighthawk 閱讀(376) | 評論 (0)編輯 收藏

    在目前使用的現(xiàn)有框架當(dāng)中,利用springAOP機(jī)制來控制事務(wù)處理是目前最流行的一種控制事務(wù)的方式。

    但是我們在某種使用場合的過程中,為什么有時事務(wù)處理老是不起作用呢?這里,為您道出原因之一,

    首先請看一段話

    Spring的事務(wù)實(shí)現(xiàn)采用基于AOP的攔截器來實(shí)現(xiàn),如果沒有在事務(wù)配置的時候注明回滾的checked exception,那么只有在發(fā)生了unchecked exception的時候,才會進(jìn)行事務(wù)回滾。

    有必要先解釋一下checked exceptionunchecked exception

    先看看EXCEPTIONJDK文檔當(dāng)中的結(jié)構(gòu)

    java.lang.Object
      繼承者 java.lang.Throwable
          繼承者 java.lang.Exception
              繼承者 java.lang.RuntimeException
     
    Unchecked exception: 這類異常都是RuntimeException的子類,雖然RuntimeException同樣也是Exception的子類,但是它們是特殊的。Exception是作為checked Exception 出現(xiàn)的。
    所以,除了ErrorRuntimeException,其他剩下的異常都是你需要關(guān)心的,而這些異常類統(tǒng)稱為Checked Exception
     

    有了以上的基礎(chǔ),看看我們框架當(dāng)中的事務(wù)屬性

    <property name="transactionAttributes">

                         <props>

                                <prop key="get*">PROPAGATION_REQUIRED,readOnly </prop>

                                <prop key="save*">PROPAGATION_REQUIRED </prop>

                                <prop key="delete*">PROPAGATION_REQUIRED</prop>

                                <prop key="update*">PROPAGATION_REQUIRED </prop>

                         </props>

     

    </property>

     

    此處,我們沒有指定任何異常,那么它目前默認(rèn)處理的就是unchecked exception了,再結(jié)合我們自身每個項目的模塊,在我們的每個項目當(dāng)中幾乎都定義了自己的異常,這些異常都是繼承自Exception,很不幸的是,我們繼承的Exception包括自己定義的異常,都是checked exception

     

    所以,在我們的事務(wù)處理機(jī)制當(dāng)中,事務(wù)不管用了。

    解決辦法有2個:

    1,在事務(wù)屬性后面加上需要回滾的checked exception。比如<prop key="save*">PROPAGATION_REQUIRED,-XXXXException</prop>(注意那個"-",對應(yīng)的是"+")

    2, 不改配置文件,將需要事務(wù)回滾的異常繼承自unchecked exception類,也就是RuntimeException

    (nighthawk)

    posted @ 2007-07-09 09:32 nighthawk 閱讀(2086) | 評論 (3)編輯 收藏

    現(xiàn)在再做2006年的總結(jié),似乎有點(diǎn)晚了,畢竟現(xiàn)在陽歷已經(jīng)是2007年2月份了,不過按照老家的傳統(tǒng),沒過春節(jié),那還算2006年。按照總結(jié)的慣例,應(yīng)該是先回顧后展望,所以我也先回顧。這個總結(jié),只談感受。
    06年3月份,開始維護(hù)部門的一個新的項目,換了個新的環(huán)境,不過對我而言,接觸的卻不是新的技術(shù)。也許現(xiàn)在已經(jīng)不是追新的階段了。
    做軟件的都有個習(xí)慣,愛接觸新的技術(shù),這幾年JAVA層出不窮的框架,技術(shù)太多了,讓人有點(diǎn)應(yīng)接不瑕。這些東西要是不接觸,有時候還真會被人笑話,毫不例外,我也不落俗套,其實(shí)我并不是一個對新鮮事物非常敏感的人,不過有些技術(shù),還是需要了解為好。
    06年,接觸的依然是struts,依然是hibernate,依然是spring。抽空看了看JSF,EJB3.0。spring和hibernate依然是那么輝煌,而struts,已經(jīng)開始沒落了。webwork2開始搶風(fēng)頭,包括現(xiàn)在的struts2,轉(zhuǎn)眼間,已經(jīng)不是我們熟悉的struts了,無非是包裝過后的webwork2,轉(zhuǎn)眼間,也感覺到了時間的流逝。通宵達(dá)旦培訓(xùn)學(xué)習(xí)struts的時候,已經(jīng)是3年前了。
    06年,接觸了領(lǐng)域驅(qū)動設(shè)計,讓我明白除了larman的領(lǐng)域模型,原來還有eric的領(lǐng)域模型,可惜目前,我依然是個學(xué)習(xí)者,而不是一個實(shí)踐者。
    06年上半年,我虔誠的捧來了martin的重構(gòu),可惜到目前為止,那本書還是新的。
    06年,也接觸了天書般的分析模式。它當(dāng)之無愧的當(dāng)選為我的最佳催眠書,以至于我現(xiàn)在不拿著它睡不著,因為它的確讓我沒看懂。
    06年,我依然在看2年前買的UML和模式應(yīng)用,依然偶爾翻翻1年前買的J2EE核心模式。不過這一年,J2EE核心模式似乎有點(diǎn)輝煌不在了。
    頭幾年,感覺一切都是新的,一切都要學(xué)。而這一年,感覺進(jìn)步遠(yuǎn)不如前2年了,也許進(jìn)步更快,我沒有發(fā)現(xiàn)而已。我一直在告戒自己,學(xué)習(xí)分析與設(shè)計不會有學(xué)習(xí)語言或者框架那種立竿見影的效果,它是一個積累,一個持續(xù)性的過程,我還在等著頓悟分析模式的那一天。
    07年,我依然會追隨大師們的腳步。
    07年,還要繼續(xù)做點(diǎn)什么。

    posted @ 2007-02-13 09:55 nighthawk 閱讀(261) | 評論 (2)編輯 收藏

    ????????? 本文將不涉及EJB3.0的設(shè)計以及編碼.
    ????????? 主要內(nèi)容是關(guān)于JBOSS下EJB3.0的第一個例子的配置與運(yùn)行。
    首先下載JBOSS4,并安裝成功。目前JBOSS提供的ejb3有2種版本,一種是Embeddable(可嵌入),一種是直接運(yùn)行。這些都可以在jboss的官方網(wǎng)站獲得。
    Embeddable版本的主要的好處是可以獨(dú)立運(yùn)行,方便測試,甚至無需部署在jboss環(huán)境當(dāng)中,當(dāng)然這是需要它提供的conf以及l(fā)ib包里面的幾個配置來支撐的。如果是在web應(yīng)用當(dāng)中運(yùn)行,還需要將jboss-EJB-3.0_Embeddable_ALPHA_8\conf 里面的配置文件引入到web-inf\classes下的。
    lib包里面的3個包也需要放在web-inf\lib下面。然后對web.xml進(jìn)行修改,加上:
    ?? <context-param>
    ????? <param-name>jboss-kernel-deployments</param-name>
    ????? <param-value>embedded-jboss-beans.xml, jboss-jms-beans.xml</param-value>
    ?? </context-param>
    ?? <listener>
    ????? <listener-class>org.jboss.ejb3.embedded.ServletBootstrapListener</listener-class>
    ?? </listener>
    否則會報關(guān)于jndi方面的錯誤。

    ??????????前面提到的另一個版本則是需要基于JBOSS環(huán)境的完全版。它的配置相對于Embeddable來說更簡單一些。?? 實(shí)際上針對這個版本的web應(yīng)用當(dāng)中調(diào)用EJB3 是無需任何額外配置的.
    然而在此之前我走了一段彎路:
    比如看到網(wǎng)上一些介紹性的文章當(dāng)中提到需要將{jboss_home}\client 當(dāng)中的一些包拷到web-inf\lib的下面,然后在初始化InitialContext時需要加上java.naming.factory.initial,java.naming.factory.url.pkgs等等的參數(shù)。這樣反而會拋出CommunicationException: Receive timed out異常。實(shí)際上JBOSS都已經(jīng)將初始化環(huán)境設(shè)置好了。
    以下實(shí)例是web環(huán)境下調(diào)用jboss 下ejb3的客戶端:
    http://www.myjavaserver.com/~nighthawk/EJBClient.war
    部署在jboss下的ejb3例子,以上2個客戶端都是調(diào)用的它:
    http://www.myjavaserver.com/~nighthawk/MyEJB.jar
    web環(huán)境下調(diào)用Embeddable ejb的客戶端的實(shí)例比較大,空間不夠,不往上放了。
    不過配置起來也很簡單,只需將Embeddable版本當(dāng)中的conf與lib包放在war包的classed與lib下即可。
    以上例子均在jboss-4.0.4.GA下測試過。
    ???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ??2006?nighthawk.All rights reserved

    posted @ 2006-07-28 16:21 nighthawk 閱讀(771) | 評論 (1)編輯 收藏

    研究spring不深,但最近在使用spring的過程中,發(fā)現(xiàn)它總能給人帶來點(diǎn)驚喜。
    相信大家在做程序的時候應(yīng)該會碰到時序調(diào)度一類的問題,即希望在指定時刻執(zhí)行某段程序,在spring之前我的第一反應(yīng)便是在數(shù)據(jù)庫中加job。然而現(xiàn)在,Spring提供了支持時序調(diào)度的整合類Quartz,它把復(fù)雜的事情完全簡單化了,在此我不想再贅敘關(guān)于spring中如何去整合Quartz,具體的spring詳細(xì)配置請參照http://www.jactiongroup.net/reference/html/scheduling.html。使用過程很簡單,
    關(guān)于Quartz的說明參照官網(wǎng)的一段描述
    What is Quartz?
    Quartz is a full-featured, open source job scheduling system that can be integrated with, or used along side virtually any J2EE or J2SE application - from the smallest stand-alone application to the largest e-commerce system. Quartz can be used to create simple or complex schedules for executing tens, hundreds, or even tens-of-thousands of jobs; jobs whose tasks are defined as standard Java components or EJBs. The Quartz Scheduler includes many enterprise-class features, such as JTA transactions and clustering.
    您也可以參考以下鏈接進(jìn)行更深入的了解http://www.opensymphony.com/quartz

    在使用的過程中,需要再對cronExpression的配置解釋一下,如果沒有使用過unix的cron,這里確實(shí)有點(diǎn)讓人迷惑,我便在這里迷惑了一把。
    Cron表達(dá)式是字符串,它由六個或七個子表達(dá)式組成,它描述了不同的調(diào)度細(xì)節(jié)。這些子表達(dá)式被白色表達(dá)式隔開,格式為* * * * * *
    以下的表格對表達(dá)式做出了解釋
    域          是否必須 允許的值       允許的字符
    Seconds      YES       0-59                   , - * /
    Minutes      YES       0-59                   , - * /
    Hours        YES       0-23                    , - * /
    Day of month YES       1-31              , - * ? / L W C
    Month        YES       1-12 or JAN-DEC, - * /
    Day of week  YES   1-7 or SUN-SAT , - * ? / L C #
    Year         NO         empty,1970-2099,   - * /

    比如:字符串“0 0 12 ? * WEB 意味著每周三上午12:00。
    特殊字符的一些說明:
    * 表示的是所有的值,比如在秒的位置上有* 則表示為每一秒種。所以,你在表示每5分鐘執(zhí)行一次的時候便不能寫成 * 0/5 * * * ? 而應(yīng)該是0 0/5 * * * ?
    ? 表示沒有指定特別的值,是允許為月的某一天或者周的某一天字段的。它被用來限定"沒有限定值"。這是有用的,當(dāng)你需要限定一些事情在一個或兩個字段中,但不是這里的。
    有一個特別需要主意的地方便是*與?的搭配使用。比如在Day of month與Day of week全是* ,那邊自相矛盾了。官網(wǎng)中給出的例子沒出現(xiàn)過這種情況。
    - 表示范圍,比如Hours域中10-12,則表示 "the hours 10, 11 and 12".
    ,表示指定特別的附加值,比如"MON,WED,FRI" 在 day of week 域表示"the days Monday, Wednesday, and Friday"
    / 表示指定的增長范圍。比如"0/15" 在秒的區(qū)域表示"0, 15, 30, and 45"秒。

    "L"字符是允許用來月某天和周某天字段。這個字符是一個"last"的縮寫,但是它有不同的意義在兩個字段的其中之一。例如,這個值"L"在月字段的某一天意味著" 這個月的最后一天",31或者28等等。

    posted @ 2006-02-28 12:57 nighthawk 閱讀(1071) | 評論 (0)編輯 收藏

    看Larman的UML和模式應(yīng)用,感覺渾身上下都是寶,一遍兩遍都不過癮。
    這幾天又在看GRASP(general responsibility assignment software patterns的縮寫),把該記的都記一下,加深印象,也與大家分享。網(wǎng)上這方面的資料并不多。
    五個基本模式:information expert,creator,High Conhersion,Low Coupling,Controller

    四個擴(kuò)展模式:Polymorphism,indirection,pure fabrication,protected variations

    不想一一詳敘,挑重點(diǎn)看。
    1,information expert:把職責(zé)分配給具有實(shí)現(xiàn)這個職責(zé)所需要信息的對象。它表述的是一種“直覺”。
    2,creator:顧名思義,誰應(yīng)該負(fù)責(zé)產(chǎn)生類的實(shí)例?類B聚合,包含,記錄,密切使用類A的數(shù)據(jù)。
    3,high conhersion與Low coupling:應(yīng)該是到了面向?qū)ο蟮母邔泳辰缌恕8唏詈希阂蕾囆赃^強(qiáng)。內(nèi)聚:功能性內(nèi)聚。降低一切不穩(wěn)定元素之間的耦合。
    4,controller:如果直接通過UI來訪問業(yè)務(wù)層,后果是不堪想像的。C/S模式的開發(fā)中它是用來接收事件的,它通常不實(shí)現(xiàn)職責(zé),只是委托給其他對象。在B/S中,我把它理解為serlvet。
    5,polymorphism:多態(tài)?這個詞很別扭,一句話解釋:多態(tài)是設(shè)計系統(tǒng)如何處理相似變化的基本方法。便于擴(kuò)展,可嵌入。比如以下代碼:

    abstract class Square
    {…
      
    abstract void landedOn();
    …}

    class RegularSquare extends Square
    {…
      
    void landedOn()
     
    { … } // implementation
    }

    class IncomeTaxSquare extends Square
    {…
      
    void landedOn()
     
    { … } // implementation
    }


    6,indirection與pure fabrication:目的無非是為了降低耦合。對象的設(shè)計分為兩類:表示分離與行為分解。indirection與pure fabrication都是行為分解的產(chǎn)物。比如說我們常見的DAO模式,我認(rèn)為就是很好的pure fabrication。
    7,protected variations:書中翻譯為受保護(hù)變化。叫做受保護(hù)的變化似乎更容易被理解。受保護(hù)的變化機(jī)制的具體體現(xiàn):多態(tài),接口,中介,數(shù)據(jù)封裝。與LSP(liskov替換原理)很相似。

    posted @ 2005-11-30 14:11 nighthawk 閱讀(732) | 評論 (0)編輯 收藏

    今天看struts源碼,發(fā)現(xiàn)了這么一個東西。在此是用來讀取struts的XML配置文件的。以前沒有大在意,現(xiàn)記下來,以備后用。
    Digester是Jakarta 子項目Commons下的一個模塊,是基于SAX接口的,它簡化了SAX方法的解析過程。用的時候集中精力處理XML數(shù)據(jù)而不是花太多的時間在如何解析文件本身上。
    以下是剛剛寫的一個小例子:
     1import org.apache.commons.digester.*;
     2import org.xml.sax.SAXException;
     3import java.io.*;
     4
     5public class DigesterSample {
     6  public DigesterSample() {
     7    Digester digester = new Digester();
     8    digester.push(this);
     9    digester.addCallMethod("rocket/member""print"2);
    10    digester.addCallParam("rocket/member/name"0);
    11    digester.addCallParam("rocket/member/age"1);
    12    try {
    13      digester.parse(getClass().getResourceAsStream("rocket.xml"));
    14    }

    15    catch (SAXException e) {
    16      e.printStackTrace();
    17    }

    18    catch (IOException ex) {
    19      ex.printStackTrace();
    20    }

    21
    22  }

    23
    24  public void print(String name, String age) {
    25    System.out.println("name : " + name + "  age : " + age);
    26  }

    27
    28  public static void main(String[] args) {
    29    DigesterSample dig = new DigesterSample();
    30  }

    31}
    相應(yīng)的rocked.xml文件如下:
    1<rocket>
    2<member>
    3<name>YaoMing</name>
    4<age>25</age>
    5</member>
    6</rocket>
    放在編譯后的class同等目錄下即可。

    相關(guān)資源 http://jakarta.apache.org/commons/digester/
    posted @ 2005-11-21 15:42 nighthawk 閱讀(349) | 評論 (0)編輯 收藏

    用同步器令牌來防止客戶端的重復(fù)提交,這的確是個好注意!
    特別是防止用戶在瀏覽器當(dāng)中點(diǎn)擊后退或者刷新按鈕所產(chǎn)生的不良影響。
    道理其實(shí)很簡單,大概流程為:輸入請求-->比較值-->處理請求-->生成令牌-->保存令牌-->
    準(zhǔn)備響應(yīng)-->外發(fā)響應(yīng)。
    在客戶請求當(dāng)中攜帶服務(wù)器前一次響應(yīng)時發(fā)給客戶端的令牌,去與服務(wù)器端保存的令牌相比較,如果相等,則說明當(dāng)前是合法提交。而不過不匹配,則可能是重復(fù)提交了。
    在具體的實(shí)現(xiàn)當(dāng)中以jsp為例,在控制器當(dāng)中采用servlet來負(fù)責(zé)管理令牌,將服務(wù)器端的令牌保存在session當(dāng)中,通過每次的請求來更新這個令牌。然后在將要處理的業(yè)務(wù)邏輯之前判斷提交上來的令牌是否合法。如果合法則繼續(xù)執(zhí)行,如果不合法,則避免執(zhí)行正常的操作。
    servlet當(dāng)中生成token代碼可如下:
    public void saveToken(HttpServletRequest request){
             HttpSession session
    =request.getSession();
             String token
    =generateToken(request);
             session.setAttribute(Constants.TOKEN,token);
    }
    檢查令牌合法性
    public boolean isTokenValid(HttpServletRequest request){
            HttpSession session
    =request.getSession();
            String saved
    =session.getAttribute(Constants.TOKEN);
            String token
    =request.getParameter(Constants.TOKEN);
    if(saved.equals(token)){
          
    return true;
    }

         
    return false;
    }


    在JSP端,通過助手類將當(dāng)前生成的令牌保存在HTML的表單的隱含域當(dāng)中。
    比如
    <input type="hidden" name="TOKEN" value="as8d7j3sk">

    通過這種手段實(shí)現(xiàn)起來并不十分復(fù)雜。當(dāng)然這只是防止用戶提交的手段之一。其他的方法有待大家不斷補(bǔ)充。
    來源參考:Core J2ee patterns 2 


    posted @ 2005-11-15 11:14 nighthawk 閱讀(964) | 評論 (0)編輯 收藏

    網(wǎng)上關(guān)于apache與tomcat整合的文章已經(jīng)舉不勝舉。寫下此文的目的只是為了整理一下剛剛配置成功后的思路。以免以后產(chǎn)生遺漏。經(jīng)過幾個小時的努力,終于能夠?qū)⒆约洪_發(fā)了幾天的網(wǎng)站發(fā)布在互聯(lián)網(wǎng)上了,這種感覺挺爽。
    廢話少說,先交代一下環(huán)境:
    首先,機(jī)器的是用ADSL撥號寬帶,沒有固定IP,這個好辦,先申請一個動態(tài)域名。網(wǎng)上這種資源還是比較多的,接著下載一個動態(tài)域名的客戶端,將域名填上,這樣每次撥號以后的動態(tài)IP便與當(dāng)前的域名綁定。可以在其他網(wǎng)絡(luò)上對本機(jī)利用申請的域名進(jìn)行ping命令,看看當(dāng)前域名是否有效。
    解決了域名的問題以后,接下來便是重頭戲。Apache與Tomcat的整合過程了。先準(zhǔn)備好資源,下載Http server Apache2.0版本,tomcat4.1。以及Tomcat Connector也就是
    mod_jk_apache_1.2.6_2.0.50.dll 。參考路徑http://www.apache.org/dist/tomcat/tomcat-connectors/jk/binaries/win32/jk-1.2.6/
    下載時一定要看清楚版本。在資源下載完畢后,便是開始安裝了。按照提示安裝完Apache2.0。在安裝過程中會提示輸入域名,輸入剛剛申請的域名。然后將mod_jk.dll文件拷入Apache2\modules目錄。接下來便是修改Apache2\conf下的httpd.conf文件了。
    conf配置文件每個設(shè)置之前都有E文注釋,目前還未來得急細(xì)看,有耐心的朋友可以仔細(xì)研究。我修改的地方只有如下幾個:
    1,ServerName XXX.XXX.XXX:80
    2,DocumentRoot "盤符:/應(yīng)用所在路徑"
    3,
    4,Alias /應(yīng)用所在文件夾/  "盤符:/應(yīng)用所在路徑"
        Options Indexes MultiViews
        AllowOverride None
        Order allow,deny
        Allow from all

    5,設(shè)置index首頁在index.html后面
    最后加上
    #connecting to tomcat using ajp13
        LoadModule jk_module modules/mod_jk.dll
        JkWorkersFile  "E:\JBuilderX\thirdparty\jakarta-tomcat-4.1.27-LE-jdk14\conf\workers.properties"
        JkMount /*.jsp ajp13
        JkMount /*.screen ajp13
        JkMount /*.do ajp13
    .jsp *.screen *.do表示的是web應(yīng)用中所支持的后綴名,LoadModule其實(shí)就是load Tomcat Connector。也就是mod_jk.dll。上面的JkWorkersFile后面跟的是tomcat路徑下conf文件夾新建的workers.properties
    內(nèi)容如下:
    workers.tomcat_home=E:\JBuilderX\thirdparty\jakarta-tomcat-4.1.27-LE-jdk14(我本機(jī)的tomcat路徑)
    workers.java_home=E:\JBuilderX\jdk1.4 (我本機(jī)的JDK)
    ps=\
    # worker.list=ajp13
    worker.list=ajp12,ajp13 

    worker.ajp12.port=8007
    worker.ajp12.host=localhost
    worker.ajp12.type=ajp12
    worker.ajp12.lbfactor=1
                
    worker.ajp13.port=8009        
    worker.ajp13.host=localhost     
    worker.ajp13.type=ajp13
    worker.ajp13.lbfactor=1

    worker.loadbalancer.type=lb
    ...................

    接下來改tomcat的conf文件夾下的server.xml,在此無須更多修改。只需指定應(yīng)用路徑即可。此前網(wǎng)上很多文檔所說的要打開Ajp13Connector處的注釋,但此處并沒有按此步驟做。好了,配置文件修改結(jié)束。

    開始實(shí)驗吧!在開始菜單處進(jìn)行先對apachetest configration。測試通過。啟動apache。再啟動tomcat。打開動態(tài)域名的客戶端。敲入申請的動態(tài)域名。本機(jī)可以訪問了。順便抓了MSN,QQ在線的好友,發(fā)給他們,集體測試了一把。得到的反饋居然是速度還可以!要知道我的是賽揚(yáng)700+256M內(nèi)存的古董機(jī)器。呵呵!不多說了,明天還得上班,趕緊睡了。

     

    posted @ 2005-11-08 23:46 nighthawk 閱讀(785) | 評論 (0)編輯 收藏

    這些日子已經(jīng)淹沒在模式,OO,UML等概念的海洋當(dāng)中了,看不到一點(diǎn)盡頭,甚至連座燈塔都沒有。
    網(wǎng)上的資料多半是參差不齊,總希望能找到降龍十八掌。
    重新裝上了rose2003,希望它能給我?guī)硪稽c(diǎn)光明。
    最近看的書以及研究的東西:core j2ee patterns,UML模式與應(yīng)用,sun的petstore表示層模式。
    也許我應(yīng)該拿本小說或散文來讀一讀了,自從接觸了計算機(jī)以后,基本上不讀這些東西了,都沒什么感覺了。
    posted @ 2005-10-26 15:40 nighthawk 閱讀(1290) | 評論 (6)編輯 收藏

    昨晚有幸進(jìn)入央視演播1號大廳欣賞了夢想中國9進(jìn)6的現(xiàn)場直播,的確精彩,比看電視感覺好多了。只是持續(xù)時間太長,從7點(diǎn)多一直到11點(diǎn)。搞得今天上班還困困的,好了,閑話少說。

    我們在用JNDI來獲取數(shù)據(jù)源已經(jīng)不是什么新鮮事了,EJB當(dāng)中的更是少不了這個東西。在看petstore時由JNDINames這個類還發(fā)現(xiàn)了原來JNDI所指的資源工廠不僅僅局限于以上這兩種類型,我們自己定義的一些工廠類其實(shí)也可以指定,其實(shí)這也是不難想到的,但在實(shí)踐過程中卻還從未考慮到過。過程也不復(fù)雜。就拿petstore為例,只需在web-inf當(dāng)中加入:

    1<env-entry>
    2    <description>This Entry Provides the name for the CatalogDAO Implementation Class so the Fast Lane Pattern may be used</description>
    3    <env-entry-name>param/CatalogDAOClass</env-entry-name>
    4    <env-entry-type>java.lang.String</env-entry-type>
    5    <env-entry-value>com.sun.j2ee.blueprints.catalog.dao.GenericCatalogDAO</env-entry-value>
    6</env-entry>
    7


    然后在CatalogDAOFactory類當(dāng)中輕松幾句。

    InitialContext ic = new InitialContext();

    String className 
    = (String) ic.lookup(JNDINames.CATALOG_DAO_CLASS);

    catDao 
    = (CatalogDAO) Class.forName(className).newInstance();


    便獲得了工廠類的具體實(shí)例GenericCatalogDAO。這樣豈不也來得痛快!

    posted @ 2005-10-09 10:46 nighthawk 閱讀(845) | 評論 (2)編輯 收藏

    又是一年一度的國慶節(jié),不多說什么了。祝所有人國慶節(jié)快樂!
    posted @ 2005-09-30 13:21 nighthawk 閱讀(161) | 評論 (0)編輯 收藏

    上周末終于買下了Core J2EE Patterns的中文版,畢竟看e文版還是不怎么流暢。這兩天有空看了看表現(xiàn)層的模式,有很多東西都似曾相見。它的一些應(yīng)用在許多成熟的框架里面都得到了體現(xiàn)。比如Struts,在看到applicationcontroller的時候感覺真的非常棒,因為我的思路得到了它的驗證,struts已經(jīng)作為它的示例在說明。再比如說WAF框架,再打開PETSTORE的源碼與書中提到的模式一對比,感覺真的很爽。雖然目前研究的還不夠深入。但已經(jīng)看到了前面的一點(diǎn)點(diǎn)光明。繼續(xù)努力中......
    posted @ 2005-09-28 17:45 nighthawk 閱讀(465) | 評論 (0)編輯 收藏

    主站蜘蛛池模板: 国产成人综合亚洲一区| 四虎影视永久免费观看地址| 亚洲av无码一区二区三区四区 | 亚洲AV无码一区二区三区鸳鸯影院| 亚洲国产精品成人精品软件| 亚洲视频一区二区三区| 911精品国产亚洲日本美国韩国| 亚洲av日韩av无码黑人| 亚洲AV日韩精品久久久久久久| 亚洲视频在线观看一区| 久久精品国产亚洲av水果派| 亚洲视频在线观看不卡| 亚洲精品视频观看| 亚洲AV成人噜噜无码网站| 亚洲综合偷自成人网第页色| 色偷偷女男人的天堂亚洲网| 亚洲中文无码永久免| 亚洲av乱码一区二区三区按摩| 国产亚洲蜜芽精品久久| 一边摸一边桶一边脱免费视频 | 亚洲伊人久久大香线焦| 亚洲综合精品成人| 久久久久久久久无码精品亚洲日韩| 麻豆69堂免费视频| 999zyz**站免费毛片| 99在线免费观看视频| 在线观看视频免费完整版| 天天干在线免费视频| 亚洲AV中文无码乱人伦| 国产亚洲精品影视在线产品| 亚洲a在线视频视频| 亚洲婷婷天堂在线综合| 色九月亚洲综合网| 国产色无码精品视频免费| 无码国产精品一区二区免费vr | 又黄又大的激情视频在线观看免费视频社区在线 | 深夜a级毛片免费视频| 成人无码精品1区2区3区免费看| 亚洲精品免费视频| 在线免费观看色片| 中文字幕亚洲无线码|