EJB通过ANT提高EJB应用程序的开发效率、无状态发展本地接口bean、开发状态bean...

该jboss集成到eclipse

关掉Jboss控制台新闻Ctrl+c,在MyEclipse→Servers→Jboss可配置JBoss。


通过ANT提高EJB应用的开发效率

在HelloWorld 增加ANT,右击项目新建xml:build.xml,右击打开方式选择Ant ..

相应用进行编译、打包、公布、解公布

 

<?

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

> <!--basedirz项目所在路径,.代表在build.xml的所在路径--> <project name="HelloWorld" basedir="."> <property name="src.dir" value="${basedir}\src"></property> <!--指的是系统变量--> <property environment="env"></property> <property name="jboss.home" value="${env.JBOSS_HOME}"></property> <!--用于指定眼下JBoss使用的配置项--> <property name="jboss.server.config" value="default"></property> <!--用于编译源文件class类存放的文件夹--> <property name="build.dir" value="${basedir}\build"></property> <!--ejb依赖的jar文件--> <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}"></delete> <mkdir dir="${build.dir}"></mkdir> </target> <target name="compile" depends="prepare" description="编译"> <!--对源文件进行编译。destdir编译后class存放文件夹--> <javac srcdir="${src.dir}" destdir="${build.dir}"> <!--编译依赖的jar文件--> <classpath refid="build.classpath"></classpath> </javac> </target> <target name="EJBjar" depends="compile" description="创建EJB公布包"> <!--${ant.project.name}就是上面的name HelloWorld--> <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="${jboss.home}\server\${jboss.server.config}\deploy"></copy> </target> <target name="undeploy" description="卸载ejb"> <delete file="${jboss.home}\server\${jboss.server.config}\deploy\${ant.project.name}.jar"></delete> </target> </project>

 

公布:在servers视图启动Jboss。然后在build.xml的大纲视图右击deploy→run as → Ant ..

(发现编码问题我项目是GBK,把项目改成UTF-8就可以);

 

卸载EJB,要先停止Jboss在运行undeploy就可以;

开发具有本地接口的无状态bean

         之前我们介绍过远程接口。通过一个远程接口调用EJB的过程。首先client须要与EJB建立socket通信。在通信管道上它们须要来回发送IIOP协议信息,由于数据要在网络进行传输,存放数据的Java对象必须要进行序列化。在这个过程。有网络通信的开销、协议解析的开销、对象序列化的开销等。由于EJB是分布式技术。它同意client与EJB应用在不同机器上。所以这些性能开销也是必定的。

         可是在实际开发中,client与EJB应用执行在同一个JBoss中。

这时候client訪问EJB是否有必要走上面的网络通信呢?据我们所知,这时候client与EJB是在同一个JVM内,他们之间全然能够通过内存进行交互,这样就能够避免网络通信的性能开销。既然我们都想到了这一点,EJB专家组也想到了这一点,所以引入了本地接口。通过本地接口调用EJB,直接在内存中交互。这样就能避免因网络通信所造成的各种性能开销。可是有一点。大家必须注意,仅仅有client与EJB应用在同一个JVM内执行的时候,我们才干调用本地接口,否则仅仅能调用远程接口。

仅仅要client与EJB公布在同一个JBoss内。我们就觉得他们是在同一个JVM。

        

 

client和EJB部署到同机器上面

将HelloWorldBean指定为本地接口(@Remote改动为@Local):

@Stateless

@Local(HelloWorld.class)

public classHelloWorldBean implementsHelloWorld {

 

本地接口的无状态bean已经被开发出来了。

通过Ant的deploy部署到EJB中。

 

新建一个web Project 做为EJB的client。而且部署到Jboss中,这样client和EJB就在同一个jvm中了。

新建Web Projcet:EJBClient,部署到Jboss。

在用jsp调用EJB。新建test.jsp,将编码格式换成utf-8,这样就能够通过本地接口訪问EJB了(把HelloWorld项目引用进来:右击项目Build Path→Conf…→Projects→add):

 

<%@ pagelanguage="java"import="java.util.*"pageEncoding="UTF-8"%>

<%@ pageimport="javax.naming.*,cn.hqu.ejb3.*"%>

<%

String path = request.getContextPath();

String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

%>

 

<!DOCTYPEHTMLPUBLIC "-//W3C//DTDHTML 4.01 Transitional//EN">

<html>

  <head>

    <basehref="<%=basePath%>">

   

    <title>My JSP'test.jsp' starting page</title>

   

    <metahttp-equiv="pragma"content="no-cache">

    <metahttp-equiv="cache-control"content="no-cache">

    <metahttp-equiv="expires"content="0">   

    <metahttp-equiv="keywords"content="keyword1,keyword2,keyword3">

    <metahttp-equiv="description"content="This is my page">

    <!--

    <linkrel="stylesheet" type="text/css"href="styles.css">

    -->

 

  </head>

 

  <body>

      <%

       try {

           InitialContextctx = new InitialContext();

           HelloWorldhelloworld = (HelloWorld) ctx

                  .lookup("HelloWorldBean/local");

           out.println(helloworld.sayHello("本地的苏志达"));

       }catch (NamingException e) {

           e.printStackTrace();

       }

    %>

  </body>

</html>

 

client应用开发完了。导出war文件,将war文件复制到Jboss的公布文件夹下,看控制台发现应用公布成功了(能够通过MyEclipse部署项目到Jboss,启动Jboss就可以公布)

http://localhost:8080/EJBClient/test.jsp

 

通过本地接口调用EJB成功了。web应用和EJB部署到同一个Jboss中的。在同一个jvm中。能够进行訪问。

 

client和EJB部署到不同机器上面。

新建一个本地接口,在HelloWorld项目新建HelloWorldLocal接口。继承远程接口HelloWorld。

HelloWorldBean实现HelloWorldLocal和HelloWorld接口。

 

@Stateless

@Remote(HelloWorld.class)

@Local(HelloWorldLocal.class)

public class HelloWorldBean implements HelloWorld,HelloWorldLocal {

    @Override

    public StringsayHello(String name) {

        return name+"说:你好!

";

    }

}

 

部署同一个机器上的时候优先调用本地,不同机器上我们仅仅能通过远程接口訪问。

本地调用:部署启动JBoss执行http://localhost:8080/EJBClient/test.jsp

远程调用:

将HelloWorld的EJBClient类改为远程接口:

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

部署公布:执行Ant deploy,启动Jboss执行main方法。

在client通过远程接口调用EJB,如今他们是在不同JVM内的,仅仅能通过远程接口訪问,执行EJBCLient的mian方法。成功訪问到。

 

在实际应用中我们最好把本地接口和远程借口都实现出来。主要是能够解决能够公布在同一个Jboss或者不同Jboss都能够使用。

开发有状态bean

仅仅须要改动@Stateless为@Stateful就能够标注为有状态bean

@Stateful

@Remote(HelloWorld.class)

@Local(HelloWorldLocal.class)

public class HelloWorldBean implementsHelloWorld,HelloWorldLocal {

    @Override

    public StringsayHello(String name) {

        return name+"说:你好。";

    }

}

 

Ant deploy部署

 

有状态和无状态在代码上需然区别不大。可是採用对bean的管理的技术的不一样的.

Bean实例的两种管理技术

1.无状态bean使用实例池技术管理bean

2.有状态bean使用激活(activation)管理bean

         每一个用户都有自己的Bean实例,相当于有多少个用户就有多少个Bean实例为之服务。假设不採取不论什么机制,这样必定会导致server资源严重消耗,最后落个down机罢工。

为了解决问题。EJB引入了激活机系统。该机构的原理来实现,这是,在EJBserver如果有必要,节约资源。从内存中恢复bean示例。将举行它的会话状态序列化到磁盘,他们占用内存释放。如果此时client正确EJB再次发起请求,EJB再次实例化一个容器Bean示例,并从硬盘的状态恢复在先前。

码:http://pan.baidu.com/s/1gdGIi8V

转载于:https://www.cnblogs.com/yxwkf/p/5042703.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/431042.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql-8.0.12语法_mysql-8.0.12 (免安装版) 安装详解

mysql-8.0.12 (解压版) 安装详解 错误解决第一步&#xff1a;mysql-8.0.12 (解压版)下载地址&#xff1a;https://www.mysql.com/downloads/第二步&#xff1a;配置初始化my.ini在mysql的bin目录中创建my.ini&#xff0c;将以下内容复制其中[mysqld]#设置3306端口port3306#设置…

python扩展库不是用于科学计算的有_有哪些科学计算的开源库

2017-03-19 回答 比较火爆的android开源库有以下&#xff1a; 1、volley 主要有以下模块&#xff1a; (1) json&#xff0c;图像等的异步下载&#xff1b; (2) 网络请求的排序&#xff08;scheduling&#xff09; (3) 网络请求的优先级处理 (4) 缓存 (5) 多级别取消请求 (6) 和…

mysql中间件面试题_面试题集锦-中间件 - 春哥大魔王的博客的个人空间 - OSCHINA - 中文开源技术交流社区...

Mysql引擎区别&#xff0c;聚簇索引是数据&#xff0c;非聚簇索引是引用&#xff0c;普通索引和主键索引两棵树&#xff0c;普通索引到主键索引有个回表&#xff0c;建立覆盖索引减少回表&#xff0c;利用前缀索引&#xff0c;注意索引顺序&#xff0c;隔离级别默认rr&#xff…

php开发客服系统(持久连接+轮询+反向ajax)

欢迎在php严程序 - php教程学习AJAX教程, 本节课讲解&#xff1a;php开发客服系统(持久连接轮询反向ajax) php开发客服系统(下载源码) 用户端(可直接给客户发送消息)客服端(点击用户名.即可给该用户回复消息) 讲两种实现方式&#xff1a;一&#xff1a;iframe 服务器推技术com…

c语言判断整数_C语言技能|(草稿,不断完善中...)

2020年春考C语言有2个题型&#xff1a;填空&#xff0b;程序程序填空涉及&#xff1a;一、头文件的引用1.必有#include (注意&#xff1a;在devC 5.10中#include "stdio.h"也是正确的)2.若程序中使用数学函数&#xff0c;应加上头文件#include 3.头文件结尾无分号二、…

mysql重连服务器失败_java – MySQL连接器错误“服务器时区值中...

参见英文答案 > The server time zone value ‘AEST’ is unrecognized or represents more than one time zone????????????????????????????????????9个我的问题MySQL连接器“服务器时区值中欧时间”无法识别或代表多个时区.该项目小…

git reflog and checkout

用错checkout 了比如想checkout出下面的一个版本&#xff0c;结果用错了 git checkout 8bfd9b1d292 这样会导致HEAD deatched &#xff0c;在这个地方修改后commit commit 8bfd9b1d2922b55586f41d37f1a2a992d580e1dd Author: lab <labdera.com.cn> Date: Tue Dec 8…

python生成器迭代_python中的生成器和迭代器

前言&#xff1a; 我们来了解一下什么是python中生成器。了解一下python生成器是什么&#xff0c;以及生成器在python编程之中能起到什么样的作用。 定义&#xff1a; 生成器和迭代器 通过列表生成式&#xff0c;我们可以直接创建一个列表。但是&#xff0c;受到内存限制&#…

python 生成pdf_如何使用Python生成PDF?

在日常办公中&#xff0c;我们会经常使用PDF文件。生成PDF的方法有很多&#xff0c;其中Python就可以。你知道怎么使用Python也可以生成PDF吗&#xff1f;下面来和小编一起学习下吧。首先我们访问网址&#xff1a;https://wkhtmltopdf.org/downloads.html &#xff0c;根据自己…

《avascript 高级程序设计(第三版)》 ---第三章 基本概念

本章主要介绍Javasript语言的一些语法&#xff1a; 1.严格模式&#xff1a;开启&#xff1a;"use strict"; 2.变量&#xff1a;全部用var来定义&#xff0c;在函数中使用的称为局部变量&#xff0c;不能全局使用。 3.数据类型&#xff1a;undefined,null,boolean,num…

java 代码重用需要注意的事项_程序员笔记|编写高性能的Java代码需要注意的4个问题...

一、并发无法创建新的本机线程......问题1&#xff1a;Java的中创建一个线程消耗多少内存&#xff1f;每个线程有独自的栈内存&#xff0c;共享堆内存问题2&#xff1a;一台机器可以创建多少线程&#xff1f;CPU&#xff0c;内存&#xff0c;操作系统&#xff0c;JVM&#xff0…

java vbs_VBS基础篇 - vbscript Dictionary对象

Dictionary是存储数据键和项目对的对象&#xff0c;其主要属性有Count、Item、Key&#xff0c;主要方法有Add、Exists、Items、Keys、Remove、RemoveAll。创建Dictionary对象定义并创建Dictionary对象&#xff0c;使用CreateObject创建并返回自动化对象的引用Dim DicSet Dic C…

java integer最大值_五分钟学会java中的基础类型封装类

在刚刚学习java的时候&#xff0c;老师不止一次的说过java是一种面向对象的语言&#xff0c;万物皆对象。对于java中的基础数据类型&#xff0c;由于为了符合java中面向对象的特点&#xff0c;同样也有其封装类。这篇文章对其有一个认识。一、基本认识其实在jdk1.5之前&#xf…

hadoop 单节点安装

http://hadoop.apache.org/docs/r2.6.0/hadoop-project-dist/hadoop-common/SingleCluster.html ,一&#xff0c;.安装hdfs1&#xff0c;hadoop-env.sh修改java_home2&#xff0c;core-site加入1,注意使用主机名映射2,端口使用&#xff1a;80203&#xff0c;缓存目录&#xff0…

web.xml文件位于web项目的目录结构中的_看完这篇,别人的开源项目结构应该能看懂了...

我为什么要写这篇近来&#xff0c;和不少初学Spring或Spring Boot的小伙伴私信交流了关于项目目录结构划分和代码分层的问题。很多小伙伴表示网上下载下来的开源项目看不懂&#xff0c;项目结构和代码分层看得很蒙&#xff0c;不知道应该以一个什么样的思路去学习和吸收别人的项…

06-CABasicAnimation基础核心动画

06-CABasicAnimation基础核心动画 核心动画只作用在层上面. 动画的本质是改图层的某一个属性. CABasicAnimation *anim [CABasicAnimation animation]; 图层有哪些属性,这里才能写哪些属性. anim.keyPath "transform.scale"; anim.toValue 0.5; 告诉动画完成的时候…

java 异常 理解_java异常理解(1)

JAVA异常处理机制1引子try…catch…finally恐怕是大家再熟悉不过的语句了&#xff0c;而且感觉用起来也是很简单&#xff0c;逻辑上似乎也是很容易理解。不过&#xff0c;我亲自体验的“教训”告诉我&#xff0c;这个东西可不是想象中的那么简单、听话。不信&#xff1f;那你看…

python turtle 绘图速度用函数会快吗_有趣的Python turtle绘图

专 题 Feature Story 16 \ China Science & Technology Education 文 _ 毛京宇&#xff0f;北京师范大学第三附属中学 魏云靖&#xff0f;北京市师达中学 有趣的 Python turtle 绘图  Python turtle 的发展 Python 中的 turtle 模块受启发于在欧美有 着广泛基础且历史悠久…

网络导通概率的研究

最近老师给了一个题目&#xff0c;说是研究一个正常矩阵任意概率置点概率下&#xff0c;双向导通&#xff08;x,y&#xff09;的概率&#xff08;要求有自然边界条件&#xff0c;也就是可以从0->length-1&#xff09;&#xff0c;用代码敲了一下demo&#xff0c;结果发现有个…

在java中字符流怎么复制_Java 使用字符流拷贝数据

使用字符流拷贝数据时&#xff0c;需要注意在文件末尾处的数据&#xff0c;因为最后一次读取的长度不会刚好与数组input长度相同&#xff0c;所以需要引入新的变量来存储每次读取的长度。import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundExcep…