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

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

          #

          ????????? 本文將不涉及EJB3.0的設(shè)計以及編碼.
          ????????? 主要內(nèi)容是關(guān)于JBOSS下EJB3.0的第一個例子的配置與運行。
          首先下載JBOSS4,并安裝成功。目前JBOSS提供的ejb3有2種版本,一種是Embeddable(可嵌入),一種是直接運行。這些都可以在jboss的官方網(wǎng)站獲得。
          Embeddable版本的主要的好處是可以獨立運行,方便測試,甚至無需部署在jboss環(huán)境當(dāng)中,當(dāng)然這是需要它提供的conf以及l(fā)ib包里面的幾個配置來支撐的。如果是在web應(yīng)用當(dāng)中運行,還需要將jboss-EJB-3.0_Embeddable_ALPHA_8\conf 里面的配置文件引入到web-inf\classes下的。
          lib包里面的3個包也需要放在web-inf\lib下面。然后對web.xml進行修改,加上:
          ?? <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來說更簡單一些。?? 實際上針對這個版本的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異常。實際上JBOSS都已經(jīng)將初始化環(huán)境設(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的客戶端的實例比較大,空間不夠,不往上放了。
          不過配置起來也很簡單,只需將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 閱讀(772) | 評論 (1)編輯 收藏

          研究spring不深,但最近在使用spring的過程中,發(fā)現(xiàn)它總能給人帶來點驚喜。
          相信大家在做程序的時候應(yīng)該會碰到時序調(diào)度一類的問題,即希望在指定時刻執(zhí)行某段程序,在spring之前我的第一反應(yīng)便是在數(shù)據(jù)庫中加job。然而現(xiàn)在,Spring提供了支持時序調(diào)度的整合類Quartz,它把復(fù)雜的事情完全簡單化了,在此我不想再贅敘關(guān)于spring中如何去整合Quartz,具體的spring詳細配置請參照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.
          您也可以參考以下鏈接進行更深入的了解http://www.opensymphony.com/quartz

          在使用的過程中,需要再對cronExpression的配置解釋一下,如果沒有使用過unix的cron,這里確實有點讓人迷惑,我便在這里迷惑了一把。
          Cron表達式是字符串,它由六個或七個子表達式組成,它描述了不同的調(diào)度細節(jié)。這些子表達式被白色表達式隔開,格式為* * * * * *
          以下的表格對表達式做出了解釋
          域          是否必須 允許的值       允許的字符
          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 閱讀(1072) | 評論 (0)編輯 收藏

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

          四個擴展模式:Polymorphism,indirection,pure fabrication,protected variations

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

          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:書中翻譯為受保護變化。叫做受保護的變化似乎更容易被理解。受保護的變化機制的具體體現(xiàn):多態(tài),接口,中介,數(shù)據(jù)封裝。與LSP(liskov替換原理)很相似。

          posted @ 2005-11-30 14:11 nighthawk 閱讀(733) | 評論 (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)中點擊后退或者刷新按鈕所產(chǎn)生的不良影響。
          道理其實很簡單,大概流程為:輸入請求-->比較值-->處理請求-->生成令牌-->保存令牌-->
          準(zhǔn)備響應(yīng)-->外發(fā)響應(yīng)。
          在客戶請求當(dāng)中攜帶服務(wù)器前一次響應(yīng)時發(fā)給客戶端的令牌,去與服務(wù)器端保存的令牌相比較,如果相等,則說明當(dāng)前是合法提交。而不過不匹配,則可能是重復(fù)提交了。
          在具體的實現(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">

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


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

          僅列出標(biāo)題
          共5頁: 上一頁 1 2 3 4 5 下一頁 
          主站蜘蛛池模板: 太康县| 突泉县| 韶山市| 正阳县| 灌南县| 蓝山县| 崇州市| 清涧县| 隆子县| 三河市| 山西省| 连云港市| 北票市| 平陆县| 工布江达县| 阳山县| 磐安县| 和政县| 阳西县| 阿荣旗| 湘乡市| 麻栗坡县| 桃源县| 连南| 磐石市| 遂宁市| 科技| 建昌县| 新津县| 吐鲁番市| 安庆市| 永仁县| 苗栗县| 时尚| 通辽市| 河西区| 平乡县| 齐齐哈尔市| 岳阳县| 南昌市| 永和县|