EJB系列(二)---开发

    上篇对EJB进行了简单的介绍:EJB系列(一)---简介

    本篇,我们来做一个小demo简单介绍EJB开发的步骤。

    开发环境:eclipse +Jboss 6.2 + jdk 1.8

    开发环境搭建好之后,进入正式的编程阶段。

服务器端

(1)新建一个EJB Project项目


(2)定义一个远程接口

    可以在接口上,加上@Remote。也可以在接口的实现类上加上这个注解。(@Local表示本地)

<span style="font-family:KaiTi_GB2312;font-size:18px;"><span style="font-family:KaiTi_GB2312;font-size:18px;">package com.tgb.ejb;

public interface FirstEjb {
	public String saySomething(String name);
}</span></span>

(3)定义一个接口的实现类

    @Stateless表示的是无状态会话bean,@Statefull表示的是有状态会话bean,区别是前者比后者效率高,但是不能保留后者那种在会话中的数据。

<span style="font-family:KaiTi_GB2312;font-size:18px;"><span style="font-family:KaiTi_GB2312;font-size:18px;">package com.tgb.ejb;

import javax.ejb.Remote;
import javax.ejb.Stateless;
import javax.jws.WebMethod;
import javax.jws.WebService;

@Stateless
@Remote
public class FirstEjbBean implements FirstEjb {
	@Override
	public String saySomething(String name) {
		return "你好, " + name;
	}
}
</span></span>

(4)将其部署到jboss上。

客户端

(1) 新建一个Java Project项目

(2)引入%jboss_home%/client/下的jar包

(3)编写测试类

<span style="font-family:KaiTi_GB2312;font-size:18px;"><span style="font-family:KaiTi_GB2312;font-size:18px;">package com.tgb.ejb;

import javax.naming.InitialContext;

public class FirstEjbClient {

        //测试类
	public static void main(String[] args) throws Exception {
		//初始化上下文-----不同的应用服务器初始化上下文的工厂类是不同的,协议也可能不一样。
		InitialContext ctx = new InitialContext();
		FirstEjb ejb = (FirstEjb)ctx.lookup("FirstEjbBean/remote");
		String s = ejb.saySomething("baby");
		System.out.println(s);
	}
}
</span></span>
    InitialContext主要方法的使用:

    void bind(String name,Object object);    //将名称绑定到对象。如果已经存在,则抛出异常。

    void rebind(String name,Object object);    //将名称绑定到对象。如果对象存在,则重写所有绑定

    void rename(String oldName,String newName);    //把某一个已经绑定的旧名称改成新名称

    void unbind(String name);    //取消指定对象的绑定

    Object lookup(String name);    //查找指定对象

    Jboss下配置JNDI名称

   当EJB发布到Jboss时,如果没有为它指定全局的JNDI名称或修改过其默认EJB名称,Jboss就会按照默认的命名规则为EJB生成全局JNDI名称,默认的命名规则如下:

  如果把EJB作为模块打包进后缀为*.ear的JavaEE企业应用文件,默认的全局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

(4)设置JNDI访问环境信息

    JNDI为JavaEE平台提供了一个通过名字查找网络中一切对象的标准机制,是一套为开发者提供通过名字方便查找用户、机器、网络、对象和服务的Java API,JNDI实现了EJB对象位置的透明性,客户端只要能方位JNDI服务,便可以调用EJB服务。设置JNDI访问环境信息,主要是设置JNDI驱动的类名(java.naming.factory.initial)和命名服务提供者的URL(java.naming.provider.url):

    方式一:设置系统属性,此部分需要写在测试类中。

<span style="font-family:KaiTi_GB2312;font-size:18px;"><span style="font-family:KaiTi_GB2312;font-size:18px;">Properties props=new Properties();

props.setProperty("java.naming.factory.initial","org.jnp.interfaces.NamingContextFactory");  
    //可以将"java.naming.factory.initial"替换成Context.INITIAL_CONTEXT_FACTORY,环境属性名,用于指定InitialContext工厂(JNDI驱动),
    //它雷速与JDBC指定数据库驱动类,因为本例子连接的是JbossNS,所以使用Jboss提供的驱动类:org.jnp.interfaces.NamingContextFactory

props.setProperty("java.naming.provider.url","localhost:1009");         //”localhost:1009”也可以写成”jnp://127.0.0.1:1009”

    //可以将"java.naming.provider.url"替换成Context.PROVIDER_URL,环境属性名,包含提供命名服务的主机地址和端口号。它类似于JDBC指定数据库的连接URL。
    //连接到JbossNS的URL格式为:jnp://host:port,改URL的“jnp”部分是指使用的协议,Jboss使用的是基于Socket/RMI的协议。
    //Host为主机的地址,port为JNDI服务的端口。除了host之外,其他部分都是可以选择写的。

props.setProperty("java.naming.factory.url.pkgs","org.jboss.naming:org.jnp.interfaces");</span></span>

    方式二:src下添加jndi.properties

<span style="font-family:KaiTi_GB2312;font-size:18px;"><span style="font-family:KaiTi_GB2312;font-size:18px;">java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory

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

java.naming.provider.url=jnp://localhost:1009</span></span>

    方式三:通过命令行设置。

服务器端与客户端交互

    (1)将服务器端的接口导出成jar包。选中接口---右键----选择“Export....”

    (2)将服务器端导出的jar包,引入到客户端。

运行测试,客户端就可以成功调用服务器端了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Files contained in javax.ejb.jar: META-INF/MANIFEST.MF javax.ejb.AccessLocalException.class javax.ejb.AccessTimeout.class javax.ejb.ActivationConfigProperty.class javax.ejb.AfterBegin.class javax.ejb.AfterCompletion.class javax.ejb.ApplicationException.class javax.ejb.Asynchronous.class javax.ejb.AsyncResult.class javax.ejb.BeforeCompletion.class javax.ejb.ConcurrencyManagement.class javax.ejb.ConcurrencyManagementType.class javax.ejb.ConcurrentAccessException.class javax.ejb.ConcurrentAccessTimeoutException.class javax.ejb.CreateException.class javax.ejb.DependsOn.class javax.ejb.DuplicateKeyException.class javax.ejb.EJB.class javax.ejb.EJBAccessException.class javax.ejb.EJBContext.class javax.ejb.EJBException.class javax.ejb.EJBHome.class javax.ejb.EJBLocalHome.class javax.ejb.EJBLocalObject.class javax.ejb.EJBMetaData.class javax.ejb.EJBObject.class javax.ejb.EJBs.class javax.ejb.EJBTransactionRequiredException.class javax.ejb.EJBTransactionRolledbackException.class javax.ejb.embeddable.EJBContainer.class javax.ejb.EnterpriseBean.class javax.ejb.EntityBean.class javax.ejb.EntityContext.class javax.ejb.FinderException.class javax.ejb.Handle.class javax.ejb.HomeHandle.class javax.ejb.IllegalLoopbackException.class javax.ejb.Init.class javax.ejb.Local.class javax.ejb.LocalBean.class javax.ejb.LocalHome.class javax.ejb.Lock.class javax.ejb.LockType.class javax.ejb.MessageDriven.class javax.ejb.MessageDrivenBean.class javax.ejb.MessageDrivenContext.class javax.ejb.NoMoreTimeoutsException.class javax.ejb.NoSuchEJBException.class javax.ejb.NoSuchEntityException.class javax.ejb.NoSuchObjectLocalException.class javax.ejb.ObjectNotFoundException.class javax.ejb.PostActivate.class javax.ejb.PrePassivate.class javax.ejb.Remote.class javax.ejb.RemoteHome.class javax.ejb.Remove.class javax.ejb.RemoveException.class javax.ejb.Schedule.class javax.ejb.ScheduleExpression.class javax.ejb.Schedules.class javax.ejb.SessionBean.class javax.ejb.SessionContext.class javax.ejb.SessionSynchronization.class javax.ejb.Singleton.class javax.ejb.spi.EJBContainerProvider.class javax.ejb.spi.HandleDelegate.class javax.ejb.Startup.class javax.ejb.Stateful.class javax.ejb.StatefulTimeout.class javax.ejb.Stateless.class javax.ejb.TimedObject.class javax.ejb.Timeout.class javax.ejb.Timer.class javax.ejb.TimerConfig.class javax.ejb.TimerHandle.class javax.ejb.TimerService.class javax.ejb.TransactionAttribute.class javax.ejb.TransactionAttributeType.class javax.ejb.TransactionManagement.class javax.ejb.TransactionManagementType.class javax.ejb.TransactionRequiredLocalException.class javax.ejb.TransactionRolledbackLocalException.class javax.interceptor.AroundInvoke.class javax.interceptor.AroundTimeout.class javax.interceptor.ExcludeClassInterceptors.class javax.interceptor.ExcludeDefaultInterceptors.class javax.interceptor.Interceptor.class javax.interceptor.InterceptorBinding.class javax.interceptor.Interceptors.class javax.interceptor.InvocationContext.class javax.xml.rpc.handler.GenericHandler.class javax.xml.rpc.handler.Handler.class javax.xml.rpc.handler.HandlerChain.class javax.xml.rpc.handler.HandlerInfo.class javax.xml.rpc.handler.HandlerRegistry.class javax.xml.rpc.handler.MessageContext.class

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值