斷點

          每天進(jìn)步一點點!
          posts - 174, comments - 56, trackbacks - 0, articles - 21

          在做項目中碰見這樣的問題,如下:
          Caused by: org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [com.pcis.cus.vo.CusClientVO#002255207];

          原因: 有一個具有相同值的不同對象已經(jīng)與和 session 相關(guān)聯(lián)

          解決(程序的一部分):
           //CusClientVO cusVo = new CusClientVO();
                  CusClientVO cusVo = null;
                  IUserDetails user = CurrentUser.getUser();
                  try {
                      if ("Same".equals(cusFlag)) {//被保險人和投保人是同一人
                          cusVo = (CusClientVO)this.getById(CusClientVO.class, applicant.getCAppCde());
                          if(cusVo==null){  //表示新增客戶。
                              cusVo = new CusClientVO();
                          }
                          this.saveCusApplicant(applicant, cusVo);
                          if(!applicantflag ){
                              cusVo.setTCrtTm(new Date());
                              cusVo.setCCrtCde(user.getOpRelCde());
                          }
                      }
                      cusVo.setTUpdTm(new Date());
                      cusVo.setCUpdCde(user.getOpRelCde());
                      //
                      this.saveOrUpdate(cusVo);
                  } catch (DaoException ex) {
                      BusinessServiceException e = new BusinessServiceException(ex);
                      e.setErrorMsg("保存客戶信息失敗");
                  }

          相關(guān)連接:

          http://hi.baidu.com/anypcao/blog/item/0db1a41cd3478d8187d6b6d2.html

          http://agreal.javaeye.com/blog/339560


          posted @ 2009-10-31 13:11 斷點 閱讀(61) | 評論 (0) 

          posted @ 2010-01-13 23:33 斷點 閱讀(1369) | 評論 (0)編輯 收藏

          有兩張表(question、answer),它們存在著一對多關(guān)系(question->answer)和多對一關(guān)系(answer->question)。

          在Answer.java中定義有:
          public class Answer {
              private String userid;
              private Question question;
              private int qid;
          }

          在answer.hbm.xml中有:
           <many-to-one name="question" class="org.lxh.myzngt.vo.Question" fetch="select">
                      <column name="qid" />
           </many-to-one>

          所以SQL語句如下:

          public List queryByUserAnswer(String userid, int currentPage, int lineSize) {
                  List all = null;
                  String hql = "from Question as q where q.qid in(select a.question.qid from Answer as a where a.userid=?)";
                  Query q = super.getSession().createQuery(hql);
                  q.setString(0, userid);
                  // 分頁操作。
                  q.setFirstResult((currentPage - 1) * lineSize);
                  q.setMaxResults(lineSize);
                  all = q.list();
                  return all;
              }

          否則報錯:

          org.hibernate.QueryException: could not resolve property: qid of: org.lxh.myzngt.vo.Answer [select count(q.qid) from org.lxh.myzngt.vo.Question as q where q.qid in(select a.qid from org.lxh.myzngt.vo.
          Answer as a where a.userid=?)]

          posted @ 2009-02-23 15:58 斷點 閱讀(173) | 評論 (0)

          posted @ 2010-01-13 23:26 斷點 閱讀(408) | 評論 (0)編輯 收藏

          org.hibernate.hql.ast.QuerySyntaxError: user is not mapped. [from user as u where u.userid=?]

          出現(xiàn)這個問題,主要是hibernate語句不對。

          User.hbm.xml為:

          <hibernate-mapping>
          <class name="org.lxh.myzngt.vo.User" table="user" >
                  <id name="id" type="java.lang.Integer">
                      <column name="id" />
                      <generator class="native"></generator>
                  </id>
          </class>
          </hibernate-mapping>

          因此,hql 語句如下:

          String hql = "from User as u where u.userid=?"


          posted @ 2009-02-11 17:55 斷點 閱讀(109) | 評論 (0)

          posted @ 2010-01-13 23:22 斷點 閱讀(263) | 評論 (0)編輯 收藏

          一個Web 應(yīng)用發(fā)布到Jboss 服務(wù)器時需要打成war包。
          下面介紹jar命令行Ant任務(wù)兩種war文件的打包方式。

          1.命令行下進(jìn)行war 文件打包。
          在Dos 窗口中進(jìn)入到WEB 應(yīng)用根目錄下(WebRoot下),執(zhí)行如下命令,如:
          jar cvf EJBClient.war *,再把打包的EJBClient.war拷貝到C:\jboss-5.0.0.GA\server\default\deploy發(fā)布。

          2.在Ant 任務(wù)中進(jìn)行war文件打包。
          build.xml文件如下:
           <?xml version="1.0" encoding="UTF-8"?>
          <project name="EJBClient" default="war" basedir=".">
           <property environment="env" />
           <property name="jboss.home" value="${env.JBOSS_HOME}" />
           <property name="jboss.server.config" value="default" />
           <target name="war" description="創(chuàng)建WEB 發(fā)布包">
            <war warfile="${basedir}/${ant.project.name}.war" webxml="${basedir}/WebRoot/WEB-INF/web.xml">
             <classes dir="${basedir}/WebRoot/WEB-INF/classes">
              <include name="**/*.class" />
             </classes>
             
             <lib dir="${basedir}/WebRoot/WEB-INF/lib">
              <include name="*.jar" />
             </lib>
             
             <webinf dir="${basedir}/WebRoot">
              <include name="*.*" />
             </webinf>
            </war>
           </target>
           
           <target name="deploy" depends="war" description="發(fā)布WAR">
            <copy file="${basedir}\${ant.project.name}.war" todir="${jboss.home}\server\${jboss.server.config}\deploy"/>
           </target>
           
           <target name="undeploy"  description="卸載WAR">
            <delete file="${jboss.home}\server\${jboss.server.config}\deploy\${ant.project.name}.war"/>
           </target>
          </project>


          posted @ 2009-03-30 18:15 斷點 閱讀(145) | 評論 (0)

          posted @ 2010-01-13 23:11 斷點 閱讀(347) | 評論 (0)編輯 收藏

          do not get WebServiceContext property from stateless bean context, it should already have been injected

          這個主要原因就在stateless bean的實現(xiàn)類。

          仔細(xì)查看后發(fā)現(xiàn),原來我在實現(xiàn)類的每個方法前加入了 @WebMethod(指定暴露給外界的方法),因此去掉就可以了。


          13:41:39,168 WARN  [StatelessBeanContext] EJBTHREE-1337: do not get WebServiceContext property from stateless bean context, it should already have been injected
          13:41:39,215 WARN  [InterceptorsFactory] EJBTHREE-1246: Do not use InterceptorsFactory with a ManagedObjectAdvisor, InterceptorRegistry should be used via the bean container
          13:41:39,215 WARN  [InterceptorsFactory] EJBTHREE-1246: Do not use InterceptorsFactory with a ManagedObjectAdvisor, InterceptorRegistry should be used via the bean container
          13:41:39,230 WARN  [InterceptorRegistry] applicable interceptors is non-existent for public cn.ztf.bean.Order cn.ztf.service.impl.OrderServiceBean.getOrder(java.lang.String)
          13:41:39,246 WARN  [InterceptorRegistry] applicable interceptors is non-existent for public java.lang.String
          cn.ztf.service.impl.OrderServiceBean.getUserName(java.lang.String)
          13:41:39,246 WARN  [InterceptorRegistry] applicable interceptors is non-existent for public java.util.List
          cn.ztf.service.impl.OrderServiceBean.getOrders()
          13:41:39,246 WARN  [InterceptorRegistry] applicable interceptors is non-existent for public cn.ztf.bean.Order cn.ztf.service.impl.OrderServiceBean.getOrder(java.lang.String)
          13:41:39,261 WARN  [InterceptorRegistry] applicable interceptors is non-existent for public java.lang.String
          cn.ztf.service.impl.OrderServiceBean.getUserName(java.lang.String)
          13:41:39,261 WARN  [InterceptorRegistry] applicable interceptors is non-existent for public java.util.List
          cn.ztf.service.impl.OrderServiceBean.getOrders()
          13:41:39,293 WARN  [StatelessBeanContext] EJBTHREE-1337: do not get WebServiceContext property from stateless bean context, it should already have been injected
          13:46:27,043 WARN  [StatelessBeanContext] EJBTHREE-1337: do not get WebServiceContext property from stateless bean context, it should already have been injected
          13:46:27,043 WARN  [StatelessBeanContext] EJBTHREE-1337: do not get WebServiceContext property from stateless bean context, it should already have been injected

           
          posted @ 2009-03-30 14:33 斷點 閱讀(647) | 評論 (0)

          posted @ 2010-01-13 22:50 斷點 閱讀(1069) | 評論 (1)編輯 收藏

          Web服務(wù)也是一種分布式技術(shù),屬于行業(yè)規(guī)范,可以跨平臺及語言。
          EJB屬于java平臺規(guī)范,盡管理論上可以跨平臺,但實現(xiàn)起來比較麻煩,所以其應(yīng)用范圍局限在java平臺。

          二者偏重點不同:
          Web服務(wù)偏重的是這個系統(tǒng)對外提供什么功能;
          EJB偏重的是如何使用一個個組件組裝這些功能。

          例如:一個硬盤,它對外提供的是存儲服務(wù),這是web服務(wù)的關(guān)注點;對于怎樣組裝這個硬盤,web服務(wù)并不關(guān)心,而這些是EJB所關(guān)注的。

          JavaEE為web service提供了兩種不同的編程模型:EJB容器模型、Web容器模型
          下面以最新的JAX-WS2.x規(guī)范(Java API for XML-based Web Services)介紹Webservice的開發(fā)。
          注:JAX-WS的下載路徑為https://jax-ws.dev.java.net/servlets/ProjectDocumentList?folderID=7796&expandFolder=7796&folderID=11088

          EJB容器模型的WEB服務(wù)的客戶端開發(fā):
          注:首先我們需要建立一個無狀態(tài)SessionBean,然后把此無狀態(tài)SessionBean發(fā)布為web service。

          1.在應(yīng)用的類路徑下放入JAX-WS的全部jar文件,并且把引進(jìn)的jar文件添加到類路徑上,即右擊項目名-->Properties-->Java Build Path-->Add JARS。
          如果你使用的是JDK6,這一步可以省略,因為JDK6已經(jīng)綁定了JAX-WS。目前JDK6綁定的JAX-WS版本是2.0。

          2.把JAX-WS產(chǎn)品lib目錄中找到j(luò)axws-api.jar和jaxb-api.jar,把這兩個文件copy到JDK_HOME/jre/lib/endorsed目錄下。

          3.利用Web Service客戶端生成工具(wsimport工具的Ant任務(wù)類)生成輔助類。
          build.xml文件內(nèi)容如下:
          <?xml version="1.0" encoding="UTF-8"?>
          <project name="WSClient" default="wsclientgen" basedir=".">
           <property name="src.dir" value="${basedir}/src" />
           
           <path id="build.classpath" description="設(shè)置類路徑">
            <fileset dir="${basedir}/lib">
             <include name="*.jar"></include>
            </fileset>
           </path>
           
           <target name="wsclientgen" description="生成webservice客戶端輔助代碼,執(zhí)行后請刷新項目">
            <taskdef name="wsimport" classname="com.sun.tools.ws.ant.WsImport"
             classpathref="build.classpath"/>
            <wsimport wsdl="http://localhost:8090/WebService/OrderServiceBean?wsdl"
             sourcedestdir="${src.dir}"  package="cn.ztf.ws.client" keep="true"
              verbose="true" destdir="${basedir}/bin"/>
           </target>
          </project>

          4.借助輔助類調(diào)用Web Service。


          posted @ 2009-03-30 14:22 斷點 閱讀(169) | 評論 (0)

          posted @ 2010-01-13 22:48 斷點 閱讀(414) | 評論 (0)編輯 收藏

          EJB3.0中MessageDrivenBean:

          1.java消息驅(qū)動bean屬于Java消息服務(wù)(Java Message Service,簡稱JMS)。

          2.JMS是用于訪問企業(yè)消息系統(tǒng)的開發(fā)商中心的API。企業(yè)消息系統(tǒng)可以協(xié)助應(yīng)用軟件通過網(wǎng)絡(luò)進(jìn)行消息交互。

          3.JMS的編程過程簡單概括為:應(yīng)用程序A-->(消息)-->Jboss JMS-->(消息)-->應(yīng)用程序B。應(yīng)用程序A和應(yīng)用程序B沒有直接的代碼關(guān)聯(lián),兩者實現(xiàn)了解耦。消息傳遞系統(tǒng)的中心就是消息。

          消息驅(qū)動Bean(MDB)是設(shè)計用來專門處理基于消息請求的組件,它和無狀態(tài)Session Bean一樣也使用了實例池技術(shù),容器可以使用一定數(shù)量的bean實例并發(fā)處理成百上千個JMS消息。正因為MDB具有處理大量并發(fā)消息的能力,所以非常適合應(yīng)用在一些消息網(wǎng)關(guān)產(chǎn)品。如果一個業(yè)務(wù)執(zhí)行的時間很長,而執(zhí)行結(jié)果無需實時向用戶反饋時,也很適合使用MDB。如訂單成功后給用戶發(fā)送一封電子郵件或發(fā)送一條短信等。

          消息有下面幾種類型,他們都是派生自Message接口。
          StreamMessage:一種主體中包含Java基本值流的消息。其填充和讀取均按順序進(jìn)行。
          MapMessage:一種主體中包含一組名-值對的消息。(沒有定義條目順序)
          TextMessage:一種主體中包含Java字符串的消息(例如:XML消息)
          ObjectMessage:一種主體中包含序列化Java對象的消息。
          BytesMessage:一種主體中包含連續(xù)字節(jié)流的消息。

          消息的傳遞模型:
          JMS支持兩種消息傳遞模型:點對點(point-to-point,簡稱PTP)和發(fā)布/訂閱(publish/subscribe,
          簡稱pub/sub)。
          二者有以下區(qū)別:
          1.PTP 消息傳遞模型規(guī)定了一條消息只能傳遞給一個接收方。采用javax.jms.Queue表示。
          2.Pub/sub 消息傳遞模型允許一條消息傳遞給多個接收方。采用javax.jms.Topic表示。

          注意:每種模型都通過擴(kuò)展公用基類來實現(xiàn)。例如,javax.jms.Queue 和javax.jms.Topic都擴(kuò)展自
          javax.jms.Destination 類。

           

          開發(fā)步驟如下:
          一、配置destinations-service.xml文件。
          JBOSS使用一個XML文件配置隊列地址,文件的取名格式應(yīng)遵循*-service.xml,我取名為
          destinations-service.xml。
          jboss默認(rèn)的全局JNDI名稱組成為:"queue"+"/"+"目標(biāo)地址"。
          開始JMS編程前,我們需要先配置消息到達(dá)的目標(biāo)地址(Destination),因為只有目標(biāo)地址存在了,
          我們才能發(fā)送消息到這個地址。由于每個應(yīng)用服務(wù)器關(guān)于目標(biāo)地址的配置方式都有所不同,下面以jboss為例,配置一個queue類型的目標(biāo)地址。
          <?xml version="1.0" encoding="UTF-8"?>
          <server>
             <mbean code="org.jboss.mq.server.jmx.Queue" 

          name="jboss.mq.destination:service=Queue,name=ztfQueue">
                <attribute name="JNDIName">queue/ztfQueue</attribute>
                <depends optional-attribute-

          name="DestinationManager">jboss.mq:service=DestinationManager</depends>
              </mbean>
             <mbean code="org.jboss.mq.server.jmx.Topic" 

          name="jboss.mq.destination:service=Topic,name=ztfTopic">
                <attribute name="JNDIName">topic/ztfTopic</attribute>
                <depends optional-attribute-

          name="DestinationManager">jboss.mq:service=DestinationManager</depends>
              </mbean>
          </server>
          注意:任何隊列或主題被部署之前,應(yīng)用服務(wù)器必須先部署Destination Manager Mbean,所有我們
          通過<depends>節(jié)點聲明這一依賴。

          二、在java類中發(fā)送消息(用到j(luò)ndi.properties)。
          一般發(fā)送消息有以下步驟:
          1.得到一個JNDI初始化上下文(Context)
          InitialContext ctx = new InitialContext();

          2.根據(jù)上下文查找一個連接工廠ConnectionFactory,改連接工廠是由JMS提供的,不需我們自己創(chuàng)建,每個廠商都為它綁定了一個全局JNDI,我們通過它的全局JNDI便獲取它;
          QueueConnectionFactory factory = (QueueConnectionFactory)ctx.lookup("ConnectionFactory");

          3.從連接工廠得到一個連接QueueConnection。
          QueueConnection conn = factory.createQueueConnection();

          4.通過連接來建立一個會話(Session);
          QueueSession session = conn.createQueueSession(false,QueueSession.AUTO_ACKNOWLEDGE);
          這句代碼意思是:建立不需要事務(wù)的并且能自動確立消息已接收的會話。

          5.查找目標(biāo)地址:
          Destination destination=(Destination)ctx.lookup("queue/ztfQueue");

          6.根據(jù)會話以及目標(biāo)地址來建立消息生產(chǎn)者M(jìn)essageProducer(QueueSender和TopicPublisher都擴(kuò)展自MessageProducer接口):
          MessageProducer producer = session.createProducer(destination);
          TextMessage msg = session.createTextMessage("您好:荊州,這是我的第一個消息驅(qū)動Bean");
          producer.send(msg);

          三、采用MessageDrivenBean接收消息。
          當(dāng)容器檢測到bean守候的目標(biāo)地址有消息到達(dá)時,容器調(diào)用onMessage()方法,將消息作為參數(shù)傳入
          MDB。MDB在onMessage()中決定如何處理改消息。你可以使用注解指定MDB監(jiān)聽哪一個目標(biāo)地址(Destination)。當(dāng)MDB部署時,容器將讀取其中的配置信息。

          一個MDB通常要實現(xiàn)MessageListener接口,在接口定義了onMessage()方法。Bean通過它來處理收到的JMS消息。
          @MessageDriven(activationConfig=
          {
           @ActivationConfigProperty

          (propertyName="destinationType",propertyValue="javax.jms.Queue"),
           @ActivationConfigProperty

          (propertyName="destination",propertyValue="queue/ztfQueue"),
           @ActivationConfigProperty(propertyName="acknowledgeMode",propertyValue="Auto-

          acknowledge")
          })
          public class MessageDrivenBean implements MessageListener{
           public void onMessage(Message message) {
            TextMessage msg = (TextMessage)message;
            try {
             System.out.println(msg.getText());
            } catch (JMSException e) {
             e.printStackTrace();
            }
           }
          }

          四、把工程src下的文件打成jar包(用到build.xml),在C:\jboss-5.0.0.GA\server\default\deploy進(jìn)行部署。

          五、運行發(fā)送消息的java類,此時在console中就可看見結(jié)果了。

          六、至此,一個MessageDrivenBean開發(fā)就成功了。


          posted @ 2009-03-27 17:43 斷點 閱讀(158) | 評論 (0) 

          posted @ 2010-01-13 22:47 斷點 閱讀(369) | 評論 (0)編輯 收藏

          實體bean:
          1.它屬于java持久化規(guī)范(簡稱JPA)里的技術(shù),Entitybean通過元數(shù)據(jù)在javabean和數(shù)據(jù)庫表之間建立起映射關(guān)系,然后Java程序員就可以使用
          面向?qū)ο蟮木幊趟枷雭聿倏v數(shù)據(jù)庫。

          2.通過注解使實體bean與數(shù)據(jù)庫表相映射。

          3.當(dāng)客戶端遠(yuǎn)程調(diào)用EJB時,數(shù)據(jù)在傳送工程中是需要序列化的 ,業(yè)務(wù)方法是要返回Entitybean對象到客戶端,顯然Entitybean對象是要進(jìn)行序列化的過程,所以要實現(xiàn)序列化接口,即對象在交互時需要實現(xiàn)序列化。

          4.Entitybean主鍵值的生成方式。
          @GeneratedValue(strategy = GenerationType.IDENTITY)針對Mysql,
          @GeneratedValue(strategy = GenerationType.SEQUENCE)針對Oracle,
          @GeneratedValue(strategy = GenerationType.AUTO)自動匹配數(shù)據(jù)庫。

          5.需要保留一個無參的構(gòu)造函數(shù),是JPA規(guī)范要求的,如果沒有,在運行時是要報錯的。

          6.對象之間的比較,通常采用對象標(biāo)志屬性來進(jìn)行比較,也就是ID進(jìn)行比較,因此現(xiàn)在重載hashCode、equals兩個方法。

           

          JPA的出現(xiàn)主要是為了簡化現(xiàn)有的持久化開發(fā)工作和整合ORM技術(shù),目前實現(xiàn)的JPA規(guī)范的主流產(chǎn)品有Hibernate、Toplink和OpenJPA,在jboss中采用了Hibernate作為其持久化實現(xiàn)產(chǎn)品。

           

          根據(jù)JPA規(guī)范的要求:在實體bean應(yīng)用中,我們需要在應(yīng)用的類路徑下的META-INF目錄加入持久化配置文件persistence.xml。
          persistence.xml文件用于指定Entitybean使用的數(shù)據(jù)源及EntityManager對象的默認(rèn)行為。
          persistence.xml的配置說明如下:
          <?xml version="1.0" encoding="UTF-8"?>
          <persistence xmlns="http://java.sun.com/xml/ns/persistence"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
           http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0">
           
           <!--  一個持久化單元是一個Entitybean的集合,JTA代表全局事物。-->
           <persistence-unit name="ztf" transaction-type="JTA">
            <jta-data-source>java:/ztfDS</jta-data-source>
            <properties>
             <!-- 根據(jù)元數(shù)據(jù)生成數(shù)據(jù)庫的表結(jié)構(gòu)。 -->
             <property name="hibernate.hbm2ddl.auto" value="update"/>
             <!-- 顯示執(zhí)行的SQL。 -->
             <property name="hibernate.show_sql" value="true"/>
             <!-- 格式化顯示的SQL 。 -->
             <property name="hibernate.format_sql" value="true"/>
             <!-- SQL方言。 -->
             <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle9Dialect"/>
            </properties>
           </persistence-unit>
          </persistence>

          注意:因為jboss 采用Hibernate,Hibernate 有一項屬性hibernate.hbm2ddl.auto,該屬性指定實體Bean發(fā)布時是否同步數(shù)據(jù)庫結(jié)構(gòu)。

          1.如果hibernate.hbm2ddl.auto的值設(shè)為create-drop,在實體Bean發(fā)布及卸載時將自動創(chuàng)建及刪除相應(yīng)數(shù)據(jù)庫表(注意:Jboss 服務(wù)器啟動或關(guān)閉時也會引發(fā)實體Bean 的發(fā)布及卸載)。

          2.如果hibernate.hbm2ddl.auto的值設(shè)為update,以后為了實體bean的改動能反應(yīng)到數(shù)據(jù)表,建議使用update,這樣實體Bean 添加一個屬性時能同時在數(shù)據(jù)表增加相應(yīng)字段。


          posted @ 2009-03-26 12:35 斷點 閱讀(166) | 評論 (0)

          posted @ 2010-01-13 22:45 斷點 閱讀(395) | 評論 (0)編輯 收藏

          遠(yuǎn)程接口調(diào)用ejb的過程:
          首先客戶端需要與ejb建立起socket通信,在通信管道上他們之間需要來回發(fā)送IIOP協(xié)議消息,因為數(shù)據(jù)要在網(wǎng)絡(luò)進(jìn)行傳輸,存放數(shù)據(jù)的java對象必須要進(jìn)行序列化。這個過程中,有網(wǎng)絡(luò)通信的開銷、協(xié)議解析的開銷、對象序列化的開銷。因為ejb是分布式技術(shù),它允許客戶端與ejb應(yīng)用在不同一機器上面,所以這些開銷也是必然的。

          本地接口調(diào)用ejb的過程:
          通過本地接口調(diào)用ejb,直接在內(nèi)存交互,這樣就可以避免因網(wǎng)絡(luò)通信所造成的各種性能開銷。
          注意:
          1.只有客戶端與EJB應(yīng)用都在同一個JVM內(nèi)運行的時候,我們才能調(diào)用本地接口,否則只能調(diào)用遠(yuǎn)程接口。
          2.只要客戶端與ejb發(fā)布在同一個jboss內(nèi),我們就認(rèn)為它們在同一個JVM。
          3.客戶端可以調(diào)用本地接口;也可調(diào)用遠(yuǎn)程接口;當(dāng)本地接口與遠(yuǎn)程接口都有同一個方法時,優(yōu)先調(diào)用本地接口中的方法。

          開發(fā)一個自己的遠(yuǎn)程接口的無狀態(tài)會話bean:
          1.需要自己開發(fā)的EJB的組件.jar包。
          注意:在實現(xiàn)類中加入注解,綁定接口。
          @Stateless、@Remote(HelloWorld.class) //為接口。
          2.需要自己開發(fā)出的EJB的客戶端,并把客戶端工程打成.war文件。
          注意:客戶端所要知道的JNDI名稱,下面的HelloWorld 為遠(yuǎn)程接口。
          InitialContext ctx = new InitialContext();
          HelloWorld helloWorld = (HelloWorld)ctx.lookup("HelloWorldBean/remote");
          out.println(helloWorld.sayHello("荊州"));
          3.把.jar和.war文件拷貝到j(luò)boss的deploy區(qū)。
          4.打開瀏覽器,輸入自己開發(fā)出的EJB客戶端的.jsp頁面,即可。

          開發(fā)一個自己的本地接口的無狀態(tài)會話bean:
          1.需要自己開發(fā)的EJB的組件.jar包。
          注意:在實現(xiàn)類中加入注解,綁定接口。
          @Stateless、@Local(HelloWorldLocal.class)//接口。
          2.需要自己開發(fā)出的EJB的客戶端,并把客戶端工程打成.war文件。
          注意:客戶端所要知道的JNDI名稱,下面的HelloWorldLocal 為本地接口。
          InitialContext ctx = new InitialContext();
          HelloWorldLocal helloWorld = (HelloWorldLocal)ctx.lookup("HelloWorldLocalBean/local");
          out.println(helloWorld.sayHello("荊州"));
          3.把.jar和.war文件拷貝到j(luò)boss的deploy區(qū)。
          4.打開瀏覽器,輸入自己開發(fā)出的EJB客戶端的.jsp頁面,即可。

          Bean實例的兩種管理技術(shù):
          1.無狀態(tài)bean使用實例池技術(shù)管理bean;
          2.有狀態(tài)bean使用激活(activation)管理bean。

          Jboss生成的JNDI名稱,默認(rèn)命名規(guī)則如下:
          如果把EJB應(yīng)用打包成后題為.jar的模塊文件,默認(rèn)的全局JNDI名稱是
          本地接口:EJB-CLASS-NAME/local
          遠(yuǎn)程接口:EJB-CLASS-NAME/remote
          例如:把EJB-HelloWorld(里面包含接口HelloWorld和實現(xiàn)類HelloWorldBean)應(yīng)用打包成EJB-HelloWorld.jar文件,它的遠(yuǎn)程接口的JNDI名稱是:HelloWorldBean/remote。

          jndi.properties的配置:
          java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
          java.naming.provider.url=localhost:1099


          posted @ 2009-03-26 09:56 斷點 閱讀(255) | 評論 (0)

          posted @ 2010-01-13 22:42 斷點 閱讀(358) | 評論 (0)編輯 收藏

          要發(fā)布EJB 時必須把她打成*.jar 文件,一個EJB 打包后的目錄結(jié)構(gòu)如下:
          EJB 應(yīng)用根目錄:
          | -- com (你的.class 文件)
          | -- META-INF
          | -- MANIFEST.MF (如果使用工具打包,該文件由工具自動生成)
          打包的方式有很多,如:jar 命令行、集成開發(fā)環(huán)境的打包向?qū)Ш虯nt 任務(wù)。

          下面介紹Elispse 打包向?qū)Ш虯nt 打包任務(wù)。
          1. Elispse 打包向?qū)?br /> 在Elispse 開發(fā)環(huán)境下,可以通過向?qū)нM(jìn)行打包。右擊項目名稱,在跳出的菜單中選擇Export-->Java-->JAR file,在"選擇要導(dǎo)出的資源"時,選擇源目錄和用到的資源然,后選擇一個存放目錄及文件名,點"完成"就結(jié)束了打包。

          2. Ant 打包任務(wù)
          主要是在Eclipse下,通過配置build.xml進(jìn)行ANT 打包,來提高開發(fā)效率,也是推薦的打包方式。
          下面我們看一個簡單的打包任務(wù)。
          <?xml version="1.0" encoding="UTF-8"?>
          <project name="EJB-HelloWorld" basedir=".">
          <property name="src.dir" value="${basedir}\src" />
          <property environment="env" />
          <property name="jboss.home" value="${env.JBOSS_HOME}" />
          <property name="jboss.server.config" value="default" />
          <property name="build.dir" value="${basedir}\build" />

          <path id="build.classpath">
          <fileset dir="${jboss.home}\client">
          <include name="*.jar"></include>
          </fileset>
          <pathelement location="${build.dir}"/>
          </path>

          <target name="prepare">
          <delete dir="${build.dir}"/>
          <mkdir dir="${build.dir}"/>
          </target>

          <target name="compile" depends="prepare" description="編譯 ">
          <javac srcdir="${src.dir}" destdir="${build.dir}">
          <classpath refid="build.classpath" />
          </javac>
          </target>

          <target name="ejbjar" depends="compile" description="創(chuàng)建EJB發(fā)布包">
          <jar jarfile="${basedir}\${ant.project.name}.jar" >
          <fileset dir="${build.dir}" >
          <include name="**/*.class"></include>
          </fileset>
          </jar>
          </target>

          <target name="deploy" depends="ejbjar" description="發(fā)布EJB">
          <copy file="${basedir}\${ant.project.name}.jar" todir="${jboss.home}\server\${jboss.server.config}\deploy"/>
          </target>

          <target name="undeploy" description="卸載EJB">
          <delete file="${jboss.home}\server\${jboss.server.config}\deploy\${ant.project.name}.jar"/>
          </target>
          </project>

          再右健點擊此配置文件build.xml,選擇Run As-->Ant Build即可!


          posted @ 2009-03-26 09:51 斷點 閱讀(158) | 評論 (0)

          posted @ 2010-01-13 22:39 斷點 閱讀(604) | 評論 (0)編輯 收藏

          僅列出標(biāo)題
          共18頁: First 上一頁 10 11 12 13 14 15 16 17 18 下一頁 
          主站蜘蛛池模板: 永兴县| 彝良县| 前郭尔| 宁波市| 休宁县| 碌曲县| 咸宁市| 山阴县| 赤城县| 遂昌县| 浏阳市| 建水县| 新化县| 中卫市| 泾源县| 陕西省| 五大连池市| 晋江市| 林州市| 来安县| 南皮县| 临高县| 湘潭县| 泰来县| 伊宁县| 昆明市| 阿拉善盟| 河西区| 武功县| 新营市| 巫溪县| 克拉玛依市| 高陵县| 图片| 黎川县| 江北区| 自治县| 佛坪县| 南郑县| 新龙县| 虞城县|