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

  • 相关阅读:
    1058 A+B in Hogwarts (20)
    1036. Boys vs Girls (25)
    1035 Password (20)
    1027 Colors in Mars (20)
    1009. Product of Polynomials (25)
    1006. Sign In and Sign Out
    1005 Spell It Right (20)
    1046 Shortest Distance (20)
    ViewPager页面滑动,滑动到最后一页,再往后滑动则执行一个事件
    IIS7.0上传文件限制的解决方法
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/5263213.html
Copyright © 2011-2022 走看看