EJB3 学习笔记二

EJB中包含有三种bean

会话bean   (session bean)

与客户端交互,编写业务逻辑,可以通过jdbc直接操作数据库,但通常用通过实体bean来操作数据库

无状态会话bean 无活保存某一用户的值

有状态会话bean

实体bean   (entity bean)

属于java持久化规范里的(jpa)技术,

消息驱动bean (message-driven bean)

专门用于异步处理消息的组件,有处理大量并发消息的能力

开发第一个无状态会话bean,示例代码如下

将web 应用打包

jar cvf 应用名.war

ant打包

===============================================================================

session beans(会话bean)

stateless(无状态的)slsb

  示例代码如下

/**

 * 包含所有业务的接口

 *

 *@time 11:29:51 PM

 *@author retacn yue

 *@Email zhenhuayue@sina.com

 */

public interface HelloWorld {

         publicString sayHello(String name);

}

/**

 * 无状态会话bean

 *

 * 就是一个简单的pojo

 *

 *@time 11:26:54 PM

 *@author retacn yue

 *@Email zhenhuayue@sina.com

 */

// 声明这是一个无状态会话bean

@Stateless

// 声明这个bean的remote接口

@Remote( { HelloWorld.class })

public class HelloWorldBean implementsHelloWorld {

         publicString sayHello(String name) {

                   returnname + "hello world!";

         }

}

开发一个EJB客户端示例代码如下:

需要添加binclientjboss-client.jar

/**

 *Copyright (C) 2016

 *

 *FileName:EJBClient.java

 *

 *Author:<a href="mailto:zhenhuayue@sina.com">Retacn</a>

 *

 *CreateTime: 2016-7-17

 */

// Package Information

package cn.yue.ejb.test;

import cn.yue.ejb.bean.HelloWorld;

import java.util.Hashtable;

import java.util.Properties;

import javax.naming.Context;

import javax.naming.InitialContext;

import javax.naming.NamingException;

public class EJBClient {

   /**

    * @param args

    * @throws NamingException

    */

   public static void main(String[] args) throws NamingException {

       /*

        * 7.1之前的实现方法 try { 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; ctx = new

        * InitialContext(props); HelloWorld helloworld = (HelloWorld)

        * ctx.lookup("HelloWorldBean/romote");

        * System.out.println(helloworld.SayHello("retacn")); } catch

        * (NamingException e) { e.printStackTrace(); }

        */

       HelloWorld helloWorld = lookupRemoteStatelessEjbBean();

       System.out.println(helloWorld);

       System.out.println(helloWorld.SayHello("retacn"));

    }

   /**

    * @return

    * @throws NamingException

    */

   private static HelloWorld lookupRemoteStatelessEjbBean() throwsNamingException {

       final Hashtable jndiProperties = new Hashtable();

       jndiProperties.put(Context.URL_PKG_PREFIXES,"org.jboss.ejb.client.naming");

       final Context context = new InitialContext(jndiProperties);

       // 如果服务器布署的是.ear包,则appname为.ear之后的包名,如果的war或是jar包,appName可以为空,如果是有状态bean,在namespace后面添加?stateful

       final String appName = "";

       final String moduleName = "HelloWorldEJB";

       final String distinctName = "";

       final String beanName = "HelloWorldBean";

       final String viewClassName = HelloWorld.class.getName();

       final String namespace = "ejb:" + appName + "/" +moduleName + "/" + distinctName + "/"

                + beanName + "!" +viewClassName;

       System.out.println("namespace:" + namespace);

       return (HelloWorld) context.lookup(namespace);

    }

}

在客户端测试程序的src目录下添加jboss-ejb-client.properties示例代码如下:

endpoint.name=client-endpoint

remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED=false

remote.connections=default

remote.connection.default.host=localhost

remote.connection.default.port=4447

remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS=false

remote.connection.default.username=sa

remote.connection.default.password=sa

运行结果如下:

namespace:ejb:/HelloWorldEJB//HelloWorldBean!cn.yue.ejb.bean.HelloWorld

七月 18, 2016 11:16:30 上午org.jboss.ejb.client.EJBClient <clinit>

INFO: JBoss EJB Client version1.0.5.Final

Proxy for remote EJBStatelessEJBLocator{appName='', moduleName='HelloWorldEJB', distinctName='',beanName='HelloWorldBean', view='interface cn.yue.ejb.bean.HelloWorld'}

七月 18, 2016 11:16:30 上午org.xnio.Xnio <clinit>

INFO: XNIO Version 3.0.3.GA

七月 18, 2016 11:16:30 上午org.xnio.nio.NioXnio <clinit>

INFO: XNIO NIO Implementation Version3.0.3.GA

七月 18, 2016 11:16:30 上午 org.jboss.remoting3.EndpointImpl<clinit>

INFO: JBoss Remoting version 3.2.3.GA

七月 18, 2016 11:16:31 上午org.jboss.ejb.client.remoting.VersionReceiver handleMessage

INFO: Received server version 1 andmarshalling strategies [river]

七月 18, 2016 11:16:31 上午 org.jboss.ejb.client.remoting.RemotingConnectionEJBReceiverassociate

INFO: Successful version handshakecompleted for receiver contextEJBReceiverContext{clientContext=org.jboss.ejb.client.EJBClientContext@514577,receiver=Remoting connection EJB receiver [connection=Remoting connection<278a47>,channel=jboss.ejb,nodename=retacn]} on channel Channel IDc4627bd2 (outbound) of Remoting connection 0198339a to localhost/127.0.0.1:4447

七月 18, 2016 11:16:31 上午org.jboss.ejb.client.remoting.ChannelAssociation$ResponseReceiver handleMessage

WARN: Unsupported message received withheader 0xffffffff

retacn say:hello world! this is myfirst EJB test!

查看ejb的JNDI,可以通过以下方式:

打开http://localhost:9990/,选择profile页签,选择container下的naming,选择页面中的java:global就可以看到我们的应用

把jboss集成到eclipse中,需要下载插件

使用ant打包 ejb项目,示例代码如下:

<?xml version="1.0"encoding="UTF-8"?>

<projectname="HelloWorldEJB"basedir=".">

 

<!--变量定义-->

       <propertyname="src.dir"value="${basedir}src"/>

<!--环境变量-->

       <propertyenvironment="env"/>

       <propertyname="jboss.home"value="${env.JBOSS_HOME}"/>

       <propertyname="jboss.server.config"value="default"/>

       <propertyname="build.dir"value="${basedir}WebContentWEB-INFclasses"/>

       <propertyname="export.dir"value="${basedir}WebContent"/>

 

<!--添加jar包-->

       <pathid="build.classpath">

              <filesetdir="${jboss.home}inclient">

                     <includename="*.jar"/>

              </fileset>

              <pathelementlocation="${build.dir}"/>

       </path>

 

<!--初始化工作-->

       <targetname="prepare">

              <deletedir="${build.dir}"/>

              <mkdirdir="${build.dir}"/>

       </target>

<!--编 译-->

       <targetname="compile"depends="prepare"description="编译">

              <javacsrcdir="${src.dir}"destdir="${build.dir}"includeantruntime="false">

                     <classpathrefid="build.classpath"/>

              </javac>

              <copyfile="${src.dir}jboss-ejb-client.properties"todir="${build.dir}"/>

       </target>

 

<!--应用打包-->

       <targetname="ejbwar"depends="compile"description="创建EJB发布包">

              <wardestfile="${basedir}${ant.project.name}.war">

                     <filesetdir="${export.dir}">

                            <includename="**/*"/>

                     </fileset>

              </war>

       </target>

      

<!--发布应用-->

       <targetname="deploy"depends="ejbwar"description="发布EJB">

          <copyfile="${basedir}${ant.project.name}.war"todir="${jboss.home}standalonedeployments"/>

       </target>

      

<!--卸载应用-->

       <targetname="undeploy"description="卸载ejb">

              <deletefile="${jboss.home}standalonedeployments${ant.project.name}.war"/>

       </target>

 

</project>

原文地址:https://www.cnblogs.com/retacn-yue/p/6194216.html