go4it

          EJB--SEAM

            BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
            11 Posts :: 0 Stories :: 0 Comments :: 0 Trackbacks

          2008年12月9日 #

          1.默認(rèn)EJB BEAN的名稱為JNDI的名稱,除非用注解指定。

          2.@Remote/@Local可以定義在接口,也可以在實(shí)現(xiàn)類定義。

          3.如果一個(gè)EJB實(shí)現(xiàn)了多個(gè)接口,必須指定那些接口是remote,哪些是local。

          4.另一種定義

          @Remote(value={EjbInterface01.class,EjbInterface02.class})
          @Local(value={EjbInterface03.class,EjbInterface04.class})

          當(dāng)屬性為value而且只定義一個(gè)屬性時(shí),value可以省略只寫值。

          5.直接在接口里面定義,那么實(shí)現(xiàn)類就不用再定義了。

          posted @ 2008-12-09 12:53 go4it 閱讀(137) | 評(píng)論 (0)編輯 收藏

          1.不需要jndi配置,直接new InitialContext()即可,因?yàn)楸镜卦L問服務(wù)器已經(jīng)有相關(guān)配置了。

          2.本地客戶端也不需要依賴包(相關(guān)接口和類定義;client包)。就是web應(yīng)用在運(yùn)行時(shí)自然處在服務(wù)器里面,那些依賴包都有了。

            如果把Jbossall-client.jar也拷到本地客戶端來,則會(huì)出錯(cuò)。因?yàn)樵诓渴饂eb項(xiàng)目時(shí),myeclipse會(huì)將jar包部署到web項(xiàng)目下Web-root\web-inf\lib文件夾下。

          引起重復(fù)出現(xiàn)錯(cuò)誤。

          posted @ 2008-12-09 12:52 go4it 閱讀(128) | 評(píng)論 (0)編輯 收藏

          1.遠(yuǎn)程客戶端:傳值,對象必須序列化,服務(wù)器對對象的修改不會(huì)在客戶端體現(xiàn)。

          2.本地客戶端:

           (1)創(chuàng)建一個(gè)web項(xiàng)目,與jboss部署在同一個(gè)JVM當(dāng)中。

           (2)添加服務(wù)器端項(xiàng)目的依賴或手動(dòng)添加接口的jar包

           (3)在index.jsp改編碼。

              本地客戶端也可以使用遠(yuǎn)程調(diào)用方式:

          <% 
              
          		  Hashtable env=new Hashtable();   
          		  env.put(Context.INITIAL_CONTEXT_FACTORY,"org.jnp.interfaces.NamingContextFactory");   
          		  env.put(Context.PROVIDER_URL,"localhost:1099");   
          		  env.put("java.naming.factory.url.pkgs","org.jboss.naming:org.jnp.interfaces");   
          		  InitialContext cxt=new InitialContext(env);
          		  UserManager us=(UserManager)cxt.lookup("UserManagerBean/remote");
          		  User u=new User();
          		  u.setUsername("persia");
          		  u.setPassword("p");
          		  
                    us.addUser(u);
                    
                    out.println("user--perisa已經(jīng)創(chuàng)建。"+u.getId());
             %>

          本地客戶端的本地調(diào)用方式?jīng)]成功:

          00:18:28,661 ERROR [[jsp]] Servlet.service() for servlet jsp threw exception
          java.lang.IllegalArgumentException: Wrong target. class com.persia.ejb.UserManagerBean for public void com.persia.ejb.UserManagerBean.addUser(com.persia.ejb.User)
          	at org.jboss.aop.joinpoint.MethodInvocation.handleErrors(MethodInvocation.java:141)
          	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:116)
          	at org.jboss.ejb3.interceptor.InvocationContextImpl.proceed(InvocationContextImpl.java:166)
          	at org.jboss.ejb3.interceptor.EJB3InterceptorsInterceptor.invoke(EJB3InterceptorsInterceptor.java:63)
          	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
          	at org.jboss.ejb3.entity.TransactionScopedEntityManagerInterceptor.invoke(TransactionScopedEntityManagerInterceptor.java:54)
          	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
          	at org.jboss.ejb3.AllowedOperationsInterceptor.invoke(AllowedOperationsInterceptor.java:47)
          	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
          	at org.jboss.aspects.tx.TxPolicy.invokeInOurTx(TxPolicy.java:79)
          	at org.jboss.aspects.tx.TxInterceptor$Required.invoke(TxInterceptor.java:191)
          	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
          	at org.jboss.aspects.tx.TxPropagationInterceptor.invoke(TxPropagationInterceptor.java:95)
          	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
          	at org.jboss.ejb3.stateless.StatelessInstanceInterceptor.invoke(StatelessInstanceInterceptor.java:62)
          	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
          	at org.jboss.aspects.security.AuthenticationInterceptor.invoke(AuthenticationInterceptor.java:77)
          	at org.jboss.ejb3.security.Ejb3AuthenticationInterceptor.invoke(Ejb3AuthenticationInterceptor.java:110)
          	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
          	at org.jboss.ejb3.ENCPropagationInterceptor.invoke(ENCPropagationInterceptor.java:46)
          	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
          	at org.jboss.ejb3.asynchronous.AsynchronousInterceptor.invoke(AsynchronousInterceptor.java:106)
          	at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
          	at org.jboss.ejb3.stateless.StatelessContainer.localInvoke(StatelessContainer.java:240)
          	at org.jboss.ejb3.stateless.StatelessContainer.localInvoke(StatelessContainer.java:210)
          	at org.jboss.ejb3.stateless.StatelessLocalProxy.invoke(StatelessLocalProxy.java:84)
          	at $Proxy94.addUser(Unknown Source)
          	at org.apache.jsp.index_jsp._jspService(index_jsp.java:97)
          	at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
          	at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:373)
          	at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:336)
          	at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
          	at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
          	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
          	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
          	at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
          	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
          	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
          	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)
          	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
          	at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:179)
          	at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:84)
          	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
          	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
          	at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:157)
          	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
          	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:262)
          	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
          	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
          	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:446)
          	at java.lang.Thread.run(Thread.java:619)
          

           <% 
              
          		  Hashtable env=new Hashtable();   
          		  env.put(Context.INITIAL_CONTEXT_FACTORY,"org.jnp.interfaces.NamingContextFactory");   
          		  env.put(Context.PROVIDER_URL,"localhost:1099");   
          		  env.put("java.naming.factory.url.pkgs","org.jboss.naming:org.jnp.interfaces");   
          		  InitialContext cxt=new InitialContext(env);
          		  UserManager us=(UserManager)cxt.lookup("UserManagerBean/local");
          		  
          		  User u=new User();
          		  u.setUsername("persia");
          		  u.setPassword("p");
          		  
                   us.addUser(u);
                    
                    out.println("user--perisa已經(jīng)創(chuàng)建。"+u.getId());
             %>

          有待以后多些見識(shí)解決或偶遇高人指點(diǎn)。

          不大清楚,本地調(diào)用還需要JNDI嗎?

          posted @ 2008-12-09 12:51 go4it 閱讀(177) | 評(píng)論 (0)編輯 收藏

          解決:http://www.aygfsteel.com/Bobbyliao/archive/2008/10/01/232018.html

            后來發(fā)現(xiàn),原來是UserManagerBean中的@Local,@Remote必須明確寫上接口的類型,才可以。修改代碼如下:

          package cn.study.ejb;

          import javax.ejb.Local;
          import javax.ejb.Remote;
          import javax.ejb.Stateless;

          @Stateless
          @Remote(UserManager.class)
          @Local(UserManager.class)
          public class UserManagerBean implements UserManager {

          public void addUser(User user) {
                  System.out.println(user.getUsername() + "已經(jīng)被成功保存!");
                  user.setId(13);
              }

          }

          posted @ 2008-12-09 12:51 go4it 閱讀(355) | 評(píng)論 (0)編輯 收藏

          image

          有狀態(tài)和無狀態(tài)的會(huì)話bean都在客戶端產(chǎn)生不同的代理實(shí)例

          image

          不同的是在服務(wù)器端,有狀態(tài)的每次lookup都是新的獨(dú)立的bean,而無狀態(tài)的是單例bean。

          public class StatelessEjbClient {
          
          	/**
          	 * @param args
          	 * @throws NamingException 
          	 */
          	public static void main(String[] args) throws NamingException {
          		  Hashtable env=new Hashtable();   
          		  env.put(Context.INITIAL_CONTEXT_FACTORY,"org.jnp.interfaces.NamingContextFactory");   
          		  env.put(Context.PROVIDER_URL,"localhost");   
          		  env.put("java.naming.factory.url.pkgs","org.jboss.naming:org.jnp.interfaces");   
          		  InitialContext cxt=new InitialContext(env);
          
          		  //第一次會(huì)話
          		  StatelessEjb se1=(StatelessEjb)cxt.lookup("StatelessEjbBean/remote");
          		  System.out.println("剛開始"+se1.getCount());
          		  se1.compute(1);
          		  System.out.println(se1.getCount());
          		  se1.compute(1);
          		  System.out.println(se1.getCount());
          		  se1.compute(1);
          		 System.out.println(se1.getCount());
          		  se1.compute(1);
          		  System.out.println(se1.getCount());
          		 
          		  //第二次會(huì)話
          		  StatelessEjb se2=(StatelessEjb)cxt.lookup("StatelessEjbBean/remote");
          		  System.out.println("剛開始"+se2.getCount());
          		  se2.compute(1);
          		  System.out.println(se2.getCount());
          		  se2.compute(1);
          		  System.out.println(se2.getCount());
          		  se2.compute(1);
          		 System.out.println(se2.getCount());
          		  se2.compute(1);
          		  System.out.println(se2.getCount());
          		  se2.compute(1);
          		  System.out.println(se2.getCount());
          		  
          		  System.out.println("ejb1==ejb2"+(se1==se2));
          		 
          	}
          
          }

          第一次運(yùn)行結(jié)果

          剛開始0
          1
          2
          3
          4
          剛開始4
          5
          6
          7
          8
          9
          ejb1==ejb2false

          而第二次卻不是遞增了:

          剛開始9
          10
          11
          12
          13
          剛開始13
          14
          14
          14
          14
          14
          ejb1==ejb2false

          什么問題???
          posted @ 2008-12-09 12:50 go4it 閱讀(298) | 評(píng)論 (0)編輯 收藏

          1.配置JBOSS服務(wù)器

          2.new EJB project創(chuàng)建項(xiàng)目

          3.創(chuàng)建EJB—》new interface,然后new class實(shí)現(xiàn)類,xxxBean命名。

          4.注解配置EJB:xxxBean類型:@stateful或@stateless和@remote或@local

          5.部署EJB。查看JBOSS\SERVER\DEFAULT\DEPLOY里面部署的EJB.

          6.開發(fā)EJB客戶端:

            (1)new java project

             (2)通過接口調(diào)用,將接口--》導(dǎo)出jar包到客戶端目錄下(jar包名隨便起,然后添加為項(xiàng)目liberies時(shí)點(diǎn)add jar。使用該接口時(shí)再導(dǎo)入該包)。

             (3)將接口jar包添加到項(xiàng)目的類路徑下。將JBOSS\client下的jar包也添加到客戶端項(xiàng)目里面。(可以先在myeclipse里定義一個(gè)庫—>java—>build path—>user libery)。

             (4)new class--》初始化上下文(JNDI里面的initial context)—》context.lookup(“EJB名稱/remote”)--》調(diào)用方法。

             (5)在客戶端配置JNDI,告訴context:EJB在哪里。在類路徑下面(src)目錄下添加jndi.properties。

           

          java.naming.factory.initial = org.jnp.interfaces.NamingContextFactory

          java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces

          java.naming.provider.url = localhost

           

             (6)運(yùn)行客戶端。

           

          我實(shí)際運(yùn)行時(shí)用jndi.properties文件不能運(yùn)行成功,提示Cannot instantiate class: org.jnp.interfaces.NamingContextFactory,網(wǎng)上的解決方法是添加jbossall-client.jar但是我添了沒效果。于是換成在java文件里面設(shè)置,成功。懷疑是我的jndi.properties文件寫法有問題,有待驗(yàn)證。

                    Hashtable env=new Hashtable();  
                    env.put(Context.INITIAL_CONTEXT_FACTORY,"org.jnp.interfaces.NamingContextFactory");  
                    env.put(Context.PROVIDER_URL,"localhost:1099");  
                    env.put("java.naming.factory.url.pkgs","org.jboss.naming:org.jnp.interfaces");  
                    InitialContext cxt=new InitialContext(env);

          posted @ 2008-12-09 12:49 go4it 閱讀(239) | 評(píng)論 (0)編輯 收藏

          1.企業(yè)bean

             (1)session bean(stateless和stateful session bean)

                     會(huì)話bean:從客戶端獲得EJB對象開始,然后調(diào)用EJB方法,直到客戶端釋放EJB對象為止。客戶端通過JNDI查找EJB對象。若每次會(huì)話查找同一對象時(shí),則返回不同對象。

                對象的狀態(tài)由它的實(shí)例變量的值決定的。

               有狀態(tài)session bean:可以區(qū)分不同的客戶端,并保持他們的信息。主要是根據(jù)jsessionid來辨認(rèn)不同的客戶端并維護(hù)他們的狀態(tài)。

             stateful session bean 遠(yuǎn)程調(diào)用的時(shí)候,客戶端得到的是一個(gè)客戶端代理對象,不同的客戶端獲得不同的實(shí)例(同時(shí)分配一個(gè)令牌)。通過令牌來區(qū)分不同的客戶端。每次查找服務(wù)器新創(chuàng)建一個(gè)給客戶端。

             stateless session bean 不對其狀態(tài)做管理。不管是哪個(gè)客戶端,得到的對象可能都是同一個(gè)實(shí)例(單例方式管理)。不能區(qū)分是哪個(gè)客戶端。性能比stateful好。每次查找,服務(wù)器都返回同一個(gè)實(shí)例。

             (2)message driven bean 基于JMS

          2.實(shí)體bean

            entity bean。EJB2的時(shí)候分為BMP(bean管理持久化實(shí)體bean---自己管理CRUD操作)和CMP(容器管理持久化實(shí)體bean--由容器管理CRUD操作)。

          在EJB3中都是CMP。

          posted @ 2008-12-09 12:48 go4it 閱讀(122) | 評(píng)論 (0)編輯 收藏

          1.遠(yuǎn)程客戶端:客戶端和它調(diào)用的EJB對象不在同一個(gè)JVM進(jìn)程當(dāng)中。

          2.本地客戶端:客戶端和它調(diào)用的EJB對象在同一個(gè)(JBOSS)JVM進(jìn)程當(dāng)中。兩個(gè)EJB相互調(diào)用。

          3.webservice客戶端

           

          同一臺(tái)機(jī)器上一個(gè)JVM和JBOSS

          運(yùn)行JBOSS需要一個(gè)JVM進(jìn)程,運(yùn)行一個(gè)java類需要JVM進(jìn)程。

           

          遠(yuǎn)程訪問:傳值方式:

          image

           

          本地訪問方式:傳地址方式,無需序列化。(類似SSH方式)

          image

          image

           

          webservice只能訪問無狀態(tài)會(huì)話bean的接口。

           

          遠(yuǎn)程調(diào)用,客戶端的bean參數(shù)實(shí)際上是一個(gè)參數(shù)值的拷貝,對他修改不會(huì)影響到bean。但本地調(diào)用來說,對bean的參數(shù)是個(gè)引用,修改將影響bean。

           

          粗粒度的數(shù)據(jù)訪問:

          遠(yuǎn)程調(diào)用速度比較慢,盡量減少方法的調(diào)用,盡可能在一個(gè)方法完成所以數(shù)據(jù)的傳輸。

          posted @ 2008-12-09 12:47 go4it 閱讀(170) | 評(píng)論 (0)編輯 收藏

          1.企業(yè)bean

             (1)session bean(stateless和stateful session bean)

                     會(huì)話bean:從客戶端獲得EJB對象開始,然后調(diào)用EJB方法,直到客戶端釋放EJB對象為止。客戶端通過JNDI查找EJB對象。若每次會(huì)話查找同一對象時(shí),則返回不同對象。

                對象的狀態(tài)由它的實(shí)例變量的值決定的。

               有狀態(tài)session bean:可以區(qū)分不同的客戶端,并保持他們的信息。主要是根據(jù)jsessionid來辨認(rèn)不同的客戶端并維護(hù)他們的狀態(tài)。

             stateful session bean 遠(yuǎn)程調(diào)用的時(shí)候,客戶端得到的是一個(gè)客戶端代理對象,不同的客戶端獲得不同的實(shí)例(同時(shí)分配一個(gè)令牌)。通過令牌來區(qū)分不同的客戶端。每次查找服務(wù)器新創(chuàng)建一個(gè)給客戶端。

             stateless session bean 不對其狀態(tài)做管理。不管是哪個(gè)客戶端,得到的對象可能都是同一個(gè)實(shí)例(單例方式管理)。不能區(qū)分是哪個(gè)客戶端。性能比stateful好。每次查找,服務(wù)器都返回同一個(gè)實(shí)例。

             (2)message driven bean 基于JMS

          2.實(shí)體bean

            entity bean。EJB2的時(shí)候分為BMP(bean管理持久化實(shí)體bean---自己管理CRUD操作)和CMP(容器管理持久化實(shí)體bean--由容器管理CRUD操作)。

          在EJB3中都是CMP。

          posted @ 2008-12-09 12:46 go4it 閱讀(176) | 評(píng)論 (0)編輯 收藏

          今天終于做了一個(gè)ejb實(shí)例。

          工具:myeclipse6,jboss服務(wù)器。

           

          image

          1.new--(myeclipse-j2EE projects)—EJB Project

          2.new—ejb3 session bean

          3.配置persistence.xml的持久化單元。

          (1)  配置數(shù)據(jù)源

              拷D:\DevelopTool\jboss-4.2.2.GA\docs\examples\jca里面的mysql-ds.xml到D:\DevelopTool\jboss-4.2.2.GA\server\default\deploy里面,做修改。

          (2)拷數(shù)據(jù)庫jar包到D:\DevelopTool\jboss-4.2.2.GA\server\default\lib里面

          (3)在項(xiàng)目屬性里面添加額外的jar包:數(shù)據(jù)庫驅(qū)動(dòng)和D:\DevelopTool\jboss-4.2.2.GA\client\jbossall-client.jar包

          posted @ 2008-12-09 12:46 go4it 閱讀(168) | 評(píng)論 (0)編輯 收藏

          1.安裝jboss _ide,將myeclipse中的eclipse里面的links考到j(luò)bosside目錄里面就可以用myeclise的插件了。

          2.安裝jboss-ejb3-rc補(bǔ)丁

          3.創(chuàng)建ejb3工程,配置jboss服務(wù)器。

          4.新建ejb3文件夾下的sessionbean,自動(dòng)構(gòu)建接口跟bean類。命名規(guī)范時(shí)接口名后加bean。

          5.導(dǎo)出jar包,另存為jboss-server-all-deploy xx.jar

          6.調(diào)用方法:

             (1)初始化上下文

                       Context cx=new Context()

              (2)獲得接口的實(shí)例(在命名空間里查找)

                       可以在jmx-console jboss.j2ee找到xxbean如HelloBean的ejb

                        Hello hello=(Hello)cx.lookup(“HelloBean/Remote”);

               (3)調(diào)用方法。

                         hello.say(“l(fā)inda”);

          7.推薦黎洪明的ejb3實(shí)例教程或精通ejb3.0

          posted @ 2008-12-09 12:46 go4it 閱讀(99) | 評(píng)論 (0)編輯 收藏

          主站蜘蛛池模板: 承德县| 高唐县| 肃南| 贡嘎县| 焉耆| 田林县| 黄骅市| 杭州市| 来安县| 漯河市| 巨鹿县| 铜陵市| 沂源县| 曲沃县| 微山县| 锡林郭勒盟| 万载县| 鸡东县| 海淀区| 峨山| 乐昌市| 太仓市| 蒙自县| 彭州市| 通州市| 迭部县| 荣成市| 台东市| 武鸣县| 丹东市| 凤山县| 广南县| 呼和浩特市| 浪卡子县| 开平市| 淳化县| 宁夏| 金昌市| 秀山| 额济纳旗| 喀喇沁旗|