go4it

          EJB--SEAM

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            11 Posts :: 0 Stories :: 0 Comments :: 0 Trackbacks

          2008年12月9日 #

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

          2.@Remote/@Local可以定義在接口,也可以在實現類定義。

          3.如果一個EJB實現了多個接口,必須指定那些接口是remote,哪些是local。

          4.另一種定義

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

          當屬性為value而且只定義一個屬性時,value可以省略只寫值。

          5.直接在接口里面定義,那么實現類就不用再定義了。

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

          1.不需要jndi配置,直接new InitialContext()即可,因為本地訪問服務器已經有相關配置了。

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

            如果把Jbossall-client.jar也拷到本地客戶端來,則會出錯。因為在部署web項目時,myeclipse會將jar包部署到web項目下Web-root\web-inf\lib文件夾下。

          引起重復出現錯誤。

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

          1.遠程客戶端:傳值,對象必須序列化,服務器對對象的修改不會在客戶端體現。

          2.本地客戶端:

           (1)創建一個web項目,與jboss部署在同一個JVM當中。

           (2)添加服務器端項目的依賴或手動添加接口的jar包

           (3)在index.jsp改編碼。

              本地客戶端也可以使用遠程調用方式:

          <% 
              
          		  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已經創建。"+u.getId());
             %>

          本地客戶端的本地調用方式沒成功:

          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已經創建。"+u.getId());
             %>

          有待以后多些見識解決或偶遇高人指點。

          不大清楚,本地調用還需要JNDI嗎?

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

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

            后來發現,原來是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() + "已經被成功保存!");
                  user.setId(13);
              }

          }

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

          image

          有狀態和無狀態的會話bean都在客戶端產生不同的代理實例

          image

          不同的是在服務器端,有狀態的每次lookup都是新的獨立的bean,而無狀態的是單例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);
          
          		  //第一次會話
          		  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());
          		 
          		  //第二次會話
          		  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));
          		 
          	}
          
          }

          第一次運行結果

          剛開始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) | 評論 (0)編輯 收藏

          1.配置JBOSS服務器

          2.new EJB project創建項目

          3.創建EJB—》new interface,然后new class實現類,xxxBean命名。

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

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

          6.開發EJB客戶端:

            (1)new java project

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

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

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

             (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)運行客戶端。

           

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

                    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) | 評論 (0)編輯 收藏

          1.企業bean

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

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

                對象的狀態由它的實例變量的值決定的。

               有狀態session bean:可以區分不同的客戶端,并保持他們的信息。主要是根據jsessionid來辨認不同的客戶端并維護他們的狀態。

             stateful session bean 遠程調用的時候,客戶端得到的是一個客戶端代理對象,不同的客戶端獲得不同的實例(同時分配一個令牌)。通過令牌來區分不同的客戶端。每次查找服務器新創建一個給客戶端。

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

             (2)message driven bean 基于JMS

          2.實體bean

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

          在EJB3中都是CMP。

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

          1.遠程客戶端:客戶端和它調用的EJB對象不在同一個JVM進程當中。

          2.本地客戶端:客戶端和它調用的EJB對象在同一個(JBOSS)JVM進程當中。兩個EJB相互調用。

          3.webservice客戶端

           

          同一臺機器上一個JVM和JBOSS

          運行JBOSS需要一個JVM進程,運行一個java類需要JVM進程。

           

          遠程訪問:傳值方式:

          image

           

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

          image

          image

           

          webservice只能訪問無狀態會話bean的接口。

           

          遠程調用,客戶端的bean參數實際上是一個參數值的拷貝,對他修改不會影響到bean。但本地調用來說,對bean的參數是個引用,修改將影響bean。

           

          粗粒度的數據訪問:

          遠程調用速度比較慢,盡量減少方法的調用,盡可能在一個方法完成所以數據的傳輸。

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

          1.企業bean

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

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

                對象的狀態由它的實例變量的值決定的。

               有狀態session bean:可以區分不同的客戶端,并保持他們的信息。主要是根據jsessionid來辨認不同的客戶端并維護他們的狀態。

             stateful session bean 遠程調用的時候,客戶端得到的是一個客戶端代理對象,不同的客戶端獲得不同的實例(同時分配一個令牌)。通過令牌來區分不同的客戶端。每次查找服務器新創建一個給客戶端。

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

             (2)message driven bean 基于JMS

          2.實體bean

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

          在EJB3中都是CMP。

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

          今天終于做了一個ejb實例。

          工具:myeclipse6,jboss服務器。

           

          image

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

          2.new—ejb3 session bean

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

          (1)  配置數據源

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

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

          (3)在項目屬性里面添加額外的jar包:數據庫驅動和D:\DevelopTool\jboss-4.2.2.GA\client\jbossall-client.jar包

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

          主站蜘蛛池模板: 江口县| 武邑县| 夹江县| 红河县| 正定县| 昌都县| 陈巴尔虎旗| 鲜城| 含山县| 荔浦县| 区。| 溧阳市| 阳江市| 黄冈市| 汝阳县| 临邑县| 达州市| 成武县| 青岛市| 淮北市| 大石桥市| 右玉县| 蓬安县| 如东县| 白朗县| 南京市| 清原| 佛冈县| 乌鲁木齐县| 宜兰县| 东明县| 临夏县| 新建县| 县级市| 沽源县| 民县| 陆丰市| 永兴县| 凯里市| 西和县| 沿河|