zoukankan      html  css  js  c++  java
  • EJB开发第一个无状态会话bean、开发EJBclient

    开发第一个无状态会话bean

    EJB中的三中bean

    会话BeanSession Bean

    负责与client交互,是编写业务逻辑的地方。在会话bean中能够通过JDBC直接操作数据库。但大多数情况下都是通过实体bean来完毕对数据库的操作。

     

    实体BeanEntity Bean

    它实际上属于java持久化规范(JPA)里的技术,JPA的出现主要是为了简化现有的持久化开发工作和整合ORM技术,结束如今HibernateTopLinkORM框架各自为营的局面。

     

    消息驱动BeanMessageDriven Bean

             它是专门用于异步处理Java消息的组件。

    具有处理大量并发消息的能力。

     

    会话bean

             无状态会话bean

    寻常我们使用最多的是无状态bean,由于它的bean实例可供多个用户使用,所以它的性能比有状态bean高。正由于一个bean实例被多个用户使用。那么前一个用户设置的值可能被后一个用户所改动,所以它无法正确保存某个用户设置的值,因此是无状态的。

     

             有状态会话bean

    有状态会话bean寻常使用的并不多,由于它的一个bean实例仅仅供一个用户使用,所以性能开销比較大,正由于它的实例仅仅被一个用户使用。那么用户设置的值是不会被其它用户所改动的,所以能够正确保存用户设置的值,因此是有状态的。

     

    开发一个无状态会话bean

             开发工具:MyEclipse

             开发EJB依赖的jar文件:Jboss安装路径下的client下,通常把所以的jar加入到项目。

    结构:

             接口(能够是远程接口或本地接口)

             实现类

    步骤:

    1.新建一个JavaProject:HelloWorld

    2.导入全部的client的jar包

    3.新建一个接口HelloWorld 在cn.hqu.ejb3下

    加入方法 String sayHello(String name);

    4.创建实现类:

    新建一个类HelloWorldBean,实现HelloWorld接口。在包 cn.hqu.ejb3.impl;

    实现方法里面:

    return name+"说:你好!

    ";

    5.把这两个类变成ejb3

    HelloWorldBean增加注解 @Stateless

    指定这个ejb是一个无状态会话bean;

    指定这个接口是一个远程接口:(默认是本地接口)

    在HelloWorldBean增加注解@Remote(HelloWorld.class) 。

    Ejb开发完毕

    @Stateless

    @Remote(HelloWorld.class)

    public class HelloWorldBean implements HelloWorld {

        @Override

        public String sayHello(String name) {

            // TODO Auto-generated method stub

            return name+"说:你好。";

        }

    }

    6.进行公布:

    打成jar包。能够通过eclipse打包或者通过ant打包。

    这里使用MyEclipse,右击项目选择Export→jar file 。

    公布:先启动JBoss。复制打包好的jar复制到JBoss的server/default/deploy下,这样就完毕ejb的部署;这样就公布成功了;会话bean开发完了

    开发EJB的client

    Ejb在软件分层结构上,属于业务层。通常要被client调用,这里用Java类做ejbclient。

    新建EJBClient 在包cn.hqu.test,在main里面编写EJB的调用代码:

     

    package cn.hqu.test;
    
    import java.util.Properties;
    
    import javax.naming.InitialContext;
    import javax.naming.NamingException;
    
    import cn.hqu.ejb3.HelloWorld;
    
    public class EJBClient {
    
    	/**
    	 * @param args
    	 */
    	public static void main(String[] args) {
    		Properties pros = new Properties();
    		pros.setProperty("java.naming.factory.initial",
    				"org.jnp.interfaces.NamingContextFactory");
    		pros.setProperty("java.naming.provider.url", "localhost:1099");
    
    		try {
    			InitialContext ctx = new InitialContext(pros);
    			HelloWorld helloworld = (HelloWorld) ctx
    					.lookup("HelloWorldBean/remote");
    			System.out.println(helloworld.sayHello("苏志达"));
    		} catch (NamingException e) {
    			e.printStackTrace();
    		}
    	}
    
    }
    

    运行client(main方法);调用成功。

    代码含义:client要调用ejb。要通过JNDI去寻找EJB的xx代理对象,JNDI是一套用来訪问命名server的API,也是JavaEE里面的规范。

    设置JNDI訪问环境信息

    如同数据库一样。依据訪问命名server不同,为上下文设置的驱动类和URL也是不同的。如以下是訪问Sun应用server的上下文信息:


    假设client执行在应用server内,我们不须要为InitlalContext设置应用server的上下文信息,也不建议设置。由于应用server启动时会把JNDI驱动类等上下文信息加入进系统属性,创建InitialContext对象时假设没有指定Properties參数,InitialContext内部会调用System.getProperty()方法从系统属性里获得必要的上下文信息。对本样例而言。能够省略传入的props參数,在实际应用中假设给InitialContext设置了參数,反而会带来不可移植的问题。

             注:创建InitialContext对象时假设没有指定Properties參数。InitialContext还会在classpath下寻找jndi.properties文件,并从该文件里载入应用server的上下文信息,这样避免了硬编码为InitialContext设置Properties參数。

    InitialContext ctx = newInitialContext();

    jndi.properties的配置例如以下:

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

    java.naming.provider.url=localhost:1099

    提示:这里编写的client程序全然能够部署在另外一台计算机上。仅仅须要改动当中的连接serverIP地址和启动Jboss时绑定对应IP地址就可以。这正是EJB的远程调用特性。在第19行返回的helloworld实例对象并非我们在server编写的HelloWorldBean,而是一个也实现了HelloWorld接口的代理对象,这个代理对象终于远程调用我们自己编写的HelloWorldBean,在19后增加例如以下代码,就可以看到这个代理对象的类名:

    System.out.println(helloworld.getClass().getName())

           Jboss默认生成的JNDI名称

             当EJB公布到Jboss时,假设我们没有为它指定全局JNDI名称或者改动过其默认EJB名称,Jboss就会依照默认的命名规则为EJB生成全局JNDI名称,默认是命名规则例如以下:

             本地接口:EAR-FILE-BASE-NAME/EJB-CLASS-NAME/local

             远程接口:EAR-FILE-BASE-NAME/EJB-CLASS-NAME/remote

            

             EAR-FILE-BASE-NAME为ear文件的名称,EJB-CLASS-NAME为EJB的非限定类名。

    例:把HelloWorld应用作为EJB模块打包进名为HelloWorld.ear的企业应用文件,它的远程接口的JNDI名称是:HelloWorld/HelloWorldBean/remote

             假设把EJB应用打包成后缀为*.jar的模块文件,默认全局JNDI名称是

             本地接口:EJB-CLASS-NAME/local

             远程接口:EJB-CLASS-NAME/remote

    例:把HelloWorld应用打包成HelloWorld.jar文件,它的远程接口的JNDI名称是:

    HelloWorldBean/remote

    代码:http://pan.baidu.com/s/1dDckCXN

  • 相关阅读:
    Linux初始root密码设置
    ubuntu上的附件-终端和用快捷键ctrl+alt+f1 有啥区别
    分区工具PQ
    饮品DIY
    烘焙学习
    育儿所悟、所感、所想
    Linux netstat命令详解
    sharepoint环境安装
    python os模块
    java泛型
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/5263213.html
Copyright © 2011-2022 走看看