![](/upload/picture/pic/39886/9b46ff40-6b70-33ba-ada7-4af23d726f0e.bmp)
理解:
1.当ejb的服务器端和客户端不再一个jvm上的时候,也就是部署在不同的机器上的时候,我们必须使用远程接口调用ejb,这时候我们就需要使用iiop协议,socket完成ejb客户端和ej服务器的通讯。
2.当ejb的服务器和ejb的客户端在同一个jvm的时候,也就是不数载相同的机器上的时候,我们可以使用ejb的本地接口来调用ejb,不需要走网络通信,直接在jvm级别完成ejb的调用。
3.我们在实际的开发过程中,要根据情况选择是通过本地接口调用ejb还是使用远程接口来调用ejb
实验:
我们现在模拟一个ejb,它有远程接口,也有本地接口,使用两个客户端调用这个ejb,一个在eclipse中写一个main方法,让它充当ejb的客户端,则他和ejb是不在一个jvm里,我们使用远程接口调用ejb,在写一个web工程,吧她部署在jboss中,她和ejb在一个jvm,或者容器中,我们使用 远程接口来调用ejb。
步骤:
1.ejb远程接口
package cn.com.xinli.ejb3;
public interface HelloWorld
{
public String sayHello(String name);
}
2.ejb本地接口 只需要继承远程接口即可
package cn.com.xinli.ejb3;
public interface HelloWorldLocal extends HelloWorld
{
}
3.实现
package cn.com.xinli.ejb3.impl;
import javax.ejb.Local;
import javax.ejb.Remote;
import javax.ejb.Stateful;
import cn.com.xinli.ejb3.HelloWorld;
import cn.com.xinli.ejb3.HelloWorldLocal;
/*表明这个ejb是无状态的会话bean*/
@Stateful
/*声明这个ejb的远程接口是HelloWorld,必须要写这个注解,否则调用的时候会报错*/
/*声明这个ejb的本地接口是HelloWorldLocal,必须要写这个注解,否则调用的时候会报错*/
@Local(HelloWorldLocal.class)
@Remote(HelloWorld.class)
public class HelloWorldBean implements HelloWorld,HelloWorldLocal
{
public String sayHello(String name)
{
return name+",你好,世界!我的ejb3的第一个例子!";
}
}
4.不再一个jvm的客户端
package cn.com.xinli.ejb3.test;
import java.util.Hashtable;
import java.util.Properties;
import javax.naming.Context;
import javax.naming.InitialContext;
import cn.com.xinli.ejb3.HelloWorld;
public class EjbClient
{
public static void main(String[] args)
{
Hashtable evn = new Hashtable();
evn.put(Context.PROVIDER_URL, "127.0.0.1:1099");
evn.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
// Properties properties=new Properties();
// properties.setProperty("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory");
// properties.setProperty("java.naming.provider.url", "localhost:1099");
try
{
InitialContext context=new InitialContext(evn);
/**
* ejb3比ejb2有可地方比较好,就是在jndi查找的时候不用我们在写ejb-jar.xml
* 只要我们按照jndi名字的查找规范就可以找到远程接口了
*
*/
HelloWorld helloword=(HelloWorld)context.lookup("HelloWorldBean/remote");
System.out.println(helloword.sayHello("huxl"));
} catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
5.和ejb在一个jvm的客户端,主要是建立一个web项目,然后他引用 ejb那个项目。部署在jboss里,写一个jsp页面,里面用<%%>的形式写一个客户端,完成本地接口的调用
test.jsp
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%@page import="javax.naming.InitialContext"%>
<%@page import="cn.com.xinli.ejb3.HelloWorldLocal"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert titlsse here</title>
</head>
<body>
<%
try
{
//由于是本地调用,不需要在设置本地的属性配置,它会从上下文中找jndi信息
//这样做也体现了跨平台,比如从jbss->websphere 属性配置是不一样的
InitialContext context=new InitialContext();
HelloWorldLocal helloword=(HelloWorldLocal)context.lookup("HelloWorldBean/local");
out.println(helloword.sayHello("huxl"));
} catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
%>
</body>
</html>
6.打包ejb,然后通过main方法调用远程接口成功,使用test.jsp调用本地接口也成功!
分享到:
相关推荐
(3):使用Session Bean的本地接口 9 (4):Session Bean中的注释方法 11 (5):使用配置文件发布Session Bean 12 (6):JBOSS中测试中的常用错误 13 (7):JBoss只能本地访问,不能通过ip远程访问解决办法 15 ...
- 编写接口:对于会话Bean,可能需要本地(Local)和远程(Remote)接口,供客户端调用。 - 打包部署:将Bean类、接口、配置文件打包成ejb-jar,并放入应用服务器的部署目录。 3. **EJB生命周期**: - 实例化:...
8.3.2 开发本地调用的无状态 Session Bean 311 8.4 发布Session Bean 314 8.4.1 打包EJB-JAR 315 8.4.2 Annotation与部署描述文件 315 8.5 开发有状态的Session Bean 318 8.6 Session Bean的生命周期 321 8.6.1 无...
1. **本地接口(Local Interfaces)**:EJB2.1引入了本地接口,使得同一个J2EE应用内部的组件可以直接调用EJB,无需通过远程接口,提高了效率。 2. **CMP2.0改进**:容器管理的持久化增强了对复杂关系的支持,比如...
6. **本地接口**:对于在同一JVM内的通信,EJB还可以提供本地接口,效率更高,本地接口不包含远程通信的额外开销。 7. **生命周期回调方法**:如`ejbCreate()`、`ejbPostConstruct()`、`ejbRemove()`等,这些方法在...
3. **接口和实现**:阐述Bean接口的设计原则,包括本地接口(Local Interface)和远程接口(Remote Interface),以及对应的实现类。 4. **持久化机制**:讲解实体Bean的持久化管理,包括CMP(Container-Managed ...
5. **远程接口**:讨论EJB的客户端调用机制,包括远程接口(Remote Interface)和本地接口(Local Interface),以及它们在分布式环境中的通信方式。 6. **ejb-jar.xml和web.xml**:解析这两个重要的XML配置文件,...
无状态Bean通常用于简单操作,有状态Bean保存了会话期间的信息。 - Entity Beans:代表数据库中的持久化对象,通常用于数据存储和检索。 - Message-Driven Beans:用于处理消息队列中的消息,常用于异步处理。 3....
第6章 JSP基础实例 6.1 第一个JSP程序—HelloWorld! 6.2 注释的使用 6.3 脚本元素 6.3.1 声明 6.3.2 表达式 6.3.3 脚本代码 6.4 page指令 6.4.1 import 6.4.2 session 6.4.3 错误处理 6.5 包含其他文件 ...
但通常情况下,由于Java Bean是被容器所创建(如Tomcat)的,所以Java Bean应具有一个无参的构造器,另外,通常Java Bean还要实现Serializable接口用于实现Bean的持久性。Java Bean实际上相当于微软COM模型中的本地...
但通常情况下,由于Java Bean是被容器所创建(如Tomcat)的,所以Java Bean应具有一个无参的构造器,另外,通常Java Bean还要实现Serializable接口用于实现Bean的持久性。Java Bean实际上相当于微软COM模型中的本地...
第6章 类与接口 6.1 类的构造器 6.1.1 构造器编写规则 6.2 类的继承规则 6.2.1 单线继承规则 6.2.2 包内部继承规则 6.2.3 逻辑包含继承规则 6.3 抽象类与接口 6.4 继承与组合的应用时机 6.5 接口与抽象类的应用时机 ...
这本书的第二版源码对于深入理解J2EE开发中的核心概念和技术具有极高的价值。以下是基于源码的一些关键知识点的详解: 1. **企业架构模式**: - **Session Façade(会话 façade)模式**:作为客户端和EJB组件...
18.2.2. 访问本地的无状态Session Bean(SLSB) 18.2.3. 访问远程SLSB 18.3. 使用Spring提供的辅助类实现EJB组件 19. JMS 19.1. 简介 19.2. 使用Spring JMS 19.2.1. JmsTemplate 19.2.2. 连接工厂 19.2.3. ...
第6章 JSP基础实例 6.1 第一个JSP程序—HelloWorld! 6.2 注释的使用 6.3 脚本元素 6.3.1 声明 6.3.2 表达式 6.3.3 脚本代码 6.4 page指令 6.4.1 import 6.4.2 session 6.4.3 错误处理 6.5 包含其他文件 ...
第6章 JSP基础实例 6.1 第一个JSP程序—HelloWorld! 6.2 注释的使用 6.3 脚本元素 6.3.1 声明 6.3.2 表达式 6.3.3 脚本代码 6.4 page指令 6.4.1 import 6.4.2 session 6.4.3 错误处理 6.5 包含其他文件 ...
6. **Enterprise JavaBeans 3.1 (EJB 3.1)**:EJB3.1简化了EJB的使用,支持无状态会话bean的本地接口,以及轻量级的Singleton bean,使得EJB更适合于微服务架构。 7. **Web服务**:JavaEE6增强了对WS-*规范的支持,...
第6章 JSP基础实例 6.1 第一个JSP程序—HelloWorld! 6.2 注释的使用 6.3 脚本元素 6.3.1 声明 6.3.2 表达式 6.3.3 脚本代码 6.4 page指令 6.4.1 import 6.4.2 session 6.4.3 错误处理 6.5 ...