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

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

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

    posts - 4,  comments - 9,  trackbacks - 0
    ??????? 在你學到了如何開發(fā)藕合松散的服務組件后,為了存取那些服務對象,你需要通過服務器的JNDI 來查找存根對象(session bean)或消息隊列(MDB)。JNDI查找是把客戶端與實際的服務端實現(xiàn)解藕的關鍵步驟。但是,直接使用一個字符串來進行JNDI查找并不優(yōu)雅。有這樣幾個原因:
    ·客戶端與服務端必須有一致的基于字符串的名字。它沒有在編譯時得到認證或在布署時得到檢查。
    ·從JNDI返回的服務對象的類型沒有在編譯時進行檢查,有可能在運行時出現(xiàn)轉(zhuǎn)換(casting)錯誤。
    ·冗長的查找代碼,有著自己的try-catch代碼塊,在應用之間是重復的和雜亂的
    ?????????EJB 3.0,對任何POJO,提供了一個簡單的和優(yōu)雅的方法來解藕服務對象和資源。使用@EJB注釋,你可以將EJB存根對象注入到任何EJB 3.0容器管理的POJO 中。如果注釋用在一個屬性變量上,容器將會在它被第一次訪問之前賦值給它。在Jboss下一版本中@EJB注釋從javax.annotation包移到了javax.ejb 。
    下面的例子演示了怎樣把HelloWorldBean無狀態(tài)session bean的存根注入到InjectionBean類中。
    InjectionBean.java
    //author:lihuoming
    package com.foshanshop.ejb3.impl;
    import com.foshanshop.ejb3.HelloWorld;
    import com.foshanshop.ejb3.Injection;
    import javax.annotation.EJB;
    import javax.ejb.Remote;
    import javax.ejb.Stateless;
    @Stateless
    @Remote ({Injection.class})
    public class InjectionBean implements Injection {
    @EJB (beanName="HelloWorldBean")
    HelloWorld helloworld;

    public String SayHello() {
    return helloworld.SayHello("注入者");
    }
    }
    @EJB注釋的beanName屬性指定EJB的類名(不帶包名),他的另一個屬性mappedName指定Bean實例的JNDI名。
    下面的片斷演示了如何使用beanName 或mappedName屬性查找HelloWorldBean 會話bean
    public class InjectionBean implements Injection {
    @EJB (beanName="HelloWorldBean")
    //@EJB (mappedName="HelloWorldBean/remote")
    HelloWorld helloworld;
    …..
    @EJB注釋如果被用在JavaBean風格的setter 方法上時,容器會在屬性第一次使用之前,自動地用正確的參數(shù)調(diào)
    用bean的setter 方法。下面的片斷演示了這是如何做的
    public class InjectionBean implements Injection {
    HelloWorld helloworld;
    @EJB (beanName="HelloWorldBean")
    public void setHelloworld(HelloWorld helloworld) {
    this.helloworld = helloworld;
    }
    …..
    下面是InjectionBean的Remote業(yè)務接口
    Injection.java
    //author:lihuoming
    package com.foshanshop.ejb3;
    public interface Injection {
    public String SayHello();
    }
    下面是Session Bean的JSP 客戶端代碼:
    InjectionTest.jsp
    <%@ page contentType="text/html; charset=GBK"%>
    <%@ page import="com.foshanshop.ejb3.Injection, javax.naming.*, java.util.Properties"%>
    <%
    Properties props = new Properties();
    props.setProperty("java.naming.factory.initial",
    "org.jnp.interfaces.NamingContextFactory");
    props.setProperty("java.naming.provider.url", "localhost:1099");
    props.setProperty("java.naming.factory.url.pkgs", "org.jboss.naming");
    InitialContext ctx;
    try {
    ctx = new InitialContext(props);
    Injection injection = (Injection) ctx.lookup("InjectionBean/remote");
    out.println(injection.SayHello());
    } catch (NamingException e) {
    out.println(e.getMessage());
    }
    %>
    @EJB注釋只能注入EJB存根對象,除@EJB注釋之外,EJB 3.0也支持@Resource注釋來注入來自JNDI的任何
    資源。下面的例子中演示了如何注入數(shù)據(jù)源。"java:/DefaultMySqlDS"是數(shù)據(jù)源DefaultMySqlDS的全局JNDI名。
    有關數(shù)據(jù)源的配置請參考后面章節(jié)“JBoss數(shù)據(jù)源的配置”
    //author:lihuoming
    package com.foshanshop.ejb3.impl;
    import java.sql.Connection;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    import com.foshanshop.ejb3.HelloWorld;
    import com.foshanshop.ejb3.Injection;
    import javax.annotation.EJB;
    import javax.annotation.Resource;
    import javax.ejb.Remote;
    import javax.ejb.Stateless;
    import javax.sql.DataSource;
    @Stateless
    @Remote ({Injection.class})
    public class InjectionBean implements Injection {
    @EJB (beanName="HelloWorldBean")
    HelloWorld helloworld;
    @Resource (mappedName="java:/DefaultMySqlDS")
    DataSource myDb;
    public String SayHello() {
    String str = "";
    try {
    Connection conn = myDb.getConnection();
    Statement stmt = conn.createStatement();
    ResultSet rs = stmt.executeQuery("SELECT studentName FROM student");
    if (rs.next()) {
    str = rs.getString(1);
    }
    rs.close();
    stmt.close();
    } catch (SQLException e) {
    e.printStackTrace();
    }
    return helloworld.SayHello(str);
    }
    }
    ????????????如果JNDI對象在本地(java:comp/env)JNDI目錄中,你只需給定他的映謝名稱即可,不需要帶前綴,如下面例子注入一個消息connection factory和一個messaging queue
    @Resource (mappedName="ConnectionFactory")
    QueueConnectionFactory factory;
    @Resource (mappedName="queue/A")
    Queue queue;
    對于"well-known"對象,@Resource注釋可以不指定JNDI名就能注入他們,他通過變量的類型就能獲得他的JNDI名。下面是一些例子。
    @Resource
    TimerService tms;
    @Resource
    SessionContext ctx;
    和@EJB注釋相同, @Resource注釋也可以被用在JavaBean風格的setter 方法上。
    本例子的EJB源代碼在DependencyInjection文件夾(源代碼:http://www.foshanshop.net/),項目中使用到的類庫在上級目錄lib 文件夾下。要恢復DependencyInjection項目的開發(fā)環(huán)境請參考第三章”如何恢復本書配套例子的開發(fā)環(huán)境”,要發(fā)布本例子EJB,你可以執(zhí)行Ant 的deploy任務。發(fā)布前確保HelloWorld.jar 已經(jīng)發(fā)布到Jboss中。
    posted on 2006-11-01 00:37 凌宇 閱讀(1194) 評論(0)  編輯  收藏

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


    網(wǎng)站導航:
     
    <2025年7月>
    293012345
    6789101112
    13141516171819
    20212223242526
    272829303112
    3456789

    常用鏈接

    留言簿(3)

    隨筆檔案(3)

    文章檔案(14)

    相冊

    收藏夾

    Java

    最新隨筆

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: a色毛片免费视频| 夜夜嘿视频免费看| 99免费视频观看| 免费的一级片网站| 亚洲AV无码第一区二区三区| 亚洲综合久久一本伊伊区| av电影在线免费看| 国产1024精品视频专区免费| 免费一级国产生活片| 亚洲第一页在线播放| 一级成人生活片免费看| 久热中文字幕在线精品免费| 国产av无码专区亚洲av果冻传媒| 亚洲国产视频久久| 久久久高清日本道免费观看| 91免费在线播放| 亚洲国产成人久久精品app| 中文字幕无码免费久久9一区9 | 久久久久亚洲AV无码专区桃色| 亚洲日产2021三区| 国产线视频精品免费观看视频| 亚洲中文字幕久久精品无码APP| 二个人看的www免费视频| 久久精品亚洲一区二区| aⅴ在线免费观看| 亚洲成熟丰满熟妇高潮XXXXX | 亚洲一区二区三区深夜天堂| 怡红院免费的全部视频| 亚洲av午夜福利精品一区人妖| aⅴ免费在线观看| 美女羞羞免费视频网站| 天天看片天天爽_免费播放| 国产亚洲高清在线精品不卡| 最近中文字幕mv免费高清电影| 亚洲美女自拍视频| 无码av免费网站| 亚洲av无码专区在线观看亚| 毛片免费视频在线观看| 亚洲国产av高清无码| 又黄又爽一线毛片免费观看| 亚欧免费一级毛片|