posts - 4,  comments - 9,  trackbacks - 0
          ??????? 在你學到了如何開發藕合松散的服務組件后,為了存取那些服務對象,你需要通過服務器的JNDI 來查找存根對象(session bean)或消息隊列(MDB)。JNDI查找是把客戶端與實際的服務端實現解藕的關鍵步驟。但是,直接使用一個字符串來進行JNDI查找并不優雅。有這樣幾個原因:
          ·客戶端與服務端必須有一致的基于字符串的名字。它沒有在編譯時得到認證或在布署時得到檢查。
          ·從JNDI返回的服務對象的類型沒有在編譯時進行檢查,有可能在運行時出現轉換(casting)錯誤。
          ·冗長的查找代碼,有著自己的try-catch代碼塊,在應用之間是重復的和雜亂的
          ?????????EJB 3.0,對任何POJO,提供了一個簡單的和優雅的方法來解藕服務對象和資源。使用@EJB注釋,你可以將EJB存根對象注入到任何EJB 3.0容器管理的POJO 中。如果注釋用在一個屬性變量上,容器將會在它被第一次訪問之前賦值給它。在Jboss下一版本中@EJB注釋從javax.annotation包移到了javax.ejb 。
          下面的例子演示了怎樣把HelloWorldBean無狀態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 方法上時,容器會在屬性第一次使用之前,自動地用正確的參數調
          用bean的setter 方法。下面的片斷演示了這是如何做的
          public class InjectionBean implements Injection {
          HelloWorld helloworld;
          @EJB (beanName="HelloWorldBean")
          public void setHelloworld(HelloWorld helloworld) {
          this.helloworld = helloworld;
          }
          …..
          下面是InjectionBean的Remote業務接口
          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的任何
          資源。下面的例子中演示了如何注入數據源。"java:/DefaultMySqlDS"是數據源DefaultMySqlDS的全局JNDI名。
          有關數據源的配置請參考后面章節“JBoss數據源的配置”
          //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項目的開發環境請參考第三章”如何恢復本書配套例子的開發環境”,要發布本例子EJB,你可以執行Ant 的deploy任務。發布前確保HelloWorld.jar 已經發布到Jboss中。
          posted on 2006-11-01 00:37 凌宇 閱讀(1192) 評論(0)  編輯  收藏

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


          網站導航:
           
          <2025年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          常用鏈接

          留言簿(3)

          隨筆檔案(3)

          文章檔案(14)

          相冊

          收藏夾

          Java

          最新隨筆

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 怀化市| 荔浦县| 蓬安县| 河东区| 本溪市| 紫云| 凤冈县| 沽源县| 通许县| 临高县| 普格县| 工布江达县| 汶上县| 梅州市| 郴州市| 陆丰市| 邓州市| 黄山市| 涟水县| 社会| 那曲县| 罗田县| 龙岩市| 阿鲁科尔沁旗| 遂平县| 右玉县| 康马县| 绥化市| 岚皋县| 开化县| 乐都县| 平湖市| 新津县| 连南| 海安县| 沂南县| 桂林市| 澎湖县| 上虞市| 莱西市| 周口市|