-
2021-02-27 17:20:34
前期准备:弄清楚weblogic(或jboss)、tomcat、JBluder(或eclipse+MyEclipse)的使用方法,能写一个简单的基于struts框架的web工程,然后准备两台联网的电脑(局域网也可以),如果没有条件,也可以在同一台电脑上分别安装两个web服务器(例如:weblogic和tomcat)来代替,本文将采用后一种方法,采用weblogic作EJB容器,tomcat作web容器,用struts工程来调用EJB
准备好了吗?让我们开始下一步
第一步:写一个简单的EJB。写EJB最好用的还是JBuilder,毕竟够傻瓜化。当然作为专业人士,eclipse搭配MyEclipse是最佳选择,不过作为初学者,建议采用JBuilder。以下是本文测试所用到的EJB。
remote接口:
package testhello;
import javax.ejb.EJBObject;
public interface SayHello extends EJBObject {
public String sayHello(String name) throws java.rmi.RemoteException;
}
home接口:
package testhello;
import javax.ejb.EJBHome;
import javax.ejb.CreateException;
import java.rmi.RemoteException;
public interface SayHelloHome extends EJBHome {
public SayHello create() throws CreateException, RemoteException;
}
bean类:
package testhello;
import javax.ejb.SessionBean;
import javax.ejb.SessionContext;
import javax.ejb.CreateException;
public class SayHelloBean implements SessionBean {
SessionContext sessionContext;
public void ejbCreate() throws CreateException {
}
public void ejbRemove() {
}
public void ejbActivate() {
}
public void ejbPassivate() {
}
public void setSessionContext(SessionContext sessionContext) {
this.sessionContext = sessionContext;
}
public String sayHello(String name) {
return "Hello "+name;
}
}
如果你是采用上面两种工具来写的话,配置文件就不必考虑了
第二步:利用JBuilder或eclipse将这个EJB工程编译并打包,会得到一个jar(如果你的工程名叫testhello,那么这个jar文件就是testhello.jar)文件。如果你的EJB容器(weblogic或JBoss)是在本机上,那么在JBuilder或eclipse中就可以直接鼠标右击EJB工程,来部署EJB。如果需要部署到远程服务器上,只需要通过EJB容器的控制台将testhello.jar上传到远程端,然后在EJB Modler里面按提示部署好EJB。最后,别忘了在JNDI Tree里面察看你的EJB工程的JNDI名,本例的JNDI名叫SayHello
第三步:将remote接口和home接口打包成jar文件,copy到你要远程调用EJB的struts工程下的lib目录(例如:helloapp ->WEB-INF ->lib)
第四步:将weblogic的weblogic.jar(在weblogic的安装目录->weblogic81->server->lib文件夹中)copy到tomcat安装目录下的->shared->lib文件夹中,其实这里我们需要用到的只是weblogic.jar里的几个class文件而已,不过对于初学者而言,先不必去深究到底只需要那几个class。
第五步:编写一个简单的struts工程(其实这些都可以用工具生成),一下是调用EJB的HelloAction的源代码(特别要注意的是,记得要将之前第三步生成的jar包导入编辑器中,否则下面的代码编译通不过。如果你不知道导入jar包,就把那个jar包多copy一份到你的jdk安装目录 -> jre-> lib-> ext文件夹下)
package logging.actions;
import logging.Constants;
import java.util.*;
import javax.servlet.ServletException;
import javax.servlet.RequestDispatcher;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.rmi.PortableRemoteObject;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ActionMessages;
import org.apache.struts.util.MessageResources;
import org.apache.struts.validator.DynaValidatorForm;
public final class HelloAction extends Action{
public ActionForward execute(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception{
InitialContext ctx=this.getInitialContext();
//查找JNDI名为SayHello的EJB组件
Object obj=ctx.lookup("SayHello");
//获得远程EJB组件的home接口的引用
testhello.SayHelloHome home=(testhello.SayHelloHome)PortableRemoteObject.narrow(obj,testhello.SayHelloHome.class);
//获得远程EJB组件的remote接口的引用
testhello.SayHello hello=home.create();
String name="飘然随风";
String sayString=hello.sayHello(name);
request.setAttribute("userName",name);
request.setAttribute("passWord",sayString);
request.removeAttribute(mapping.getAttribute());
return mapping.findForward("loginSuccess");
}
/*以下方法是作用是:通过传递环境属性选择JNDI驱动和服务器的网络位置,
并连接到连接到JNDI树。
这是采用weblogic做EJB容器时,远程调用EJB的固定初始化模式,初学者可以死记下来
*/
private InitialContext getInitialContext() throws Exception {
//EJB容器的地址
String url = "t3://image:7001";
String user = null;
String password = null;
Properties properties;
properties = new Properties();
properties.put(Context.INITIAL_CONTEXT_FACTORY,
"weblogic.jndi.WLInitialContextFactory");
properties.put(Context.PROVIDER_URL, url);
if (user != null) {
properties.put(Context.SECURITY_PRINCIPAL, user);
properties.put(Context.SECURITY_CREDENTIALS,
password == null ? "" : password);
}
return new javax.naming.InitialContext(properties);
}
}
第六步:如果你严格按照上面的步骤做了,那么剩下的就是同时启动weblogic和tomcat来测试了。
更多相关内容 -
JBoss远程访问EJB
2013-06-25 23:10:37转自:... 1. 远程访问EJB 针对EJB(1)中的HelloEJB例子中,如果在局域网内的另一台机器调用部署在JBoss里面的HelloEJB,则需将HelloEJBClient中的prop.put("java.naming.provider.url转自:http://glmxzz.blog.163.com/blog/static/1332127902009102602532810/
1. 远程访问EJB
针对 EJB(1)中的HelloEJB例子中,如果在局域网内的另一台机器调用部署在JBoss里面的HelloEJB,则需将HelloEJBClient中的prop.put("java.naming.provider.url", "localhost:1099");这段代码改为prop.put("java.naming.provider.url", "192.168.2.182:1099");,也就是将localhost改为JBoss所在的IP地址,运行,如无意外,将会出错,错误信息大概为:Could not obtain connection to any of these urls: 192.168.2.182:1099。2. 访问http://192.168.2.182:8080或者http://127.0.0.1:8080此时第一反应便是ping 192.168.2.182,结果并没有出现任何问题,接着便访问 http://192.168.2.182:8080,发现不能访问,如果是服务器是Tomcat的话,该访问是没有任何问题的。于是便上网搜索,发现JBoss是默认将IP绑定为127.0.0.1的,所以便会出现访问不了 http://192.168.2.182:8080,甚至在JBoss服务器本机也不能访问该地址。而只能访问 http://127.0.0.1:8080或者 http://localhost:8080,那该如何解决呢?打开%JBOSS_HOME%\server\default\deploy\jbossweb.sar目录,编辑server.xml,找到<Connector protocol="HTTP/1.1" port="8080" address="${jboss.bind.address}" connectionTimeout="20000" redirectPort="8443" /><Connector protocol="AJP/1.3" port="8009" ddress="${jboss.bind.address}"redirectPort="8443" />将address="${jboss.bind.address}修改为address="192.168.2.182",重启JBoss,便可以在局域网中的任何一台机器上访问 http://192.168.2.182:8080,可这次如果在JBoss服务器本机上却不能访问 http://127.0.0.1:8080,如果要让两个同时都能访问,则需将address="192.168.2.182"修改为address="0.0.0.0"。3.解决远程访问EJB现在再次调用HelloEJBClient,发现错误依然,可见上面的修改并没有影响到EJB的调用,仔细想想,刚才所修改的是web的URL,而EJB所需要的是JNDI的URL,所以错误依然,再通过网络搜索,发现可以通过以下方法解决,在%JBOSS_HOME%\bin目录下,创建run.bat的快捷方式,然后如图所示在其Target后面加上--host=192.168.2.182,重启JBoss,然后再次调用HelloEJBClient即可成功。如果是在eclipse开发环境下的话,打开Servers视图,双击Jboss服务器,再点击Overview视图中的Open launch configuration,在弹出来的对话框里,如图所示输入--host=192.168.2.182,确定之后重启Jboss,即可。
至于如何设置JBoss的配置文件才能达到这一效果,目前还没有找到,找到了再添加。 -
Java Web(J2EE 与EJB)
2020-07-01 16:42:002. J2EE与EJB 2.1 什么是J2EE 是java平台企业版简称,用来开发与部署企业级应用的架构,提供一种统一的、开放标准的多层平台,主要由构件、服务和通信组成。 构件包含客户端构件和服务器构件,客户端构件主要包含两...2. J2EE与EJB
2.1 什么是J2EE
是java平台企业版简称,用来开发与部署企业级应用的架构,提供一种统一的、开放标准的多层平台,主要由构件、服务和通信组成。
构件包含客户端构件和服务器构件,客户端构件主要包含两类Applets和Application Clients,服务器构件分为两类Web构件(servlet和JSP)和EJBs两种。
本质上J2EE只是一个行业标准,主要用来通过java开发服务器端应用提供一个独立的、可移植的、多用户的企业级平台,从而能简化应用程序的开发和部署。2.2 J2EE常用术语有哪些
1、web服务器
Web服务器是指在Internet上的计算机程序,是一种服务程序,主要工作是接收来自于客户端的请求,把对请求的处理结果返回给客户端。用户可以用浏览器请求所需的资源,Web服务器接收到请求后会查找用户请求的资源,将找到的资源返回给用户。
2、Web容器
又叫Web应用服务器,是一种服务程序,给运行在其中的程序(servlet,JSP)提供一个运行的环境。因此,Servlet只需要关注业务逻辑的处理而不用关注于客户端的交互,因为这些交互都已经由web容器协助完成。
3、EJB容器
服务器端容器,是J2EE应用的业务层技术标准,只要满足J2EE规范的组件就能在EJB容器中运行,这个组件就会被EJB容器高效管理。
4、Applet容器
客户端容器,包含Applet组件,Applet是一种嵌入在浏览器中的轻量级客户端,只有当使用Web页面无法充分的表现数据或应用界面时才会使用。是一种替代web页面的手段。不能使用Servlet和API。
5、Application Client容器
客户端容器,包含Application Client组件,是一种较重量级的客户端。能使用Servlet和API。
6、JNDI(java nameing and directory interface)
java命名与目录接口,提供一个目录系统,将服务名称和对象关联起来,从而使得开发人员在开发过程中可使用名称来访问对象。可以实现快速查找和定位分布式应用程序,使得程序有更好的可扩展性。
7、JMS(java message service)
java消息服务,是一个java平台中面向消息中间件的API,实现各个应用程序之间进行异步通信,包括创建、发送、接收、读取消息等。
8、JTA(java transaction API)
Java事务服务,提供各种分布式事务服务,为J2EE实现分布式事务处理提供支撑。
9、JAF(javabean activation framework)
Java激活框架,是一个专门的数据处理框架,提供一种统一处理不同数据格式的方法。
10、RMI(Remote Method Invocation)
远程方法调用,主要用于远程调用服务,可以像调用本地函数一样调用另外一台计算机的程序。2.3 EJB有哪些不同的类型
EJB相当于分布式组件对象模型(DCOM),是一种服务器端组件体系结构,用于开发和部署多层的、分布式的以及面向对象的应用系统的跨平台体系结构。简化java开发企业级分布式组件应用程序的过程,定义一组可重用的组件,可以使用这些组件,建立各种分布式应用。
EJB可分为Session Bean(会话Bean)、Entity Bean(实体 Bean)、Message Driven Bean(消息驱动Bean)。
1、Session Bean
实现服务器端的业务逻辑,协调Bean之间的交互。session Bean仅存在于客户应用与服务器交互的时间段内,session Bean 中的数据不保存。可以分为无状态session Bean和有状态session Bean。
无状态session Bean 在方法调用期间不维护任何状态,所有事务都在一个方法中处理完成,一个无状态Session Bean可以被多个客户共享。有状态Session Bean可以记录客户应用请求的状态。
2、Entity Bean
主要是资料组件,代表数据库中的记录,与数据库中的数据有着相同的生存周期,只要数据库中的数据存在,Entity Bean就一直存在。可以被多个客户应用共享。Entity有两种数据持续化方法:- CMP(容器管理的持续性):构件的相关数据库操作由容器自动完成,不需要在bean中编写数据库操作代码。
- BMP(Bean管理持续性):构件的相关数据库操作由开发人员在代码中通过JDBC实现。
Entity Bean有3种状态:
- no-state:Bean实例还没有被创建
- pooled:Bean实例已经被创建,还没有和一个EJB Object关联
- ready:与EJB Obejct关联,若断开关联,则为pooled
3、message driver bean
用来处理异步消息,不是由用户调用的。当有异步消息发送到某个message driver bean后,容器负责调用message driver bean 的OnMessage方法处理该异步请求。2.4 EJB与javaBean的异同
EJB是基于java的远程方法调用技术,被远程访问,但是必须被部署到Webspere、WebLogic等容器中。EJB客户不直接访问真正的EJB组件,而是通过其容器访问,EJB容器是EJB组件的代理,EJB组件由容器创建管理。
2.5 EJB的生命周期
无状态session bean的生命周期是由容器决定的,当客户端发出请求要建立一个bean实例,EJB容器不一定创建一个新的Bean实例供客户端调用,若当前有无状态session bean实例可以满足客户需求,则不创建新的实例。
无状态session bean生命周期有两个状态:无状态和准备方法。
无状态表示容器没有无状态session bean的实例。只有EJB容器认为实例池需要更多实例时,才会创建新的实例。新创建的实例由无状态转换为准备方法状态。反之,当EJB容器认为当前实例池中不需要某些实例为客户端提供服务,则从实例池中删除一些实例,这些被删除的实例状态转为无状态。
有状态session bean的生命周期与用户的操作相关,有状态session bean不能被共享,因此当客户端第一次调用一个有状态session bean时,容器必须立即在服务器中创建一个新的bean实例,并关联在客户端上,当此客户端调用有状态session bean的方法时,容器会把调用分派到与此客户端相关的bean实例。有状态session bean生命周期有3种状态:无状态、准备方法、钝化。
No state是容器中没有stateful session bean实例,只要有新的用户请求到来,EJB容器就会创建新的statful session bean实例,被创建的实例状态从No state转换为Method Ready。当这个实例不在被使用,EJB容器就会删除该实例,此时该实例的状态会转换为No state。stateful session bean不能被共享,在一个时刻EJB容器中可能有大量的stateful session bean实例,使得内存开销过大,为解决该问题,引入passivated状态,当stateful session bean的实例过多时,EJB容器只保留正在被使用的实例,将当前不被使用的实例从内存放入硬盘,这些实例的状态被转为passivated。当客户再次请求使用处于passivated状态的实例,这些实例才会被激活并放入内存,状态转为Method Ready。实例不再被使用或超时,状态转为No state。
Entity Bean能存活较长时间,且状态持续。只要数据库中的数据存在,Entity Bean就一直存活,而不是按应用程序或服务进程来说。Entity Bean 生命周期能够被容器或Bean自己管理。Entity Bean的生命周期被划分为3个状态:No state、pooled state和ready state。
No state说明实例不存在。当EJB创建新的实例,该实例的状态为pooled state,该状态下的实例与任何EJB对象都没关系,与数据库记录对应的字段未初始化,当客户端调用home接口中的方法来创建或找到某个实体bean,该实体状态从poolled State转为Ready State,处于Ready State的实例已经建立与EJB对象的关联,也已经和数据库中的记录对应起来。2.6 EJB的角色有哪些
2.7 EJB开发流程
EJB开发中有3个对象:Remote接口、Home接口、Bean接口。Remote接口定义业务方法,用于EJB客户端调用业务方法,开发EJB时只需要对其进行定义,不需要实现。EJB开发步骤如下:
1、定义Romote接口
编写一个继承javax.ejb.EJBObject的接口,在这个接口中定义需要实现业务逻辑的方法对应的接口。且这个接口中定义的类必须抛出RemoteException异常。
2、编写一个继承javax.ejb.EJBHome的接口,在接口中实现create方法,方法返回值必须是Remote接口类型,同时该接口抛出CreateException和RemoteException异常。
3、编写bean类的实现类(session Bean),实现类必须实现下面五个方法:
以上方法主要用来控制SessionBean生命周期。
4、在meta-inf目录中创建两个xml文件:ejb-jar.xml和jboss.xml,ejb-jar.xml文件如下:
jboss.xml文件如下:
5、将EJB项目发布到JBoss容器上后,客户端就可以调用EJB对象了。客户端调用EJB步骤如下:
设置JNDI服务工厂以及JNDI服务地址系统属性,查找Home接口,从Home接口调用create方法创建Remote接口,通过Remote接口调用其业务方法。
2.8 EJB3.0和2.0有哪些不同
3.0相比2.0更简单,在系统开发时,不用像2.0需要两个接口和一个Bean的实现类,主要通过annotation元注释标明session Bean类型。例如:
上面例子可以看到,3.0在开发时省去很多方法。两者最大的不同是3.0通过元数据、去掉部署文件、省去对Home接口的使用,改变访问数据库的方法,2.0访问数据库使用Entity Bean,3.0使用JPA。2.9 EJB的作用
EJB容器是Enterprise JavaBean的拥有者,所有EJB必须运行在EJB容器中,负责管理运行在其中的bean。EJB容器提供:事务管理、持久性管理、安全管理、并发访问控制管理、生命周期管理和代码生成。
2.10 EJB规范规定EJB中禁止的操作是什么
1、不能操作线程和线程API
2、不能操作AWT
3、不能实现服务器功能
4、不能对静态属性存取
5、不能使用IO操作直接存取文件系统
6、不能加载本地库
7、不能将this作为变量,不能将this返回
8、不能循环调用2.11 Web服务器和Web应用服务器的区别
- Web服务器时可以向发出请求的浏览器提供文档的程序。主要功能是提供网上信息浏览服务,接收浏览器请求并把处理结果传回浏览器进行显示。Web服务器以http方法访问,当Web服务器接收到一个html请求,同样以http格式返回一个响应。Web服务器一般使用一些特有的机制保证Web服务器的扩展性。
- 应用服务器提供访问业务逻辑的途径以供客户端应用程序使用。通过HTTP、TCO\IP、IIOP(互联网内部对象请求代理协议)、JRMP(远程方法协议)等协议提供业务逻辑接口。同样使用可扩展性和容错机制。为应用的开发提供很多服务。
- 两者的区别:
Web服务器一般是通用的,应用服务器一般是专用的。Web服务器和应用服务器是并列关系,如果访问的页面只有html,Web服务器就足够,但是如果是jsp,则需要应用服务器。
2.12 什么是Web Service
一种基于网络的分布式模块化组件,可以将可调用的功能发布到Web上以供应用程序访问。Web Service基于如下协议实现:
1、可扩展可标记语言(XML),适合在网络上传输数据使用。
2、Web服务描述语言(WSDL),将Web Service描述为能够进行消息交换的服务访问点的集合。
3、通用描述、发现与集成服务(UDDI),主要提供基于Web服务的注册和发现机制,为Web服务提供3个重要的技术支持:(1)标准、透明、专门描述Web服务的机制;(2)调用Web服务的机制;(3)访问的Web服务注册中心。
4、简单对象存取协议(SOAP),是Web Service的通信协议。
Web Service规范如下:
Web Service的优点:
1、完好的封装性,服务使用者只需要知道Web Service的功能列表,不需要知道具体实现。
2、松耦合,服务提供者和使用者互不影响。
3、高度客户操作性,跨平台、跨语言调用。
4、动态性,自动发现服务并进行调用。2.13 什么是XML
- 可扩展可标记语言,一套定义语义标记规则的语言,可以被用来描述业务数据、数学数据。一个重要的用途是实现系统的解耦机制。
- XML优点:
1、实用性强:xml是以文本而不是二进制方式存储,很容易对其进行修改和调试。不仅可以用在数据量较少的场合,也会用在存储大量数据。
2、访问速度快:xml使用层次结构,非常方便,快速通过深入到感兴趣的节点获取感兴趣的数据。
3、可扩展性好:不仅用来存储和显示数据,通过相关的属性标记数据的属性和类型,以便应用程序可以根据实际情况选取不同数据。标记自定义,具有很好地可扩展性。
4、跨平台性好:xml有统一的标准语法,大部分系统支持的xml文件都具有相同的语法结构。 - XML的缺点:
当数据量过大,存储效率变得很低,比其他存储方式占用更大的存储空间。
XML文档定义两种形式:文档类型定义(DTD)与Schema。
目前,对xml的解析最重要的方法有两种:DOM和SAX。2.14 数据库连接池的工作机制
数据库连接是一种非常有限和重要的资源,对数据库连接管理的好坏影响整个系统的性能:
1、建立数据库的连接非常耗时,在页面应用中,如果每次用户的请求都建立一个新的数据库连接,则响应时间很长。
2、数据库连接的数量有限,如果用户经常建立与数据库的连接但在使用后不释放连接,则一段时间后就会耗尽数据库连接的个数,再有新的用户访问数据库时,就需要等待很长一段时间,直到有用户释放连接资源才能访问数据。
数据库连接池负责分配、管理、释放数据库连接,应用程序可以重复使用一个现有的数据库连接,不再重新建立一个新的数据库连接。并且还释放空闲时间超过最大空闲时间的数据库连接,避免因为没有没有释放数据库连接而引起的数据库连接遗漏。
服务器在启动时会创建一定量的池连接,一直维持不少于此数量的连接池。当客户程序需要访问数据库时,就可以直接从池中获取数据库连接资源,并将该资源设为忙碌状态。在使用完后再将该连接资源的状态改为空闲状态,其他用户就可以使用该连接了。如果数据连接池中目前没有闲置的资源,则在池中创建一定量的连接资源。这样就可以提高运行效率,缩短用户响应的时间。2.15 J2EE中的调优方法
1、优化设计:小心使用继承,因为继承会导致递归,由于父类的构造器将会被遍历,继承嵌套的太深,会产生巨大的创建开销,因此尽量使用组合方法。封装和重用常用的业务方法以及相关工具,避免在其他类中重复编写,简化类结构;面向接口编程;使用主要类型;避免对象过度使用。
2、尽可能使用数据库连接池:在实际开发中经常使用数据库连接池来提高系统性能。使用应用服务器维护数据库连接池,这样就不需要在每个事务处理开始时创建一个新的连接。
3、给Web容器配置合理的线程数量来处理客户端http请求:最小的线程数量为容器处理请求的平均数,最大值为系统在高峰期处理的请求数,Web容器中线程的个数最好不要多于Web服务器中线程的个数。
4、根据实际设置java虚拟机中堆空间的大小。这样可以使得垃圾回收器运行的时间间隔被控制在一个合理的范围内,减少不必要的系统开销。
5、使用框架提高系统效率。
6、将经常被访问的servlet或jsp缓存起来,能够减少响应的时间,提高系统的性能。
7、合理配置线程池的大小使得能够在平均负载和高峰期都能很好处理EJB请求。
8、优化I\O性能:实际应用中,尽量少使用System.out打印调试信息。
9、优化查询:在模型设计时考虑冗余相对不会变化的数据。
10、对session进行合理管理与设置。根据实际对内存中可能存在的session的个数设置一个合适的值。 -
EJB远程访问和本地访问方式
2015-09-11 21:37:54现在初次接触EJB,对于EJB的技术简介和经典理论,我们这里不详细讲述,今天我们主要介绍EJB中两种访问方式以及在这个demo中遇到的问题和解决方法。...首先我们要知道最基础的知识,远程访问我们通过注解@Remote现在初次接触EJB,对于EJB的技术简介和经典理论,我们这里不详细讲述,今天我们主要介绍EJB中两种访问方式以及在这个demo中遇到的问题和解决方法。
EJB支持两种客户端的访问,一种是远程客户端访问,以及客户端与其调用的EJB对象不在一个JVM进程中,另外一种就是本地访问,和第一种相反,客户端和EJB对象同在一个JVM进程中。首先我们要知道最基础的知识,远程访问我们通过注解@Remote来定义企业Bean,本地访问,我们通过@Local来定义。在这里关于远程客户端和本地客户端的特点,我们不介绍了,内容很好理解。下面我们用两个时序图来表示这两种调用方式,由此来分析两种不同访问方式的区别:
远程访问调用方式:
本地访问调用方式:
从时序图中可以很明显的看出区别在于本地访问客户端方式中不需要进行序列化和反序列号,只需要直接调用对应的方法即可。对于远程方式采用传值和本地方式采用传址意义不同就在于传值方式,本地客户端访问和远程客户端访问,对象会发生变化,而传地址方式,因为操作对象只需要知道地址,所有不管在什么样客户端访问都可以找到相应的对象,所以对象不会发生变化。
安装JBoss和开发部署程序这里不详细介绍了,重点放在Demo实现过程中。
首先建立EJB Project项目,开发服务端:
我们需要编写一个接口和一个实现类:
注意,我这里有两个接口分别为:UserManager和UserManagerLocal,因为我用的是Jboss-5.5.1-GA,这个版本的JBoss和4.0版本的JBoss的有点不同就在于@Remote和@Local注解不能同时使用,会抛出这种异常:
org.jboss.deployers.spi.DeploymentException: Error deploying Ejb_03.jar: Cannot designate both javax.ejb.Local and javax.ejb.Remote annotations without 'value' attribute on UserManagerBean. [EJBTHREE-1025]
他的意思就是说,同一个EJB的Bean对象不能有两种不同的访问方式,因为采用远程和本地bean在JNDI查找的过程中都是以同一个名字进行查找的,如果需要有两种访问方式,我们要为其准备一个value值,指定其具体的访问方式,所以我们采用的解决方法就是,多编写一个接口类,指定为local,也就是UserManagerLocal,并且在bean对象中为不同的方式指定具体的类:
package com.bjsxt.ejb; import javax.ejb.Local; import javax.ejb.Remote; import javax.ejb.Stateless; @Stateless @Remote({UserManager.class}) @Local({UserManagerLocal.class}) public class UserManagerBean implements UserManager,UserManagerLocal { public void addUser(User user) { System.out.println("User[username="+user.getUsername()+"]已经被成功保存"); user.setId(10); } }
编写客户端:
我们在写客户端程序的时候:
import javax.naming.InitialContext; public class UserManagerClient { /** * @param args * 远程访问必须要序列化,所以用户类要实现Serializable接口 */ public static void main(String[] args) throws Exception{ InitialContext context=new InitialContext(); UserManager userManager=(UserManager)context.lookup("UserManagerBean/remote"); User user=new User(); user.setUsername("肖红"); user.setPassword("xiaohong"); userManager.addUser(user); System.out.println("用户信息已经被成功保存,它的ID是:"+user.getId()); } }
我们编写本地客户端(ejb_03_webclient):
在页面中进行调用:
<% InitialContext context=new InitialContext(); UserManager userManager=(UserManager)context.lookup("UserManagerBean/remote"); User user=new User(); user.setUsername("张三"); user.setPassword("zhangsan"); userManager.addUser(user); out.println("用户信息已经被成功保存,它的ID是:"+user.getId()); %>
因为我们采用的远程方式remote,虽然将服务端和本地端部署到同一个JBoss服务器上,也就是用的本地客户端:
运行程序,然后进行访问:http://localhost:8081/ejb_03_webclient/
访问结果为:
采用本地local:
<% InitialContext context=new InitialContext(); UserManagerLocal userManagerlocal=(UserManagerLocal)context.lookup("UserManagerBean/local"); User user=new User(); user.setUsername("张三"); user.setPassword("zhangsan"); userManagerlocal.addUser(user); out.println("用户信息已经被成功保存,它的ID是:"+user.getId()); %>
访问结果为:
两者出现的不同,因为虽然我们是在本地客户端进行访问,但是第一种情况我们仍然使用的是远程的访问方式,采用远程访问方式,客户端参数都会序列化。实现序列化接口以后传递是一个具体的值,这样会发生改变,客户端就不会看到原来的对象。而第二种方式是采用的本地访问方式,不需要序列化,我们从客户端传到服务端的是同一个对象,也就是我们传递的是一个地址,可以通过地址找到这个对象然后进行操作。当服务器端改变了id值,客户端会看到这种改变。
下面分析一下我遇到的问题以及解决方法:
在这个过程中我遇到了这样一个问题:“java.lang.ClassCastException: $Proxy103 cannot be cast tocom.tgb.ejb.UserManager”:
这个问题的解决方法就是修改:
G:\TGB\zhongjianjian\jboss-5.0.1.GA\server\default\deployers\jbossweb.deployer\META-INF\ war-deployers-jboss-beans.xml中的UseJBossWebLoader值:
<propertyname="useJBossWebLoader">false</property>将false修改为true,然后重启JBoss,
另外一个典型的问题就是关于端口号占用,当我们的程序出现这个问题后我们可以查看占用端口号的程序将其关闭释放出端口号,或者修改我们本程序的端口号,我采用的是修改我们本程序的端口号:找到G:\TGB\zhongjianjian\jboss-5.0.1.GA\server\default\deploy\jbossweb.sar\ server.xml文件,修改端口号为8081:
<Connector protocol="HTTP/1.1" port="8081" address="${jboss.bind.address}" connectionTimeout="20000" redirectPort="8443" />
port端口号由8080修改为8081。
虽然解决掉这些问题也用了我很长时间,但是就是在这样的不断磨练中锻炼了自己使用搜索引擎的能力,我们不怕遇到问题,我们喜欢遇到问题,因为这是这样一个一个的问题让我们长了见识,懂了知识。
-
EJB学习笔记-4-web应用访问EJB(remote)
2017-06-19 08:36:02首先将ejb的接口文件jar包导入web项目下的lib目录中 如下是jsp文件编码: String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.... -
来点“硬菜”-----谈谈EJB和Web服务
2018-03-15 22:17:58导读: 最近两天看到的新闻就是Oracle将JavaEE卖给了Eclipse基金会,这边卖完之后就让Eclipse基金会改名字改LOGO,这...今天要和大家分享的知识点同样是JakartaEE(也就是我们的JavaEE)中的经典概念:EJB组件化开... -
EJB
2019-06-11 09:01:38EJB 1、J2EE 是什么? J2EE 是Sun 公司提出的多层(multi-diered),分布式(distributed),基于组件(component-base)的企 业级应用模型(enterpriese application model).在这样的一个应用系统中,可按照功能划分... -
转:websphere ejb 远程/本地调用总结
2007-03-27 11:11:48转:http://lcllcl987.iteye.com/blog/53957 -
Spring - Java/J2EE Application Framework 应用框架 第 16 章 通过Spring使用远程访问和web服务
2017-02-15 23:20:10第 16 章 通过Spring使用远程访问和web服务 16.1. 简介 Spring提供类用于集成各种远程访问技术。这种对远程访问的支持可以降低你在用POJO实现支持远程访问业务时的开发难度。目前,Spring... -
远程EJB使用
2016-01-07 16:39:50urn:jboss:domain:remoting Socket端口配置 ejb-security-realm 远程调用EJB总共以下几个步骤 第一步 写服务器端service ...远程EJB一定要写接口,学过EJB的都知道本地EJB是可以无接口的。 这里为了简 -
Java EE 远程客户的访问EJB实现实例(GlassFish)
2016-05-29 00:49:06这篇文章简单实现在Java EE7 下实现远程客户端访问Java EE服务器EJB的功能 准备工作: JDK9(jdk-8u92)netbeans-8.1 Java ee sdk (java_ee_sdk-7u2)全部安装完成netbeans启用Java SE 和 Java EE相关插件 创建... -
EJB远程接口调用
2017-03-28 17:56:00一.EJB简介 EJB是sun的JavaEE服务器端组件模型,设计目标与核心应用是部署分布式应用程序。简单来说就是把已经编写好的程序(即:类)打包放在服务器上执行。凭借java跨平台的优势,用EJB技术部署的分布式系统... -
20220323 java学习笔记-----J2EE与EJB
2022-03-22 11:49:43服务器端构件:web构件(Servlet与JSP)EJBs 服务:J2EE平台提供商实现 Service API(开发时使用)和运行时服务 通信:由容器提供的支持协作构件之间的通讯 J2EE常用的术语: (1)Web服务器:在Internet上的... -
无状态远程会话bean连接服务器出错EJBCLIENT000079: Unable to discover destination for request
2020-10-04 20:37:16依旧标题吸引和我犯同样错误的人,内容是解决和心路历程 `public static void main(String[] args) { ... jndiProperties.put(Context.URL_PKG_PREFIXES,"org.jboss.ejb.client.naming"); jndiProperties.put -
远程通信(RPC,Webservice,RMI,JMS、EJB、JNDI的区别)对比
2015-06-27 09:17:49RPC(Remote Procedure Call Protocol)RPC使用C/S方式,采用http协议,发送请求到服务器,等待服务器返回结果。这个请求包括一个参数集和一个文本集,通常形成“classname.method... Web ServiceWeb Service提供的服 -
【EJB系列】(二)——JBOSS7中EJB的远程调用和本地调用
2016-04-11 18:36:32导读 因为JBOSS6,7版本在EJB的本地调用和远程调用的写法上不同于之前的版本。所以在本篇文章中将给出代码实例,仅供参考。... 它可以是Web组件(如:JSP、Servlet)、应用客户端或其他的EJB 对客户端来说 -
EJB之客户端访问接口
2015-07-28 21:02:12谈到EJB不得不做的第一个决定是:EJB要支持什么样的客户端?因为不同的客户端其访问方式也将不同,访问的方式也会影响性能,尤其是分布式的系统更要考虑性能,所以我们在综合考虑后一定要择优选择。 这次就来个... -
【EJB】Developing EJB Applications -- Chapter6(EJB应用安全)
2017-05-07 09:45:35EJB应用安全 6.1 安全身份 6.1.1关于EJB安全身份 EJB可以指定在调用其他组件上的方法时使用的身份...当您要构建分段安全模型时,使用特定的安全角色非常有用 - 例如,仅将一组组件的访问权限于内部EJB。 -
解决JBoss不能远程访问只能使用localhost或127.0.0.1在本机访问
2015-01-13 20:07:06今天公司测试环境需要使用JBoss,开发人员在windows 2003...首先从防火墙开始排查,将所有防火墙策略关闭还是不行,到网上一搜索,很多人遇到过类似问题,原因是JBoss4.2以后版本默认关闭了远程访问服务。 整理 -
使用SPRING提供远程和WEB服务
2017-05-27 17:44:0924.1 介绍 ...Spring提供了使用多种技术...远程访问支持使得具有远程访问功能的服务开发变得相当简单,而这些服务由普通的 (Spring) POJO实现。目前,Spring支持以下几种远程技术: 远程方法调用(RMI)。通过 -
传智播客-web service(3)-web service与SOA、web service与ejb
2010-02-10 23:22:00Web Service与SOAweb service是解决跨平台(OS)、跨语言(java、C等)系统间协作的一种技术方案。既然是跨语言,所以其语言定义规范(WSDL)里没有“类”、“方法”这样面向对象语言才会有的概念。而是有“端口”... -
远程客户端跨JVM访问EJB
2009-06-07 16:15:00即本地客户端,远程客户端和web服务客户端。 所谓本地客户端,就是其必须与所要访问的的Bean在同一个JVM中,对于远程客户端无此限制,可以在同一个JVM中,也可 以不在通一个JVM中。Web服务客户端也可以以两种方式... -
什么是EJB?EJB到底是什么?
2020-06-24 16:00:37既然说了EJB 是为了"服务集群"和"企业级开发",那么,总得说说什么是所谓的"服务 集群"和"企业级开发"吧! 这个问题其实挺关键的,因为J2EE 中并没有说明白,也没有具体的指标或者事例告诉 广大程序员什么时候用EJB ... -
EJB3.0介绍
2017-05-11 18:09:15Enterprice JavaBeans是一个用于分布式业务应用的标准服务端组件模型。采用Enterprice JavaBeans架构编写的应用是可伸缩的、事务性的、多用户安全的。...采用ejb编写的这些应用,可以部署在任何支持Enterprice Jav -
【中间件技术】第三部分 Java企业版规范与中间件(7) EJB构件基础
2022-01-22 22:47:53第 7 章 EJB 构件基础 ...象技术都会使用某个特定的远程方法调用协议,EJB 中最常用的远程方法调用协议是 RMI/IIOP。不论其采用什么具体的远程方法调用协议,现有分布式对象技术一般均采用第 一章提到的 S -
调用本地会话Bean和远程会话BEAN/EJB
2019-04-09 11:29:50一个小的调用本地EJB的作业,不难,接口什么的非常好写,但是由于网上的jndi千奇百怪,而且这个东西太老了,我上课也没听,导致只能搞个远程的,本地的概念什么的都不是很清楚,所以弄了很久。 一会有空总结一下,... -
JavaEE的过往EJB、JNDI、Servlet、JSP、JMS、JTA等规范
2016-11-25 16:09:31JavaEE规范涉及的内容很多,这里只对EJB、JNDI、Servlet、JSP、JMS、JTA等规范做一个对比说明。 1、 从EJB这个失败的规范理解微服务的后端服务 说起JavaEE规范,要先从EJB(Enterprise Java Bean),他是一种用... -
EJB详解
2017-12-10 15:35:04前言从最开始学习javaEE的时候,Ejb的传说就开始漫天飞,而且特别懵根本不知道Ejb是容器还是组件!为什么他就是核心了呢?为什么他就可以分布在不同的服务器上呢?还可以远程调用,还有就是什么是javabean啊,简直...