EJB3.0初步学习

2024-02-19 19:08
文章标签 学习 初步 ejb3.0

本文主要是介绍EJB3.0初步学习,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

今天简单学习了传说中的EJB,首先总的感觉,就是他的最重要的一个特点吧,就是能够使远程用户访问到本地或是服务器上的资源服务器。打个比方吧,传统的,还记得我们的第一个JAVA项目吧,那是个简单的对数据库增删改查的操作,用简单的界面来显示数据。那么当我们把这个项目打包发布之后,事必要把你自己的数据库也贡献出去,你做的软件在进行增删改查时也就只能对你机子上的一个数据库,别人如果想要对你这个数据库进行访问,那必须到你数据库所在的终端设备上才可以。而传说中EJB结合JBOSS正好可以克服这个问题,关于JBOSS是一个EJB容器,但似乎也有WEB服务器的作用,关于这点,我自己也不是很清楚,我使用过tomcat那个我知道是WEB服务器,这里我想可以是JBOSSEJB容器,但同时也集成了WEB服务器的功能吧。好,从官网上下载到JBOSS,该设置的都设置了,JBOSS服务器成功运行,关于JBOSS的设置,网上很多资料,这里不在重复。但在这里讲我设置时遇到的一个上错误吧,当我在正确设置JBOSS-HOME后,但在以后的配置文件中调用系统这个属性时,经常是把JBOSS-HOME的变量在最后加上一个分号,从而使自己程序在访问这些配置时经常出错,当时我是用全路径名称。后来才发现不知道为什么,在我的JBOSS-HOME所在的路径中自动生成了一个带有分号的文件夹,我想可能是我的JBOSS-HOME指到那个地方去了吧。把这个文件夹删除后就可以正常使用了。

好慢慢来,首先是我的第一个EJB的例子,HelloWorld.首先要说明的是Bean,关于这个Bean有很多,会话,实例等等。那么究竟什么是Bean呢在字典中查的意思也都不对。在这里暂且把Bean当作是一个包吧,把一些应用封装,毕竟是人为规定的,不用太计较了。

让我先来看看会话Beansession beansession bean是实现业务逻辑的地方,简单来说,像我们要实现两数相加或是从数据库中读取数据,都江堰市是通过Session Bean来实现的。这样说来很像三层开发模式中的逻辑层,也像MAC中的C层。根据是否可以维护会话状态,Session Bean分为有状态bean和无状态bean.有状态bean可以维护会话状态,无状态bean不维护会话状态。要维护会话状态,意味EJB窗口要为每个用户创建一个bean实例,并通过该实例保存着与用户的会话状态。不维护会话状态,意味着一个bean实例不需要保存与某个用户的会话状态,这时一个bean实例可以为多个用户服务。可能说了这么多大家还是不太懂,怎么说呢,当我们把这个会话bean提交给JBOSS服务器后,客户端会请求调用这些bean来处理信息数据等,当客户端发送请求时,服务器端要生成bean对象给这个用户。无状态bean的意思就是这些创建之后都会放在一个bean池中,客户调用时池中有就从池中取,池中没有就创建,而有状态会对每个不同的用户创建一个bean实例。而要开发一个Session Bean,我们按面向对象的思维,要给这个bean定义接口和相应的实现类。从而这个接口分为了远程(remote)和本地(local)接口,在这里先说明一下,不强制要求你实现remotelocal接口,但实现两者是一个比较好的方法。

远程接口(remote interface),定义了session bean的业务方法,而这些方法可以被来自EJB容器之外的其它应用使用。他通过的是Socket通信原理。

本地接口(local interface),定义了session bean的业务方法,而这些方法可以被同处于EJB容器内的其它应用使用。因为local接口允许bean之间直接通过内在交互,没有分布式对象协议的开销,从而发送了性能。

Bean(bean class) bean class 包含了业务逻辑,它是实现接口所有的方法。

下面用一个简单的图来表示bean的运行流程:

 

 

 

浏览器

http://localhost:8080/Helloworld/index.jsp

JSP Engineer

index.jsp

HelloWord helloword=(Helloword)ctx.lookUp();

Session bean EJB container

Jndi.properties

 

HelloWorldBean.class

浏览器请求index.jsp

编译JSP文件

查找存根对象

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


好下面开始编写bean了,在这之前首先要把JBOSS的一些JAR文件导入到项目中去,首先是bean接口,很简单根普通接口一样,方要是用来定义方法,和在调用时返回实现这个接口的存根。

然后是实现这个接口方法的实现类,当然这里叫session bean,建议类名后面加上bean表示这是一个实现类。在这个类上有几个标签要注意,第一组是@Stateless,@Stateful.第一个指定这个bean是无状态的.第二个当然是用状态的了。在这里面还可以指定这个bean的名字,为什么要指定呢,我打个比方,如果不指定名字那一个接口类有两bean实现,那我们调用的时候,究竟是调用哪个呢,这时编译器会报错的。当然我只是打个比方,其实在这里我们是可以不指定名字的,那肯定有默认的了,那这个默认的名字是什么呢,其实就是这个实现类的类名(不包含包结构),所以只要我们的类名不同,那我们完全可以不指定每个bean的名字。也可以很好的控制了。当然在这里还是要告诉大家指定bean名字的方法:@Staeless(name=”xxx”),还有一组是@Remote(接口的class文件名), @Local(接口的class文件名),这组是用来指定接口是远程还是本地的。当然我们也可以指定多个接口。方法是:@Local({接口1class文件名,接口2class文件名。。。。。})或分开有的是远程,有的本地。

好了这两步完成之后一个简单的EJB就完成了,接下来就是把它布暑到JBOSS中去了。关于布暑也有两种方法一种是利用开发工具自带的jar导出功能。这个很简单点next就行。还有一种方法也是在真正开发过程中常用的Ant打包方法。这种打包方法十分的方便。首先在当前项目的根目录下新建一个XML文件,build.xml

 

<?xml version="1.0" encoding="UTF-8"?>

<!--.表示同一目录 ..表示在上一目录-->

 

<project name="HelloWorld" basedir=".">  //basedir是指定该项目的目录,点表示为当前目录,也就是build.xml所在的目录

   <!--指定项目的源文件夹 -->

   <property name="src.dir" value="${basedir}/src"/>

   <!--指定系统中的变量因为我们要从系统变量中得到值参考以下,简单的说就是引用系统的环境变量 -->

   <property environment="env"/>

   <property name="jboss.home" value="${env.JBOSS_HOME}"/>

   <!-- 指定目前Jboss的配置项 -->

   <property name="jboss.server.config" value="default"/>

   <!-- 指定后面编译类时存储的路径 -->

   <property name="build.dir" value="${basedir}/build"/>

    <!-- 指定我们要用到jbossjar文件 -->

    <path id="build.classpath">

   

        <fileset dir="${jboss.home}/client">

            <include name="*.jar"/>

         </fileset>

    <pathelement location="${build.dir}"/>

    </path>

 

    <!-- 是用来创建文件夹的 -->

    <target name="prepare" >

       <delete dir="${build.dir}"/>

       <mkdir dir="${build.dir}"/>

    </target>

 

   

    <target name="compile" depends="prepare" description="编译">

    <javac srcdir="${src.dir}" destdir="${build.dir}">

       <classpath refid="build.classpath"/>

    </javac>

    </target>

 

    <!-- 打包 -->

    <target name="ejbjar" depends="compile" description="创建ejb发布包">

       <jar jarfile="${basedir}/${ant.project.name}.jar">

           <fileset dir="${build.dir}">

            <include name="**/*.class"/>

            </fileset>

 

      

 

       

       </jar>

    </target>

 

    <target name="deploy" depends="ejbjar" description="ejb发布">

       <copy file="${basedir}/${ant.project.name}.jar" todir="F:/DirectRunSoft/jboss-5.1.0.GA-jdk6/jboss-5.1.0.GA/server/${jboss.server.config}/deploy"/>

    </target>

                                                                                                                                                                               

    <target name="undeploy" description="卸载ejb">

       <delete file="F:/DirectRunSoft/jboss-5.1.0.GA-jdk6/jboss-5.1.0.GA/server/${jboss.server.config}/deploy/${ant.project.name}.jar"/>

    </target>

                                                                                                                                                                              

  

 

</project>

 

当这个Bean发布成功后,我们可以到http://localhost:8080/jmx-console中去查看是否发布成功。(发布时要启动JBOSS服务器)

发布成功后就会生成一个jndi.

什么叫jndi呢,其实不用管他,只要记着你发布之后,那JBOSS会给你一个号。而别人调用时,也是查这个号。差不多就是这意思了。

那么接下来我们就要创建一个客户端来访问这个bean服务了。说白了就是那个实现类中提供的方法。那如上文所说,首先是查找这个jndi号了。在查之前还有一个工作就是我们必须设置应用服务器(JBOSS)的上下文信息。主要是jndi的驱动类名(java.naming.factory.initial)和命名服务器提供者URL(java.naming.provider.url).

那这两个是什么东东呢,呵呵,第一个,你可以作为jndi的驱动,上文不是讲你把session bean发布到了应用服务器之后,服务器会生成jndi吗,你查找的时候也是查找 这个所谓的jndi,那么我们肯定需要驱动吧,打个比方吧,你查找数据库时,也是要Class.Form(driver),呵呵,对不。这个驱动在JBOSS中是有的,只要加载一下(org.jnp.interface.NamingContextFactory)

第二个,url根数据库操作提供的url有点像吧,那么我们加快一下数据库中的url是用来做什么的呢(url=jdbc:sqlserver://localhost8080;Datebase=Student)一他指定这个数据库所在的主机和访问时的端口,然后数据库名字等等信息,那么类比而来,我先把这个jndiurl写出来(127.0.0.1:1099)似乎比数据库的url更为简单,他其实是用来指定全程服务器的主机地址和端口号,你要查jndi,但你去哪查啊,从哪个端口去查。

除了以上两个属性还有两个属性也常用到,分别是(java.naming.security.principalContext.SECURITY_PRINCIPAL)(java.naming.security.credentialsContext.SECURITY_CREDENTIALS),他们类似于数据库的用户名和密码。

 

Properties props=new Properties();

       props.setProperty("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory");

       props.setProperty("java.naming.provider.url", "127.0.0.1:1099");

//上面是将配置信息注册进系统属性

        try {

            //这是实现一个jndi的对象。

           InitialContext ctx=new InitialContext();

//查找jndi

           HelloWorld hellworld=(HelloWorld)ctx.lookup("HelloWorldBean/remote");

//得到服务

           System.out.println(hellworld.sayHello("约定291天后"));

           System.out.println(hellworld.getClass().getName());

       } catch (NamingException e) {

           // TODO Auto-generated catch block

           e.printStackTrace();

       }

除了上面的在代码中显示加载相应配置之外,我们还可以使用配置文件,你可能已经发现一个问题,在实例化jndi对象的时候就是上面的ctx,我们并没有看到对上面配置的调用,其实jndi对象实例也可以这样写InitialContext ctx=new InitialContext(props);,如此似乎更直观一点但在实际中,还是上面的写法,因为加入参数反而会影响程序的可移植性,那么我们不传入参数,那jndi实例化时是会自动调用System.getPropety()方法来查找配置的。下面介绍使用配置文件的方法。因为如果没有指定propertyjndi还会在classpath中寻找jndi.properties.那么水到渠成。建一个这个配置文件就O了。

 

 

 

WEB程序打包:

War打包

1. 开发集成工具

2. 压缩软件,压缩格式zip然后再改成war

3. Ant打包:

jarant类似,但也有不同:下回在说累了。。。。。。。。。。。。。。。。。。。。

 

 

这篇关于EJB3.0初步学习的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/725648

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

线性代数|机器学习-P36在图中找聚类

文章目录 1. 常见图结构2. 谱聚类 感觉后面几节课的内容跨越太大,需要补充太多的知识点,教授讲得内容跨越较大,一般一节课的内容是书本上的一章节内容,所以看视频比较吃力,需要先预习课本内容后才能够很好的理解教授讲解的知识点。 1. 常见图结构 假设我们有如下图结构: Adjacency Matrix:行和列表示的是节点的位置,A[i,j]表示的第 i 个节点和第 j 个

Node.js学习记录(二)

目录 一、express 1、初识express 2、安装express 3、创建并启动web服务器 4、监听 GET&POST 请求、响应内容给客户端 5、获取URL中携带的查询参数 6、获取URL中动态参数 7、静态资源托管 二、工具nodemon 三、express路由 1、express中路由 2、路由的匹配 3、路由模块化 4、路由模块添加前缀 四、中间件