java.探索EJB的使用

EJB、JPA、JMS等Java EE核心组件 EJB:提供了一种编写组件化、可重用的企业级应用程序的方法,支持 Session Beans、Entity Beans 和 Message-Driven Beans。JPA:提供了对象持久化机制,简化了数据库操作,支持实体映射、查询语言、事务管理和缓存机制。JMS:提供了消息传递服务,支持异步通信,适用于点对点和发布/订阅模式。通过掌握这些核心组件,可以更好地利用 Java EE 技术来构建高性能、高可靠性的企业级应用。 阅读详情
  • EJB到底是什么是这个
  • 看完才知道Enterprise Java Bean,其实就是进一步封装了RMI的一个技术,让编程人员可以更专注于功能的实现而不是其连接。
  • 引用原文中的一段话如下

通过RMI 技术,J2EE 将EJB 组件创建为远程对象,EJB 虽然用了RMI 技术,但是却只需要定义远程接口而无需生成他们的实现类,这样就将RMI 技术中的一些细节问题屏蔽了。但不管怎么说,EJB 的基础仍然是RMI,所以,如果你想了解EJB 的原理,只要把RMI的原理搞清楚就行了。你也就弄清楚了什么时候用EJB 什么时候不需要用EJB 了。


环境配置

  • jdk
  • eclipse
  • wildfly(以前叫Jboss)
    • 可以直接在eclipse的插件市场中下载
    • Help -> Eclipse Markerplace , 搜素“JBoss”并install

这里写图片描述

  • 不过这个还只是在eclipse开启wildfly服务的一个插件,真正的wildfly还要再下载
    • Window -> Show View -> Other里面找到Server文件夹下的Servers,打开Servers窗口
    • Servers窗口里右键New->Server,建立一个新的服务器,比如选择WildFly 8.X
    • 然后Next -> Next,然后就既不能Next也不能Finish了,因为你还没有装wildfly,此时页面里的Home Directory是空的,其右上角有个链接Download and install runtime,通过这个链接可以直接下载安装wildfly。
    • 装好wildfly后就可以顺利的新建server了。

这里写图片描述


关于wildfly

  • 我们写的EJB项目是要发布在一个ejb container里作为服务端程序运行
  • wildfly是一个ejb container
  • wildfly同时也是一个web container,可以发布web服务,也就是网页
  • EJB基于RMI,可以用来做分布式计算,因为调用的是服务端的方法,网络上只传输参数和结果

wildfly上发布ejb项目

  • eclipse中建立EJB项目
    • 在eclipse的插件市场里装好JBoss后,就可以直接建立EJB项目了
    • File -> New -> Other -> EJB -> EJB Project

这里写图片描述

  • 手动发布EJB项目
    • 假设正在编辑的EJB项目名为EJB
    • 首先右键项目,Export -> EJB EJB JAR files,生成一个名为EJB.jar的文件
    • 指定Destination,则可以在桌面看到生成的EJB.jar
    • 将这个EJB.jar文件放到“wildfly根目录/standalone/deployments”文件夹下
    • 运行“wildfly根目录/standalone/add-user.bat”来添加用户,根据提示操作即可
    • 运行“wildfly根目录/standalone/standalone.bat”即可以启动wildfly,其自动检测“wildfly根目录/standalone/deployments”目录下的jar文件并发布。
    • ejb程序这就开始运行了,其运行的输出结果也会显示在这个命令行界面上

这里写图片描述

  • 直接在eclipse里运行EJB Project
    • 右键项目Run as -> Run on server
    • 选择刚刚安装好的wildfly服务器
    • OK这就运行了,输出会显示在eclipse里的Console里,没有这个窗口就Window->Show View里去打开

这里写图片描述


Hello EJB

  • 惯例写一个Hello程序来体验学习
  • 整个结构如下

这里写图片描述

Server端HelloEJB项目

  • 项目建立参照前文eclipse中建立EJB项目
  • server包
    • IHello接口
    • HelloBean类实现了IHello接口
//IHello.java
package server;

public interface IHello {
    String say();
}
//Hello.java
package server;

import javax.ejb.Remote;
import javax.ejb.Stateless;

@Stateless
@Remote(IHello.class)
public class HelloBean implements IHello{
    @Override
    public String say() {
        return "Hello EJB";
    }

}
  • server端就这么点东西

client端HelloEJBClient项目

  • 这是建立的一个普通的java project
  • src目录下client包,一个client.java,代码具体后面内容再说
//client.java
package client;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

import server.IHello;

public class client {

    public static void main(String[] args) {
        try {
            java.util.Properties p = new java.util.Properties();
            p.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");
            Context context = new InitialContext(p);//NamingException

            IHello obj = (IHello) context.lookup("ejb:/HelloEJB/HelloBean!" + IHello.class.getName());

            String str = obj.say();
            System.out.println(str);

        } catch (NamingException e) {
            e.printStackTrace();
        }
    }

}
  • 因为需要用到HelloEJB项目里的server包下的IHello接口,所以
    把HelloEJB项目添加到HelloEJBClient的build path里
    • 右键HelloEJBClient项目 -> Build Path -> Configure Build Path
    • 找到Projects标签卡,Add里选中HelloEJB项目

这里写图片描述

  • 配置client端的属性
    • src目录下右键New->Other->General->File
    • 文件名为“jboss-ejb-client.properties”,eclipse会识别.properties
      这个后缀,即配置文件
    • 保证该文件位于src目录下
    • 添加如下内容

这里写图片描述

  • 添加client端依赖的jboss包,方法简而言之就是根据console的错误提示,缺失哪个包就到wildfly里面去找

这里写图片描述

  • 那么前提就是要运行client端来输出错误信息
    • 右键HelloEJB项目,Run As -> Run on Server启动服务端
    • 右键client.java,Run As -> Java Application

这里写图片描述

  • 最终确定下HelloEJBClient项目所需要的数目最少的包为下面这几个

这里写图片描述

  • 均位于“wildfly-8.2.1.Final\modules\system\layers\base\org\jboss”目录下

client端代码

java.util.Properties p = new java.util.Properties();
            p.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");
            Context context = new InitialContext(p);
  • 获取一个上下文Context
  • 那么什么是上下文呢,我也不知道
IHello obj = (IHello) context.lookup("ejb:/HelloEJB/HelloBean!" + IHello.class.getName());
  • 通过JDNI来获取远程对象
  • 关于lookup的参数格式,以stateful为例
// The JNDI lookup name for a stateful session bean has the syntax of:
// ejb:<appName>/<moduleName>/<distinctName>/<beanName>!<viewClassName>?stateful
//
// <appName> The application name is the name of the EAR that the EJB is deployed in
// (without the .ear). If the EJB JAR is not deployed in an EAR then this is
// blank. The app name can also be specified in the EAR's application.xml
//
// <moduleName> By the default the module name is the name of the EJB JAR file (without the
// .jar suffix). The module name might be overridden in the ejb-jar.xml
//
// <distinctName> : WildFly allows each deployment to have an (optional) distinct name.
// This example does not use this so leave it blank.
//
// <beanName> : The name of the session been to be invoked.
//
// <viewClassName>: The fully qualified classname of the remote interface. Must include
// the whole package name.
  • 至于stateless,就不加最后的“?stateful”即可
  • 关于stateful和stateless的javabean的区别,不赘述了

  • 其实通过server端启动的输出信息也可以看到发布的ejb的jndi

这里写图片描述

String str = obj.say();
System.out.println(str);
  • 通过IHello接口调用远程对象方法,获得返回信息str并输出到console
  • 注意在say()这个方法的实现里,即Hello.java里的这个方法的实现里的System.out.println()是会输出到server端的标准输出的,也就是server端启动时输出了一堆启动信息的那个控制台上

运行client端

  • 前提:server已上线

这里写图片描述


EJB探索未解之谜

  • 为什么eclipse在手动export引用了第三方类库(比如jdbc)的EJB Project的时候,并不会把我引用的类库也发布到生成的jar里面呢
  • 为什么我设置了EJB Project项目的Deploment Assembly(右键项目Properities),将我引用的第三方类库添加到了export里,还是看不到第三方类库的发布呢,相反仅仅在配置文件MANIFEST.MF的Class-Path里看到了类库的名字。坑爹呢!
  • 而我按照这个教程去修改了发布的EJB.jar包,结果毫无作用。。。。。。好气啊

这里写图片描述

  • 而我如果想让wildfly在启动的时候直接添加某个第三方类库又应该
    如何配置wildfly呢?tomcat可以直接放在lib目录下,可毕竟是tomcat是个web container,不同于我所需求的EJB项目

一个超笨的方法

  • 目前我有个需求,需要让server端的bean来访问数据库,通过jdbc来访问sql server。无第三方类库的EJB测试通过,唯独调用jdbc来连接sql server的时候报错
  • client报错

这里写图片描述

  • server报错
    这里写图片描述

  • 仔细看了看报的错

这里写图片描述

  • client端报空指针

这里写图片描述

这里写图片描述

  • 也就是说我没能拿到与数据库连接的connection,于是写个输出测试一下(DB跑由Bean调用在server端,输出也在server)

这里写图片描述

  • server端并没有输出这两句的任何一句,相反让我找到了这个

这里写图片描述

  • 好气啊,为什么找不到呢,我明明在eclipse里的build path添加了啊
  • 后来经过前文的尝试毫无作用,于是直接把我所需要的第三方类sqljdbc42.jar解压,com和microsoft两个文件夹直接添加到了EJB Project里,反正里面就是我需要的.class文件呗
  • 再发布果然运行成功

这里写图片描述

Java EE开发系列教程 - 使用EJB组件与JPA层交互 因为之前JPA原生 属性在Wildfly实现中并不总是生效,所以这里换成了Wildfly默认的JPA实现,即Hibernate。把属性改成了Hibernate专有的。 定义是否自动生成表, 意为如果表存在,则删除后再创建。 用来指定数据库厂商,以根据不同的数据库生成厂商相关的SQL语句。创建EJB模块=======EJB Service client 模块EJB可以用接口来定义此Bean是本地还是远程的。本地bean只能在部署应用的同一容器中访问,而远程bean可以被集群中的服务器所访问。现在,创建一个m 阅读详情

相关推荐

EJB体系结构之EJB容器

EJB容器 EJB容器(中间件)在EJB服务器环境中进行,EJB容器为EJB构件提供操作环境。        主要来说,EJB容器管理一下的系统级问题:      持久性(Persistence)      生命周期管理(Life Cycle Management)      安全性(Security)      事务管理(Transaction Management

好记性不如烂笔头--玲博小记 2197

EJB框架 详细介绍和注解的使用

一、EJB是什么? EJB是sun的JavaEE服务器端组件模型,是一种规范,设计目标与核心应用是部署分布式应用程序。 EJB2.0过于复杂,EJB3.0的推出减轻了开发人员进行底层开发的工作量,它取消或最小化了很多(以前这些是必须实现)回调方法的实现,并且降低了实体Bean及O/R映射模型的复杂性。 EJB大概是J2EE架构中唯一一个没有兑现其能够简单开发并提高生产力承诺的组件。 二...

L-N-H的博客 5001

8、Java EE开发:从EJB会话Bean到JPA实体的深入探索

本文深入探讨了Java EE开发中的EJB会话Bean和JPA实体的核心概念与实现。内容涵盖EJB的部署与客户端运行、会话Bean类型及生命周期管理,以及JPA实体的设计与持久化机制。同时详细介绍了JPA 2.2的新特性、实体生命周期、对象关系映射、查询语言(JPQL)和实际应用示例,帮助开发者掌握从会话Bean到JPA实体的完整开发流程。

ff678的博客 53

EJB是什么?

会话Bean(Session Bean):会话Bean用于管理与客户端之间的会话,有两种类型:状态ful会话Bean(Stateful Session Bean)和状态less会话Bean(Stateless Session Bean)。通过使用EJB,开发者可以实现更高效、更可靠的企业级应用,同时利用Java EE提供的其他功能(如事务管理、安全性、连接池等)来满足企业级应用的要求。实体Bean(Entity Bean):实体Bean用于表示数据持久化层的实体对象,可以映射到数据库中的表。

weixin_44943389的博客 2083

5、Java EE 与 EJB 技术:从旧世界到新世界的探索

本文深入探讨了 Java EE 平台中的关键技术,包括连接器、XML 解析与绑定、安全服务等,并详细介绍了 EJB 技术在 3.0 版本之前的编程和部署模型。通过示例代码和流程图,展示了前 EJB 3.0 的复杂性及其优缺点,同时展望了改进方向,如简化编程模型和优化部署过程。最后总结了技术演进的重要性及未来发展方向。

e3f4g5的博客 161

2、深入探索 EJB 技术:从基础到应用

本博客深入探讨了 EJB 技术的发展历程及其核心特性,详细介绍了会话 Bean 的类型及使用场景,并通过代码示例展示了如何开发、部署和测试会话 Bean。同时,博客还解析了实体与 Java 持久化 API 的相关内容,包括实体定义、生命周期管理、对象关系映射及 JPQL 查询语言的使用。通过本博客,读者可以全面掌握 EJB 和 JPA 的核心概念及实际应用技巧,适用于构建分布式、多用户的业务组件系统。

sea99的博客 77

什么是EJB?EJB详解

EJB到底是什么? 我们不禁要问,什么是"服务集群"?什么是"企业级开发"? 既然说了EJB 是为了"服务集群"和"企业级开发",那么,总得说说什么是所谓的"服务集群"和"企业级开发"吧!这个问题其实挺关键的,因为J2EE 中并没有说明白,也没有具体的指标或者事例告诉广大程序员什么时候用EJB 什么时候不用。于是大家都产生一些联想,认为EJB"分布式运算"指得是"负载均衡"提高系统的运行效率。然而,估计很多人都搞错了,这个"服务群集"和"分布式运算"并没有根本解决运行负载的问题,尤其是针对数据库的应用系

soulofball的博客 1万+

11、深入探索Java企业级开发技术

本博客深入探讨了Java企业级开发中的核心技术,包括EJB的类型和特性、与遗留系统的集成、J2EE平台及其关键API、OpenEJB开源容器的使用、Oracle9i AS容器的支持,以及多层应用的配置与组装。通过详细的技术分析和实际操作流程,为开发者提供了构建高效、稳定、可扩展的企业级应用的解决方案。同时展望了未来Java企业级开发技术的发展趋势。

v4w5x6的博客 95

Java文档阅读笔记-EJB Tutorial

目录 Introduction to EJB What is EJB Introduction to EJB EJB(Enterprise Java Bean)Java企业组建:用于开发分布式、健全、安全的企业级应用。 目前EJB3.2是最新版(这篇文档上说EJB3.2是最新版,我不知道现在【2019-09-23】EJB最新版本是多少),EJB3开发速度比EJB2快得多,原因...

IT1995的博客 4426

Java EJB技术实战入门与实例大全

本文还有配套的精品资源,点击获取 简介:Java EJB是Java EE的核心组成部分,用于创建企业级应用组件,支持事务处理、安全性和可伸缩性。本压缩包提供了各种实例,包括Session Beans、Message Driven Beans和Entity Beans的基本概念和实际应用代码,旨在帮助Java初学者理解并掌握EJB的使用。通过实例学习如何定义、部署EJB,并理...

weixin_42620563的博客 1086

EJB入门项目

里面是一个简单的基于IDEA+JBoss7.1.1实现的一个入门级EJB项目

EJB的简单介绍和使用

17.1 为什么需要EJB 要想知道为什么要使用EJB,就需要知道"面向服务"的概念。"面向服务",是软件开发过程中,异构环境下模块调用的一个比较重要的思想。同样,面向服务也只是一种设计思想,不是一种编程技术。由"面向服务"的思想,业界提出了"面向服务的体系结构(Service Oriented Architecture, SOA)"的概念。 用一个实际案例来引入"面向服务"的概念。在

风雨行的专栏 4678

【通过STM32CubeMx配置LWIP+FreeRTOS并通过Socket实现TCP_Client/Sever】

生成KEIL工程之后,勾选上use MicroLIB,代码上暂时无需做其他修改,编译下载。由于使用了FreeRTOS,因此系统的TimeBase Source修改成TIM1。在CubeMx上面选择NUCLEO-F429ZI开发板,并采用默认配置。打开电脑命令行,去ping这设置好的IP,能够实现Ping通。使能LWIP,并且先禁用DHCP,设置好静态IP。修改defaultTask的栈大小。Platform选择LAN8742。修改堆栈大小,生成工程。使能FreeRTOS。

qq_42617357的博客 6111

带你走进EJB--那些跟EJB容器相关的那些Java概念

最近在对EJB的相关内容进行总结,在总结的过程中发现对容器的概念并不是很理解,因为EJB本身就是一个容器,但是容器到底是用来做什么的?它跟我们之前所了解的组件,框架,包,类等都有什么关系?接下来主要是从容器入手来理解这些概念.        对象,类,包,模块,组件,容器,框架,这些java属于他们都有一个共同的特点:容纳.但是他们彼此之间又有什么关系和联系么? 对象(Object):

潛龍,勿用 9749

ANSA二次开发在线帮助:ANSA和μETA API文档

  为了方便大家学习ANSA二次开发,我将ANSA和μETA二次开发的官方文档整合到了我的个人网站CAECoder中,大家点击ANSA和μETA API官方帮助文档进行访问即可查看。   本站也将开展对ANSA和μETA API文档的翻译工作,请大家持续关注! ANSA和μETA API文档   ANSA和μETA脚本接口是一个应用程序编程接口(API),允许开发人员访问ANSA和μETA核心功能和数据。   ANSA和μETAAPI是Python编程语言的扩展。 Python Python简.

CAECoder 4320

Kettle下载与安装教程【保姆版】

Kettle简介 Kettle最早是一个开源的ETL工具,全称为KDE Extraction, Transportation, Transformation and Loading Environment。后来Kettle重命名为Pentaho Data Integration 。 它由Java开发,支持跨平台运行,其特性包括:支持100%无编码、拖拽方式开发ETL数据管道;可对接包括传统数据库、文件、大数据平台、接口、流数据等数据源;支持ETL数据管道加入机器学习算法。 主要功能 Pentaho D

weixin_43407520的博客 12万+

EJB Local接口使用

环境 MyEclipse 8.6 + JBoss 6.0 + JDK 1.6.13 + EJB 3.0   问题 使用EJB Local接口   解决   1.       新建Enterprise Application Project,注意New Web module Project勾选上         2.      src--------->新建包

DBA@Robin 3273

PyBioMed学习

PyProtein。

weixin_63016274的博客 1401

Java实践之路——EJB(一)

下面开始我的EJB之旅 学习任何一门技术之前,都必须简单的了解一下该技术的用途的优缺点。所以首先我们来看一下摘自百度百科上面对EJB的定义和说明====================================================================

jeff's blog 9082

从零开始搭建GD32F103CBT6开发环境:VSCode配置与实战技巧

本文详细介绍了如何从零开始为国产MCU GD32F103CBT6搭建高效的VSCode开发环境。内容涵盖工具链安装、VSCode核心插件配置、工程目录结构规划、关键配置文件编写以及Makefile实战,旨在帮助开发者摆脱传统IDE束缚,利用现代化工具链提升嵌入式开发效率。

weixin_29158413的博客 448

ResNet与注意力机制:深度学习中的强强联合

本文详细介绍了ResNet和注意力机制的基本原理,并探讨了如何将两者结合,以提升网络的性能。通过在ResNet中引入注意力机制,网络可以自适应地调整特征图的重要性,从而更加关注于关键区域,提升模型的性能。实验结果表明,引入注意力机制后,ResNet的性能得到了显著提升。未来,随着注意力机制的不断发展,我们可以期待更多创新的网络架构和训练方法,进一步提升深度学习模型的性能。

2401_82355416的博客 1782

java ejb开发_Java实践之路——EJB(一)

下面开始我的EJB之旅学习任何一门技巧之前,都定然容易的打听一下该技巧的用处的优缺点。因而率先我们来看一下摘自百度百科上面对EJB的定义和解释==========================================================================EJB是sun的服务器端组件模型,最大的用处是安排散布式利用过程当然,还有众多措施能够告终散布式利用,相仿微软...

weixin_35682224的博客 1175

基于灰度区域生长算法的红外目标检测算法matlab仿真

基于灰度区域生长算法的红外目标检测算法是一种常用的红外目标检测技术。它通过对红外图像进行灰度区域生长,找到具有相似灰度值的像素区域来检测目标。在本文中,我们将详细介绍基于灰度区域生长算法的红外目标检测算法的原理、步骤和应用。一、原理灰度区域生长算法是一种基于像素相似性的区域分割算法。它通过对图像中具有相似灰度值的像素进行聚类,将它们组合成更大的区域。灰度区域生长算法通常包括以下步骤:1.初始化:选择一个种子点作为起始点,将其作为第一个区域的中心点。

平时工作较为繁忙,私信消息一般晚上回复,谢谢大家~~ 251
上一篇: Linux.分区、格式化、挂载
下一篇: Linux.网络抓包库libpcap
木艮氵
博客等级 码龄11年 136粉丝 51原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值