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

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

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

    qiyadeng

    專注于Java示例及教程
    posts - 84, comments - 152, trackbacks - 0, articles - 34

    EJB入門(mén)--First EJB

    Posted on 2006-02-04 20:17 qiyadeng 閱讀(743) 評(píng)論(0)  編輯  收藏
     該文章在<<EJB編程指南>>的實(shí)例的基礎(chǔ)上建立的,主要是給新手一個(gè)比較直觀的例子和作為自己的日志,并不打算介紹EJB的原理性的東西。另外,由于本人水平有限,請(qǐng)不吝賜教。
        筆者使用的IDE為:Eclipse3.0+MyEclipse4.01GA
        J2EE容器為:JBoss4.0
       
        本文描述一個(gè)幫助存款和取款的無(wú)狀態(tài)會(huì)話Bean的完整開(kāi)發(fā)及部署的過(guò)程。步驟如下:
    1、編寫(xiě)無(wú)狀態(tài)會(huì)話Bean的實(shí)現(xiàn)類。
    2、編寫(xiě)無(wú)狀態(tài)會(huì)話Bean的主接口和組件接口。
    3、將Bean匯編成應(yīng)用程序,編寫(xiě)部署描述項(xiàng)。
    4、在EJB服務(wù)器上部署應(yīng)用程序。
    5、用Java應(yīng)用程序進(jìn)行測(cè)試。
    上面是主要的過(guò)程,有些步驟可以不用手工完成,通過(guò)IDE可以簡(jiǎn)化開(kāi)發(fā)過(guò)程,如果你對(duì)IDE的該功能不太清楚可以參考產(chǎn)品文檔(http: //myeclipseide.com/enterpriseworkbench/help/index.jsp?topic=/com.genuitec.myeclipse.doc/html/quickstarts/firstejb/index.html)。

    一、新建一個(gè)EJB Project,工程名字為FundEJB,其他默認(rèn)就好。
    二、創(chuàng)建Session Bean:
        1、在src目錄下新建包:qiya.deng.fund.ejb,請(qǐng)注意包名最后一定要以ejb為后綴,因?yàn)楹竺嫖覀冃枰褂玫腦Doclet工具。
        2、新建SessionBean class,命名為StatelessFundManagerEJB,要需要以EJB為后綴,原因同上,而且根據(jù)規(guī)范最好是以EJB或是Bean為后綴。
       

        3、配置XDoclet :
        右擊項(xiàng)目選擇Properties,選擇MyEclipse-XDoclet,點(diǎn)擊Add Stander...,選擇Standard EJB。
       
        選中Standard EJB,在ejbxdoclet上點(diǎn)擊右鍵添加Add,在其中選擇jboss,因?yàn)樵摾又惺褂胘boss作為應(yīng)用服務(wù)器。選中jboss,修改下列屬性
        Version = 4.0
        destDir = src/META-INF
       修改完畢,點(diǎn)擊OK按鈕回到主窗口。

        4、運(yùn)行Xdoclet:
        右擊項(xiàng)目選擇MyEclipse->run Xdoclet。運(yùn)行是console窗口會(huì)產(chǎn)生提示信息,運(yùn)行完畢可以看到目錄結(jié)構(gòu)發(fā)生變化。
       
        5、編輯實(shí)現(xiàn)類StatelessFundManagerEJB:
        在編輯StatelessFundManagerEJB類之前選觀察下StatelessFundManager接口,一定可以發(fā)現(xiàn)這個(gè)遠(yuǎn)程組件接口的接口方法和StatelessFundManager的方法是有對(duì)應(yīng)關(guān)系的。
        在StatelessFundManager.java文件最后添加:

            /**
         *
         * @param balance
         * @param amount
         * @return
         *
         * @ejb.interface-method
         */
        public double addFunds(double balance,double amount){
            balance += amount;
            return balance;
        }
       
        /**
         *
         * @param balance
         * @param amount
         * @return
         * @throws InsufficientBalanceException
         *
         * @ejb.interface-method
         */
        public double withdrawFunds(double balance,double amount)throws InsufficientBalanceException {
            if (balance < amount) {
                throw (new InsufficientBalanceException());
            }
            balance -= amount;
            return balance;
        }
        重復(fù)第4步運(yùn)行Xdoclet,之后觀察StatelessFundManager接口。

       6、部署該應(yīng)用到EJB服務(wù)器:
        部署描述項(xiàng)在IDE自動(dòng)生成了,該文件的位置在/META-INF/ejb-jar.xml。打開(kāi)ejb-jar.xml,jboss.xml文件描述進(jìn)行查看。
        利用MyEclipse提供的部署工具進(jìn)行部署:
       
        然后運(yùn)行JBoss容器,可以看到有如下信息提示:

       

        關(guān)于MyEclipse中Application Server的使用請(qǐng)查看文檔(http://www.myeclipseide.com/images/tutorials/quickstarts/appservers/)。
        到現(xiàn)在為止,你已經(jīng)發(fā)布了一個(gè)簡(jiǎn)單的無(wú)狀態(tài)的會(huì)話Bean。下面寫(xiě)個(gè)簡(jiǎn)單的應(yīng)用程序進(jìn)行測(cè)試.
       
    三、編寫(xiě)進(jìn)行測(cè)試的Java客戶端程序。
        客戶端程序可以是Web程序也可以是Application應(yīng)用程序。這里以Application應(yīng)用程序?yàn)槔?BR>    同樣使用Eclipse,新建Java Project,這里命名為FundClient。右擊該項(xiàng)目選擇properties->Java Build path,在Projects中加入上面的Project:FundEJB。在Libraries中點(diǎn)擊Add External JARs...,把$JBoss_Home/client的目錄下的所有jar文件添加到Libraries中。
        最后,就是編寫(xiě)客戶端代碼:

    package qiya.deng.client;
        //import省去
    public class StatelessFundManagerTestClient extends JFrame implements
            ActionListener {

        double balance = 0;
        JTextField amount = new JTextField(10);
        JButton addFunds = new JButton("Add Funds");
        JButton withdrawFunds = new JButton("Withdraw Funds");
        String msg = "Current account balance";
        String strBal = "0";
        JLabel status;
        StatelessFundManager manager;
        NumberFormat currencyFormatter;
       
        public StatelessFundManagerTestClient(){
            super("Fund Manager");
        }
       
        public static void main(String[] args){
            new StatelessFundManagerTestClient().init();
        }
       
        private void init() {
           
            buildGUI();
           
            addWindowListener(new WindowAdapter(){
                public void windowClosing(WindowEvent event){
                    System.exit(0);
                }
            });
           
            addFunds.addActionListener(this);
            withdrawFunds.addActionListener(this);
           
            createFundManager();
           
            currencyFormatter = NumberFormat.getCurrencyInstance();
            String currencyOut = currencyFormatter.format(0);
            status.setText(msg + currencyOut);
           
            pack();
            show();
        }

        private void buildGUI() {
            GridBagLayout gl = new GridBagLayout();
            GridBagConstraints gc = new GridBagConstraints();
            Container container = getContentPane();
            container.setLayout(gl);
           
            gc.fill = GridBagConstraints.BOTH;
            JLabel label = new JLabel("Enter Amount");
            gl.setConstraints(label,gc);
            container.add(label);
           
            gc.gridwidth = GridBagConstraints.REMAINDER;
            gl.setConstraints(amount,gc);
            container.add(amount);
           
            gl.setConstraints(addFunds,gc);
            container.add(addFunds);
            gl.setConstraints(withdrawFunds,gc);
            container.add(withdrawFunds);
           
            status = new JLabel(msg);
            gl.setConstraints(status,gc);
            container.add(status);
        }

        public void createFundManager(){
            try {
                Properties prop = new Properties();
                prop.put(Context.INITIAL_CONTEXT_FACTORY,"org.jnp.interfaces.NamingContextFactory");
                prop.put(Context.PROVIDER_URL,"localhost:1099");
                Context initial = new InitialContext(prop);
                Object objref = initial.lookup("ejb/StatelessFundManager");//JINI-Name
                StatelessFundManagerHome home =
                    (StatelessFundManagerHome) PortableRemoteObject.narrow(objref,StatelessFundManagerHome.class);
                manager = home.create();
            } catch (ClassCastException e) {
                e.printStackTrace();
            } catch (RemoteException e) {
                e.printStackTrace();
            } catch (NamingException e) {
                e.printStackTrace();
            } catch (CreateException e) {
                e.printStackTrace();
            }
        }

        public void actionPerformed(ActionEvent e) {
           
           
           
            if (e.getActionCommand().equalsIgnoreCase("Withdraw Funds")) {
                System.out.println("Withdraw Funds");
            }
            if (e.getActionCommand().equalsIgnoreCase("Add Funds")) {
                System.out.println("Add Funds");
            }
           
            if (e.getSource().equals(addFunds)){
                System.out.println("addFunds");
                try {
                    status.setText(msg + currencyFormatter.format(manager.addFunds(0,Double.parseDouble(amount.getText()))));
                } catch (NumberFormatException e1) {
                    e1.printStackTrace();
                } catch (RemoteException e1) {
                    e1.printStackTrace();
                }
            }
            if (e.getSource().equals(withdrawFunds)){
                System.out.println("withdrawFund");
                try {
                    status.setText(msg + currencyFormatter.format(manager.withdrawFunds(100,Double.parseDouble(amount.getText()))));
                } catch (NumberFormatException e1) {
                    e1.printStackTrace();
                } catch (RemoteException e1) {
                    e1.printStackTrace();
                } catch (InsufficientBalanceException e1) {
                    e1.printStackTrace();
                }
            }
        }

    }
        然后,你可以運(yùn)行該程序進(jìn)行測(cè)試了:
         
        至此,恭喜你,你已經(jīng)大功告成,基本上對(duì)EJB建立了感性的認(rèn)識(shí),可以參考資料進(jìn)行深入的學(xué)習(xí)了。

    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 国产精品入口麻豆免费观看| 国产美女精品视频免费观看| 国产成人无码精品久久久免费| 亚洲人成影院在线无码观看| 免费黄网站在线观看| 亚洲AV成人无码天堂| 免费jjzz在在线播放国产| 全黄大全大色全免费大片| 亚洲AV网站在线观看| 伊人免费在线观看| 亚洲日本久久一区二区va| 亚洲黄黄黄网站在线观看| 春暖花开亚洲性无区一区二区| 老司机在线免费视频| 日本一区二区三区在线视频观看免费| 国产亚洲一区二区精品| 免费网站观看WWW在线观看| 亚洲宅男天堂a在线| 成年人网站免费视频| 九一在线完整视频免费观看| 亚洲精品亚洲人成在线观看麻豆 | 亚洲国产模特在线播放| 亚洲高清免费视频| 国产免费的野战视频| 黄 色一级 成 人网站免费| 77777亚洲午夜久久多喷| 亚洲午夜久久久影院伊人| 成年女性特黄午夜视频免费看| 日本免费A级毛一片| 久久精品国产亚洲av瑜伽| 亚洲色图古典武侠| 久久亚洲色一区二区三区| 成年女人午夜毛片免费看| 无码A级毛片免费视频内谢| 另类小说亚洲色图| 亚洲日本成本人观看| 18gay台湾男同亚洲男同| 日本亚洲国产一区二区三区 | 亚洲va无码专区国产乱码| 免费日本黄色网址| 巨胸喷奶水视频www网免费|