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

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

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

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

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

    #

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

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

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

    研究spring不深,但最近在使用spring的過(guò)程中,發(fā)現(xiàn)它總能給人帶來(lái)點(diǎn)驚喜。
    相信大家在做程序的時(shí)候應(yīng)該會(huì)碰到時(shí)序調(diào)度一類的問(wèn)題,即希望在指定時(shí)刻執(zhí)行某段程序,在spring之前我的第一反應(yīng)便是在數(shù)據(jù)庫(kù)中加job。然而現(xiàn)在,Spring提供了支持時(shí)序調(diào)度的整合類Quartz,它把復(fù)雜的事情完全簡(jiǎn)單化了,在此我不想再贅敘關(guān)于spring中如何去整合Quartz,具體的spring詳細(xì)配置請(qǐng)參照http://www.jactiongroup.net/reference/html/scheduling.html。使用過(guò)程很簡(jiǎn)單,
    關(guān)于Quartz的說(shuō)明參照官網(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

    在使用的過(guò)程中,需要再對(duì)cronExpression的配置解釋一下,如果沒有使用過(guò)unix的cron,這里確實(shí)有點(diǎn)讓人迷惑,我便在這里迷惑了一把。
    Cron表達(dá)式是字符串,它由六個(gè)或七個(gè)子表達(dá)式組成,它描述了不同的調(diào)度細(xì)節(jié)。這些子表達(dá)式被白色表達(dá)式隔開,格式為* * * * * *
    以下的表格對(duì)表達(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。
    特殊字符的一些說(shuō)明:
    * 表示的是所有的值,比如在秒的位置上有* 則表示為每一秒種。所以,你在表示每5分鐘執(zhí)行一次的時(shí)候便不能寫成 * 0/5 * * * ? 而應(yīng)該是0 0/5 * * * ?
    ? 表示沒有指定特別的值,是允許為月的某一天或者周的某一天字段的。它被用來(lái)限定"沒有限定值"。這是有用的,當(dāng)你需要限定一些事情在一個(gè)或兩個(gè)字段中,但不是這里的。
    有一個(gè)特別需要主意的地方便是*與?的搭配使用。比如在Day of month與Day of week全是* ,那邊自相矛盾了。官網(wǎng)中給出的例子沒出現(xiàn)過(guò)這種情況。
    - 表示范圍,比如Hours域中10-12,則表示 "the hours 10, 11 and 12".
    ,表示指定特別的附加值,比如"MON,WED,FRI" 在 day of week 域表示"the days Monday, Wednesday, and Friday"
    / 表示指定的增長(zhǎng)范圍。比如"0/15" 在秒的區(qū)域表示"0, 15, 30, and 45"秒。

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

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

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

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

    不想一一詳敘,挑重點(diǎn)看。
    1,information expert:把職責(zé)分配給具有實(shí)現(xiàn)這個(gè)職責(zé)所需要信息的對(duì)象。它表述的是一種“直覺”。
    2,creator:顧名思義,誰(shuí)應(yīng)該負(fù)責(zé)產(chǎn)生類的實(shí)例?類B聚合,包含,記錄,密切使用類A的數(shù)據(jù)。
    3,high conhersion與Low coupling:應(yīng)該是到了面向?qū)ο蟮母邔泳辰缌恕8唏詈希阂蕾囆赃^(guò)強(qiáng)。內(nèi)聚:功能性內(nèi)聚。降低一切不穩(wěn)定元素之間的耦合。
    4,controller:如果直接通過(guò)UI來(lái)訪問(wèn)業(yè)務(wù)層,后果是不堪想像的。C/S模式的開發(fā)中它是用來(lái)接收事件的,它通常不實(shí)現(xiàn)職責(zé),只是委托給其他對(duì)象。在B/S中,我把它理解為serlvet。
    5,polymorphism:多態(tài)?這個(gè)詞很別扭,一句話解釋:多態(tài)是設(shè)計(jì)系統(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:目的無(wú)非是為了降低耦合。對(duì)象的設(shè)計(jì)分為兩類:表示分離與行為分解。indirection與pure fabrication都是行為分解的產(chǎn)物。比如說(shuō)我們常見的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 閱讀(737) | 評(píng)論 (0)編輯 收藏

    今天看struts源碼,發(fā)現(xiàn)了這么一個(gè)東西。在此是用來(lái)讀取struts的XML配置文件的。以前沒有大在意,現(xiàn)記下來(lái),以備后用。
    Digester是Jakarta 子項(xiàng)目Commons下的一個(gè)模塊,是基于SAX接口的,它簡(jiǎn)化了SAX方法的解析過(guò)程。用的時(shí)候集中精力處理XML數(shù)據(jù)而不是花太多的時(shí)間在如何解析文件本身上。
    以下是剛剛寫的一個(gè)小例子:
     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 閱讀(351) | 評(píng)論 (0)編輯 收藏

    用同步器令牌來(lái)防止客戶端的重復(fù)提交,這的確是個(gè)好注意!
    特別是防止用戶在瀏覽器當(dāng)中點(diǎn)擊后退或者刷新按鈕所產(chǎn)生的不良影響。
    道理其實(shí)很簡(jiǎn)單,大概流程為:輸入請(qǐng)求-->比較值-->處理請(qǐng)求-->生成令牌-->保存令牌-->
    準(zhǔn)備響應(yīng)-->外發(fā)響應(yīng)。
    在客戶請(qǐng)求當(dāng)中攜帶服務(wù)器前一次響應(yīng)時(shí)發(fā)給客戶端的令牌,去與服務(wù)器端保存的令牌相比較,如果相等,則說(shuō)明當(dāng)前是合法提交。而不過(guò)不匹配,則可能是重復(fù)提交了。
    在具體的實(shí)現(xiàn)當(dāng)中以jsp為例,在控制器當(dāng)中采用servlet來(lái)負(fù)責(zé)管理令牌,將服務(wù)器端的令牌保存在session當(dāng)中,通過(guò)每次的請(qǐng)求來(lái)更新這個(gè)令牌。然后在將要處理的業(yè)務(wù)邏輯之前判斷提交上來(lái)的令牌是否合法。如果合法則繼續(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端,通過(guò)助手類將當(dāng)前生成的令牌保存在HTML的表單的隱含域當(dāng)中。
    比如
    <input type="hidden" name="TOKEN" value="as8d7j3sk">

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


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

    僅列出標(biāo)題
    共5頁(yè): 上一頁(yè) 1 2 3 4 5 下一頁(yè) 
    主站蜘蛛池模板: 无码精品国产一区二区三区免费| 亚洲私人无码综合久久网| 另类图片亚洲校园小说区| 无码国产精品一区二区免费式影视| 免费人成年激情视频在线观看| 亚洲第一男人天堂| 国产麻豆视频免费观看| 亚洲春色另类小说| 又黄又爽又成人免费视频| 亚洲精品电影在线| 在线永久免费的视频草莓| 亚洲高清日韩精品第一区| 免费视频爱爱太爽了| 亚洲欧洲在线播放| 国产精品成人免费视频网站京东| 亚洲人成电影在线观看网| 中文字幕第13亚洲另类| 黄页网址大全免费观看12网站| 免费永久在线观看黄网站| 一级成人生活片免费看| 国产专区一va亚洲v天堂| 中文字幕免费视频精品一| 国产精品亚洲A∨天堂不卡| 99在线观看精品免费99| 亚洲成人免费电影| 免费无码黄网站在线观看| 亚洲国产成人精品女人久久久 | 久久久久亚洲精品无码系列| 亚洲熟妇成人精品一区| 国产免费资源高清小视频在线观看| 色屁屁在线观看视频免费| 亚洲人成网站在线观看播放| 久久综合给合久久国产免费| wwwxxx亚洲| 亚洲午夜无码片在线观看影院猛| 最近2019中文免费字幕在线观看| 亚洲欧洲视频在线观看| 国产精品国产免费无码专区不卡| 好吊色永久免费视频大全| 亚洲精品国产免费| 国产一区二区视频免费|