[原创]认识EJB与EJB的基本使用_Android, Python及开发编程讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  Android, Python及开发编程讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 2147 | 回复: 0   主题: [原创]认识EJB与EJB的基本使用        下一篇 
    本主题由 koei123 于 2015-6-2 8:56:16 移动
tianyuan.liu
注册用户
等级:上尉
经验:766
发帖:33
精华:0
注册:1970-1-1
状态:离线
发送短消息息给tianyuan.liu 加好友    发送短消息息给tianyuan.liu 发消息
发表于: IP:您无权察看 2015-1-13 15:38:47 | [全部帖] [楼主帖] 楼主

EJB (Enterprise JavaBean)是J2EE(javaEE)的一部分,定义了一个用于开发基于组件的企业多重应用程序的标准。tomcat并不支持EJB,但是WebLogic与Jboss支持EJB。EJB基于RMI(Remote Method Invocation)远程方法调用技术,实现分布式计算。

EJB容器可以接受三类EJB

     会话Bean(Session Beans)
        无状态会话Bean(Stateless Session Beans)
        有状态会话Bean(Stateful Session Beans)
    实体Bean(Entity Beans)
    消息驱动Bean(Message Driven Beans ,MDBs)

无状态会话Bean是一类不包含状态信息的分布式对象,允许来自数个客户端的并发存取。实例变量的内容在前后数次呼出中不被保留(确切地说是不保证保留)。由于不必控制与用户间的对话信息而减少了开销,无状态会话Bean不像有状态会话Bean那样具有资源集约性。举例来说,一个发送邮件的EJB就可被设计为一个无状态会话Bean。在整个会话期,用户只向服务器提交一个动作:发送指定邮件到指定地址。(称为开关行为)

有状态会话Bean是包含状态的分布式对象,即是说,贯穿整个会话它们都要保有客户端信息。举例而言,在一个网上商店进行实施结账很可能就需要一个有状态会话Bean,因为结账是一个多步动作,服务器端必须可以随时了解到用户已经进行到了哪一步。此外,尽管有状态会话Bean的状态信息可被保持,但始终只能同是由一个用户来访问之。

实体Bean是含有持久化状态的分布式对象。这个持久化状态的管理既可以交给Bean自身(Bean-Managed Persistence,BMP),也可以托付于外部机制(Container-Managed Persistence,CMP)。

消息驱动Bean是支持异步行为的分布式对象。它们并不对请求进行当即响应。比方说,某网站用户点击“请通知我更新信息”按钮,将会触发某个MDB将这名用户加入到数据库的希望获得更新信息用户列表中。这个动作就是一个异步的消息驱动过程,因为用户不必等待当时会返回某个结果。MDB的消息源来自Java消息服务(JMS)提供的消息队列或消息主题。自EJB 2.0规范起,JMS被加入进来以允许在容器内部实施事件驱动处理。与其他EJB不同,MDB不存在一个用户视图(如需要用户引用的远程接口),用户也不能通过资源定位获得一个MDB实例。MDB只在后台监听消息源并实施自动处理。

EJB简单上手

在Eclipse中新建一个基于WebLogic环境的dynamic web app。

1.新建一个接口Test.java,代码如下:

package com.test.EJB;
public interface Test {
      public String sayHello(String name);
}


2.实现接口TestBean.java

package com.test.EJB.impl;
import javax.ejb.Remote;
import javax.ejb.Stateless;
import com.test.EJB.Test;
@Stateless(mappedName = "TestBean")
@Remote({Test.class})
public class TestBean implements Test {
      @Override
      public String sayHello(String name) {
            // TODO Auto-generated method stub
            return name + ("EJB");
      }
}
@Stateless(mappedName = "TestBean")表示无状态session bean,并且指明JNDI可以通过TestBean找到此bean
@Remote({Test.class})  指明此bean的remote接口


启动WebLogic,到WebLogic控制台查看jndi树可以看到mappedName 对应的EJB。

在webcontent目录下新建index.jsp对EJB进行调用,代码如下:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="javax.naming.InitialContext,javax.naming.NamingException,weblogic.jndi.WLInitialContextFactory,com.test.EJB.Test" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
java.util.Properties prop = new java.util.Properties();
prop.setProperty(javax.naming.Context.INITIAL_CONTEXT_FACTORY,
WLInitialContextFactory.class.getName());
prop.setProperty(javax.naming.Context.PROVIDER_URL,
"t3://localhost:7001");
InitialContext ic = new InitialContext(prop);
Test h = (Test) ic
.lookup("TestBean#com.test.EJB.Test");
System.out.println(h.sayHello("Hello"));
out.println(h.sayHello("Hello"));
%>
</body>
</html>


页面显示HelloEJB。通过JNDI找到EJB,并调用方法sayHello()。

该贴由koei123转至本版2015-6-2 8:56:16




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论