专稿:实战EJB之二 开发会话Bean(无状态会话Bean)

【EJB】会话Bean(Session Bean) 很多程序员,整天沉浸在业务代码的 CRUD 中,业务中没有大量数据做并发,缺少实战经验,对并发仅仅停留在了解,做不到精通,所以总是与大厂擦肩而过。我把私藏的这套并发体系的笔记和思维脑图分享出来,理论知识与项目实战的结合,我觉得只要你肯花时间用心学完这些,一定可以快速掌握并发编程。《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取! 阅读详情
<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script> Untitled Document

实战EJB系列

在以后的日子里,将由Jackliu向大家陆续提供一系列EJB教程,有学习EJB的朋友请同步参考EJB相关书籍,实战系列将以例程的方式帮助你理解这些基本的概念,其中将包括:

所有章节完毕后将制作成pdf电子文档,供大家下载。

实战EJB之二 开发会话Bean(无状态会话Bean)

会话Bean可以分为有状态会话Bean(stateful Bean)和无状态会话Bean(stateless Bean),有状态会话Bean可以在客户访问之间保存数据,而无状态会话Bean不会在客户访问之间保存数据。两者都实现了javax.ejb.SessionBean接口,EJB容器区通过部署文件ejb-jar.xml来判断是否为一个SessionBean提供保存状态的服务,另外,在程序实现上,无状态Bean不能声明实例变量,每个方法只能操作方法传来的参数。实际上,我们第一节中的第一个EJB程序就是一个无状态Session Bean。

在本节中你将了解到:

  • 什么是无状态Session Bean?
  • 无状态Session Bean寿命周期
  • 编写一个无状态Session Bean程序
  • 部署到应用服务器
  • 开发和部署测试程序
  • 运行测试程序
什么是无状态Session Bean?

无状态Session Bean每次调用只对客户提供业务逻辑,但不保存客户端的任何数据状态。但并不意味着stateless类型的Bean没有状态,而是这些状态被保持在客户端,容器不负责管理。如《再别康桥》中写到的"悄悄的我走了,正如我悄悄的来。挥一挥衣袖,不带走一片云彩"。

无状态Session Bean在EJB中是最简单的一种Bean,如果数据实际上是数据的瞬像,则建议使用无状态会话Bean。但是无状态会话Bean也有自己的问题,本该存储在服务器端(J2EE服务器)的数据被存储在客户中,每次调用这些数据都要以参数的方式传递给Bean,如果是一个比较复杂的数据集合,则网络需要传递大量数据,造成更多的负载。在客户端维护状态还要注意安全性问题,如果数据状态非常敏感,则不要使用无状态会话Bean,这些情况可以使用状态会话Bean,将用户状态保存到服务器中。

无状态Session Bean寿命周期

无状态Session Bean寿命周期由容器控制,Bean的客户并不实际拥有Bean的直接引用,当我们部署一个EJB时,容器会为这个Bean分配几个实例到组件池(component pooling)中,当客户请求一个Bean时,J2EE服务器将一个预先被实例化的Bean分配出去,在客户的一次会话里,可以只引用一次Bean,就可以执行这个Bean的多个方法。如果又有客户请求同样一个Bean,容器检查池中空闲的Bean(不在方法中或事务中,如果一个客户长时间引用一个Bean但执行一个方法后需要等待一段时间再执行另一个方法,则这段时间也是空闲的),如果全部的实例都已用完则会自动生成一个新的实例放到池中,并分配给请求者。当负载减少时,池会自动管理Bean实例的数量,将多余的实例从池中释放。 无状态Session Bean有两种状态:存在或不存在。

<图2-1>

当客户端不存在一个无状态Session Bean时,通过远程主接口的create()方法创建一个Bean,newInstance()负责将Bean实例化,EJB容器调用Bean类的setSessionContext()方法把运行环境对象SessionContext传递给Bean;随后调用Bean的ejbCreate方法进行必要的初始化和资源分配。在下面这个实战例子中,Bean的实现类就是StatelessDateEJB类。

编写一个无状态的Session Bean程序

这个Session Bean组件提供一个日期计算器,通过getDayInRange()方法计算两个日期之间相差的天数,通过getDayForOlympic()得到距离北京申办2008年奥林匹克运动会天数。并且我们为这个Bean起名为StatelessDate

设计一个无状态的Session Bean至少包括四个步骤:

  1. 开发主接口
  2. 开发组件接口
  3. 开发Bean实现类
  4. 编写部署文件

注意:本节假设你使用的Windows操作系统。如果使用其他操作系统,可能影响到存储路径和JDK命令,但这与程序代码和部署文件内容无关。

1.开发主接口(StatelessDateHome.java):

是由Bean开发人员编写的一个Bean的主接口(interface)程序,负责控制一个Bean的生命周期(生成、删除、查找Bean)。只需要开发人员给出一个主接口类,类方法的实现由容器来完成。 主接口扩展了javax.ejb.EJBHome接口,参考avax.ejb.EJBHome接口定义如下:




 package javax.ejb;

 import java.rmi.Remote;

 import java.rmi.RemoteException;

  

 public interface EJBHome extends Remote{

  public abstract EJBMetaData getEJBMetaData() throws RemoteException;

  public abstract HomeHandle getHomeHandle() throws RemoteException;

  public abstract void remove(Object obj) throws RemoteException,RemoveException;

  public abstract void remove(Handle handle) throws RemoteException,RemoveException;

 }
    • 方法getEJBMetaData()返回EJBMetaData接口的引用,取得Bean的信息,EJBMetaData不是远程接口。这个类扩展了java.io.Serializable,所以可序列化,具有序列化的特性
    • 方法getHomeHandle()返回主对象的句柄,句柄是主接口StatelessDateHome的持久性引用,这个类扩展了java.io.Serializable,所以可序列化,具有序列化的特性,HomeHandle 对象可以传递给另一个JVM,且不传递安全信息,这样新的应用可以不使用JNDI来查找对象既可以获得这个主接口,并来创建和获得Bean实例。
    • 方法remove()用来删除一个Bean的实例,对于一个会话Bean,执行Remove操作将引用的Bean返回到池中,由池来管理其生命周期。

一般情况下,习惯将主接口的命名规则规定为<bean-name>Home,所以我们把这个主接口类起名为StatelessDateHome

大部分逻辑方法已经被EJBHome定义,在我们要设计的远程主接口StatelessDateHome里,不必再重新定义。值得注意的是,我们需要为这个接口定义一个create()方法,用来获得一个实例Bean的引用,返回的对象类型是组件接口类StatelessDate。

StatelessDateHome.java代码:


import java.rmi.RemoteException;

import javax.ejb.CreateException;

import javax.ejb.EJBHome;



public interface StatelessDateHome extends EJBHome{

 public StatelessDate create() throws RemoteException,CreateException;

}

假设我们保存到D:/ejb/StatelessDate/src/StatelessDateHome .java

2.开发组件接口(StatelessDate.java):

当远程用户调用主接口类生成方法(create())时,客户要得到一个组件的远程引用,因此EJB容器要求你为这个Bean的所有方法提供一个接口类,而类的实现则与远程主接口StatelessDateHome 一样由容器在部署时自动生成。

组件接口扩展了avax.ejb.EJBObject接口,参考avax.ejb.EJBObject接口定义如下:




 package javax.ejb;

 import java.rmi.Remote;

 import java.rmi.RemoteException;

  

 public interface EJBObject extends Remote{

   public abstract EJBHome getEJBHome() throws RemoteException;

   public abstract Handle getHandle() throws RemoteException;

   public abstract Object getPrimaryKey() throws RemoteException;

   public abstract boolean isIdentical(EJBObject ejbobject) throws RemoteException;

   public abstract void remove() throws RemoteException,RemoveException;

 }
    • 方法getEJBHome()返回远程主接口对象的引用
    • 方法getHandle() 当前组件接口对象的句柄,和远程主接口的句柄HomeHandle一样,这个对象是被序列化的,所以可以保存到本地或通过RMI/IIOP协议传输给其他JVM上的客户使用,而免去JNDI查找和调用主接口的create方法,只要执行Handle.getEJBObject()方法即可取得这个Bean实例的引用。
    • getPrimaryKey()方法一般用于Entity Bean,如果在Session Bean中调用,抛出java.rmi.RemoteException。
    • 方法isIdentical()用于对当前引用的Bean实例和另一Bean实例进行比较,因为即便是Bean实例相同但有可能不是来自同一个引用,不能使用equals()方法。
    • 方法remove() 删除当前引用的Bean实例,由容器来决定是否真的释放气内存,通常会返换到组件池中。注意删除之后要将对象的引用指向为null。

一般情况下,习惯将组件接口的命名规则规定为<bean-name>,所以我们把这个组件接口类起名为StatelessDate

大部分逻辑方法已经被EJBObject 定义,在我们要设计的组件接口StatelessDate里,不必再重新定义,只要我们重申组件中有关业务逻辑的接口即可。逻辑方法getDayInRange()得到两个日期间的天数间隔,如果输入的时间非法或不合适将抛出InsufficientDateException异常。逻辑方法getDayForOlympic()得到距离北京申办奥运会的天数,如果输入的时间非法或不合适将抛出InsufficientDateException异常。

StatelessDate.java代码:


import javax.ejb.EJBObject;

import java.rmi.RemoteException;

import java.util.Date;



public interface StatelessDate extends EJBObject{

 public int getDayInRange(Date lowerLimitDate,Date upperLimitDate) 

     throws RemoteException,InsufficientDateException;

 public int getDayForOlympic()

     throws RemoteException,InsufficientDateException;

}

假设我们保存到D:/ejb/StatelessDate/src/StatelessDate .java

InsufficientDateException.java代码:


public class InsufficientDateException extends java.lang.Exception{

        public InsufficientDateException(){}

}



假设我们保存到D:/ejb/StatelessDate/src/InsufficientDateException.java

3.开发Bean实现类(StatelessDateEJB.java):

这个类包含了业务逻辑的所有详细设计细节。会话Bean的实现类实现了(implements)javax.ejb.SessionBean所定义的接口,首先我们先熟悉一下SessionBean的定义:


package javax.ejb;

impot java.rmi.RemoteException;



public interface SessionBean extends EnterpriseBean{

  public void setSessionContext(SessionContext ctx) throws EJBException,RemoteException;

public void ejbRemove() throws EJBException,RemoteException;

public void ejbActivae()throws EJBException,RemoteException;

public void ejbPassivate()throws EJBException,RemoteException;

}

容器通过这些方法将相关信息通知给Bean实例,所有的方法都抛出RemoveException方法是为了与1.0规范兼容,之后版本编写的Bean只需要抛出EJBException即可。

setSessionContext()方法将会话的语境放到对象变量中,容器在结束会话Bean或自动超时死亡之前将会自动调用ejbRemove()方法,所以在此可以填入用来释放某些资源的代码。当实例被钝化或被激活时,调用ejbActivae()和ejbPassivate()方法,无状态会话Bean不会发生这些情况,在下一节将介绍。

一般情况下,习惯将组件实现类的命名规则规定为<bean-name>EJB,所以我们把这个组件类起名为StatelessDateEJB

类StatelessDateEJB声明要实现SessionBean的定义,所以,对于StatelessDateEJB类,我们必须完全实现SessionBean的接口定义。

StatelessDateEJB.java代码:




import javax.ejb.*;

import java.util.Date;



public class StatelessDateEJB implements SessionBean{

 public void ejbCreate(){}

 public void ejbRemove(){}

 public void ejbActivate(){}

 public void ejbPassivate(){}

 public void setSessionContext(SessionContext ctx){}

 

 //计算两个日期之间相隔的天数

 public int getDayInRange(Date lowerLimitDate,Date upperLimitDate)

   throws InsufficientDateException{

   

   long upperTime,lowerTime;

   upperTime=upperLimitDate.getTime();

   lowerTime=lowerLimitDate.getTime();

   if(upperTime<lowerTime)

     throw new InsufficientDateException();

   Long result=new Long((upperTime-lowerTime)/(1000*60*60*24));

   return result.intValue();   

 }

 

 //得到距离2008年奥运会天数

 public int getDayForOlympic()

   throws InsufficientDateException {

   

   Date olympic=new Date("2008/01/01");

   Date today=new Date(System.currentTimeMillis());   

    return getDayInRange(today,olympic);

 }

}

假设我们保存到D:/ejb/StatelessDate/src/StatelessDateEJB .java

到此为止我们的Bean程序StatelessDate已经编写完毕了,使用如下命令进行编译:


cd bean/StatelessDate/src 

mkdir classes 

cd src 

javac -classpath %CLASSPATH%;../classes -d ../classes  InsufficientDateException.java 
StatelessDate.java StatelessDateHome.java StatelessDateEJB.java

如果顺利你将可以在../StatelessDate/classes目录下发现有四个类文件。

4.编写部署文件:

一个完整的ejb是由java类和一个描述其特性的ejb-jar.xml文件组成,部署工具将根据这些文件部署到容器中,并自动生成容器所需的残根类。

按照下面个格式编写一个ejb-jar.xml文件,对于DTD介绍此处省去。

ejb-jar.xml文件:


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

<!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN" "http://java.sun.com/dtd/ejb-jar_2_0.dtd">

<ejb-jar>

    <description>    

        This is StatelessDate EJB example

    </description>

    <display-name>StatelessDateBean</display-name>

    <enterprise-beans>

        <session>

            <display-name>StatelessDate</display-name>

            <ejb-name>StatelessDate</ejb-name>

            <home>StatelessDateHome</home>

            <remote>StatelessDate</remote>

            <ejb-class>StatelessDateEJB</ejb-class>

            <session-type>Stateless</session-type>

            <transaction-type>Container</transaction-type>

        </session>

    </enterprise-beans>

</ejb-jar>

假设我们保存到D:/ejb/StatelessDate/classes/META-INF/ejb-jar.xml(注意META-INF必须大写)

现在让我们看看当前的目录结构:




StatelessDate 
       <文件夹>

  classes
       <文件夹>

    META-INF
       <文件夹>

       ejb-jar.xml

    InsufficientDateException.class

    StatelessDate.class

    StatelessDateEJB.class

    StatelessDateHome.class

 src
       <文件夹>

   InsufficientDateException.java

   StatelessDate.java

   StatelessDateEJB.java

   StatelessDateHome.java



部署到应用服务器

在部署之前我们需要将这些类文件和xml文件做成一个jar文件,EJB JAR文件代表一个可被部署的JAR库,在这个库里,包含了服务器代码与EJB模块的配置。ejb-jar.xml文件被放置在JAR文件所指定的META-INF目录中。我们可以使用如下命令得到EJB JAR文件:




cd d:/ejb/StatelessDate/classes    (要保证类文件在这个目录下,且有一个META-INF子目录存放ejb-jar.xml文件)

jar -cvf  StatelessDate.jar *.*

确保statelessDate.jar文件包括的文件目录格式如下:




 META-INF
       <文件夹>

    ejb-jar.xml

 InsufficientDateException.class

 StatelessDate.class

 StatelessDateEJB.class

 StatelessDateHome.class

部署工具一般由Java应用服务器的制造商提供,在这里我使用了Apusic应用服务器,并讲解如何在Apusic应用服务器部署这个StatelessDate组件。 注意,如果使用其他部署工具,原理是一样的。要使用Apusic应用服务器,可以到www.apusic.com上下载试用版。

确定你的Apusic服务器已经被启动。 打开"部署工具"应用程序,点击文件->新键工程:

第一步:选择"新建包含一个 EJB组件打包后的EJB-jar模块"选项

第二步:选择一个刚才我们生成的StatelessDate.jar文件

第三步:输入一个工程名,可以随意,这里我们输入StatelessDate

第四步:输入工程存放的地址,这里我们假设被存放到D:/ejb/StatelessDate/deploy目录下

完成四个步骤后,如果没有问题将出现StatelessDateBean的部署界面,基本的参数配置已经在我们刚才编写的ejb-jar.xml中定义,可以点击部署->部署到Apusic应用服务器完成部署工作。

开发和部署测试程序

SessionBean组件是没有任何运行界面的,组件的实例被容器所管理,所以我们要测试这个Bean组件,需要写一段测试程序。这里,我们写一段小服务程序(Java Servlet)。

关于如何编写Servlet我们这里不做介绍。InitialContext 对象用来获取当前servlet小应用程序的语境,方法lookup从组件池中查找一个JNDI对象,并取得一个远程主接口的引用,java:comp/env/ejb/StatelessDate是我们刚才StatelessDate组件的JNDI名,请参考ejb-jar.xml中的 项。要注意的是,lookup()方法返回的是一个Object类型的远程主接口对象的残根,为此需要使用javax.rmi.PortableRemoteObject的narrow()方法来获取一个具体的对象引用,narrow()方法:第一个参数是lookup()方法返回的对象,第二个参数是要得到的引用类型。我们通过narrow()方法并经过造型得到了一个StatelessDateHome对象的实例引用。调用create()方法获取一个StatelessDate组件接口的实例引用,然后就可以与本地一样去引用这个实例。使用完毕后不要忘记将实例的引用指向一个Null。

下面是提供的代码:

StatelessDateServlet .java文件:




import javax.servlet.*;

import javax.servlet.http.*;

import java.io.*;

import javax.ejb.*;

import javax.naming.InitialContext;



public class StatelessDateServlet extends HttpServlet{

 public void service(HttpServletRequest req,HttpServletResponse res) throws IOException {

   res.setContentType("text/html");        

   PrintWriter out =res.getWriter();

   out.println("<html><head><title>StatelessDateServlet</title></head>");

   out.println("<body><h2>Test Result:<hr>");                

     try{

        InitialContext ctx =new InitialContext();

        Object objRef =ctx.lookup("java:comp/env/ejb/StatelessDate");

        StatelessDateHome home=(StatelessDateHome)

        javax.rmi.PortableRemoteObject.narrow(

        objRef,StatelessDateHome.class);

                            

        StatelessDate bean=home.create();

        java.util.Date lowerLimitDate= new java.util.Date(new String(req.getParameter("lowerLimitDate")));

        java.util.Date upperLimitDate= new java.util.Date(new String(req.getParameter("upperLimitDate")));

        out.println("the lowerLimitDate:" lowerLimitDate "<br>");

        out.println("the upperLimitDate:" upperLimitDate "<br>");

        out.println("the method getDayInRange() Result:" bean.getDayInRange(lowerLimitDate,upperLimitDate) " days");

        out.println("<hr>");

        out.println("the method getDayForOlympic() Result:" bean.getDayForOlympic() " days");

        bean=null;

     }catch(javax.naming.NamingException ne){

        out.println("Naming Exception caught:" ne);

        ne.printStackTrace(out);

     }catch(javax.ejb.CreateException ce){

        out.println("Create Exception caught:" ce);

        ce.printStackTrace(out);

     }catch(java.rmi.RemoteException re){

        out.println("Remote Exception caught:" re);

        re.printStackTrace(out);

     }catch(InsufficientDateException ie){

        out.println("InsufficientDate Exception caught:" ie);

        ie.printStackTrace(out);

     }

     out.println("</body></html>");       

 }               

}

假设我们将文件保存到D:/ejb/StatelessDate/src/StatelessDateServlet.java

使用如下命令编译Servlet


cd D:/ejb/StatelessDate

mkdir test

cd test

mkdir WEB-INF

cd WEB-INF

mkdir classes

cd D:/ejb/StatelessDate/src

javac -classpath %CLASSPATH%;../classes/ -d ../test/WEB-INF/classes StatelessDateServlet.java



编译成功后将这个servlet部署到与StatelessDate同一工程中,在部署前需要我们为部署编写一个web.xml,其中告诉部署工具这个servlet需要参考的一些资源和部署描述,这里我们将定义一个JNDI参考:




  <ejb-ref>

    <description></description>

    <ejb-ref-name>ejb/StatelessDate</ejb-ref-name>

    <ejb-ref-type>Session</ejb-ref-type>

    <home>StatelessDateHome</home>

    <remote>StatelessDate</remote>

    <ejb-link>StatelessDate</ejb-link>

  </ejb-ref>

告诉部署工具,这个Web模块需要参考的资源JNDI名称, 被指定参考一个SessionBean组件。

web.xml文件内容如下:


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



<!DOCTYPE web-app PUBLIC '-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN' 'http://java.sun.com/dtd/web-app_2_3.dtd'>



<web-app>

  <icon>

    <small-icon></small-icon>

    <large-icon></large-icon>

  </icon>

  <display-name>StatelessDate</display-name>

  <description></description>

  <context-param>

    <param-name>jsp.nocompile</param-name>

    <param-value>false</param-value>

  </context-param>

  <context-param>

    <param-name>jsp.usePackages</param-name>

    <param-value>true</param-value>

    <description></description>

  </context-param>

  <ejb-ref>

    <description></description>

    <ejb-ref-name>ejb/StatelessDate</ejb-ref-name>

    <ejb-ref-type>Session</ejb-ref-type>

    <home>StatelessDateHome</home>

    <remote>StatelessDate</remote>

    <ejb-link>StatelessDate</ejb-link>

  </ejb-ref>

</web-app>



假设我们将文件保存到D:/ejb/StatelessDate/test/WEB-INF/web.xml

下面我们要部署这个Servlet到J2EE服务器。J2EE Web应用可以包括Java Servlet类、JavaServer Page组件、辅助的Java类、HTML文件、媒体文件等,这些文件被集中在一个War文件中。其中War结构具有固定的格式,根目录名为WEB-INF,同一目录下应该有一个web.xml文件,用来描述被部署文件的部署信息,Jsp、html等文件可以放置在这个目录下,同时WEB-INF目录下可能存在一个classes目录用于存放Servlet程序,如果引用了一些外部资源,则可以被放置到WEB-INF/lib目录下。使用下面的命令生成这个Servlet测试程序的war文件:


cd D:/ejb/StatelessDate/test/

jar -cvf statelessDate.war *.*

确保statelessDate.war文件包括的文件目录格式如下:


WEB-INF
       <文件夹>
        

  classes
        <文件夹>
       

     StatelessDateServlet.class

  web.xml

成功编译后,将这个servlet一同部署到StatelessDate工程中,我们回到"部署工具",点击编辑-->填加一个Web模块,选择我们刚刚编译成的statelessDate.war文件 点击部署->部署到Apusic应用服务器完成部署工作。

运行测试程序

打开浏览器,在浏览器中输入:


http://localhost:6888/statelessDate/servlet/StatelessDateServlet?lowerLimitDate=2001/01/01&upperLimitDate=2001/12/31



localhost-Web Server的主机地址

:6888-应用服务器端口,根据不同的应用服务器,端口号可能不同

/statelessDate-部署servlet时指定的WWW根路径值

/servlet-ejb容器执行servlet的路径

/StatelessDateServlet-测试程序

?LowerLimitDate-参数1,起始日期

&upperLimitDate-参数2,结束日期

如果运行正常应该能够看到下面的结果

<图2-2>

EJB学习笔记——会话Bean 1.EJB3简介:EJB是企业级java bean(Enterprise Java Bean)开发技术,是基于IIOP协议的分布式远程方法调用技术(RMI),EJB3在JavaEE5中被正式引入,去掉了EJB2以前的复制度,使得EJB3更加轻量级,同时将实体Bean单独分拆成为JPA规范,从而使EJB3更加专注于会话Bean和消息驱动Bean的业务逻辑,同时EJB3中全面支持java注解方式,大大简化开发的难度提高开发效率。2.在客户端调用一个简单EJB3程序:首先使用一个简单例子演示客户端调用EJB3的基 阅读详情

相关推荐

深入理解EJB:状态会话Bean与无状态会话Bean

企业级Java Bean(EJB)是Java EE(现在称为Jakarta EE)平台的核心组件模型。它提供了一种框架,允许开发者编写可扩展、事务性和安全的服务器端业务逻辑。EJB技术的出现简化了复杂应用的开发,通过抽象各种企业级服务(如事务管理、安全认证等)来减轻开发者的负担。无状态会话Bean(Stateless Session Bean)是企业级Java Bean(EJB)的一部分,属于会话Bean的一种,它不保存客户端的状态信息。

weixin_42405592的博客 505

EJB组件

<br /><br />1、     EJB是sun的服务器端组件模型,最大的用处是部署分布式应用程序[当然,还有许多方式可以实现分布式应用],类似微软的.net技术。凭借java跨平台的优势,用EJB技术部署的分布式系统可以不限于特定的平台。<br />2、     在J2EE里,Enterprise Java Beans(EJB)称为Java 企业Bean,是Java的核心代码,分别是会话Bean(Session Bean),实体Bean(Entity Bean)和消息驱动Bean(MessageDri

dujiayuan的专栏 1035

Java EE中有状态与无状态会话Bean详解与实战

通过对无状态和有状态会话Bean在功能适用性、生命周期管理、资源消耗、并发性与可扩展性等方面的深入比较,可以看出:无状态Bean更适合构建通用服务、微服务、REST接口等无需维护状态的场景,具备高并发、易扩展、低资源消耗等优势。有状态Bean更适合需要维护客户端会话状态的业务场景,如购物车、用户会话管理等,但其资源占用高、扩展性受限,尤其在分布式环境下面临更多挑战。

weixin_28999139的博客 864

EJB中的Home与Remote接口

学习EJB过程中,看到Home接口和Remote接口经常出现,在这里整理和总结一下,希望对java初学者有一定的帮助。        从英文的角度,我们很容易想到Home代表着本地的意思,从而推出,它调用的必然是本地的方法。实际上,Home 就是用来产生EJB对象的,它也提供了产生和定位remote接口实例的方法。      而Remote,是远程的意思,调用的肯定是远程方法,对客户端来说就

劝学 6663

树莓派c语言串口通讯程序

在网上搜了很多关于树莓派串口通讯的例子,但是都是用python写的,虽然python很有名,而且最近也在学习这门语言, 但是还是想用c语言实现一下,因为需要用到整套系统里,其他内容都是用c语言写的。但是网上没有找打现成的。 还好,之前做过天嵌2440开发板的串口程序(参照天嵌工程师提供的代码),发现串口程序其实是通用的, 驱动层屏蔽了硬件细节,个人猜测,几乎所有移植好的系统的串口,都可以用一

realank的专栏 1万+

PyTorch实战:3D U-Net医学图像分割从零搭建(附完整代码)

本文详细介绍了如何使用PyTorch从零搭建3D U-Net模型进行医学图像分割,涵盖三维卷积实现、模块化架构设计、医学图像专属优化策略及完整训练流程。通过实战代码演示,帮助开发者掌握UNet-3D在CT、MRI等三维医学图像分割中的应用,提升肝脏肿瘤分割、肺结节检测等任务的准确性。

weixin_29061997的博客 329

EJB——无状态会话Bean的Remote远程接口_hotel.java

package wanggsx.ejb; /** * Remote interface for Enterprise Bean: Hello * Remote 接口 */ import wanggsx.ejb.*;import java.util.*;import javax.ejb.*;public interface hotel extends javax.ejb.EJBObject   {

程序员的良师益友 779

深入解析SAP MM模块OBYC自动科目分配机制:从T030表到实战配置

本文深入解析SAP MM模块中OBYC自动科目分配机制,阐明其作为连接物流与财务核心桥梁的作用。文章以T030表为核心,详细拆解其字段结构与检索逻辑,并通过采购收货、生产发料等实战场景,手把手演示配置步骤与关键要点,帮助读者掌握从原理到实践的完整知识体系,实现业财无缝对接。

nft7creator的博客 358

传智播客ejb学习,EJB中的三种bean及开发一个无状态会话bean

    今天继续学习ejb3.0,黎老师提到,ejb发展已经有十年了,现在国内ejb还不是很流行,学习它可能对刚开始找工作的人没什么用,不过可以了解他的原理,学习他的编程思想,更好的理解前面所学的内容。开拓知识面,站在一个更高的台阶去思考问题,ejb的发展前景会越来越好,他所占的市场份额是由分布式的应用在软件开发中的使用所决定的。黎老师主要讲了在jboss服务器上使用ejb3.0。    EJB中

TuiRoger的专栏 1524

揭秘大厂 Unity 红点系统设计:别小看右上角那颗小红点,它能把你项目搞崩

本文详细探讨了游戏大厂如何设计高性能红点系统。红点作为提升用户活跃和转化率的重要工具,需要支持多级联动、动态判断和全局一致性。系统采用观察者模式和树形结构,分为数据管理、逻辑判定、订阅通知和UI展示四大模块,通过事件驱动方式实现高效刷新。文章特别强调了解耦设计、配置化管理和性能优化,并提出了热更新、数据分析等高级应用场景。最终指出,优秀的红点系统需要架构标准化、自动化配置和团队紧密协作,是大型游戏项目的关键技术基础。

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 377

Linux C/C++ or 嵌入式面试之《C/C++笔面试系列》(10) C++ 前置后置增减运算符重载形式与比较

C语言的++、–运算符在此不讨论。 文章目录1、前置后置增减运算符重载的形式2、前置和后置运算符的性能比较 1、前置后置增减运算符重载的形式 自增运算符“++”和自减运算符“–”分别包含两个版本。即运算符前置形式(如 ++x)和运算符后置形式(如 x++),这两者进行的操作是不一样的。因此,当我们在对这两个运算符进行重载时,就必须区分前置和后置形式。C++根据参数的个数来区分前置和后置形式。如果按照通常的方法来重载 ++ 运算符(即作为成员函数重载时不带参数,或者作为非成员函数重载时带有一个参数),那么重载

二进制君 5831

EJB开发第一个无状态会话bean、开发EJBclient

开发第一个无状态会话bean EJB中的三中bean: 会话Bean(Session Bean) 负责与client交互,是编写业务逻辑的地方。在会话bean中能够通过JDBC直接操作数据库。但大多数情况下都是通过实体bean来完毕对数据库的操作。 实体Bean(Entity Bean) 它实际上属于java持久化规范(JPA)里的技术,JPA的出现主要是为了简化...

aofan9566的博客 211

Scrapy爬虫之热门网站数据爬取--------第2关

第2关:小说网站玄幻分类第一页小说爬取 任务描述 本关任务:爬目标网页的3本小说保存到本地MySQL数据库,目标网页为全书网玄幻分类首页。 注:考虑到单机(非分布式)爬虫的爬取时间和测试平台的压力,我们不爬更多页数的小说了,可以作为课下作业自己完善。 xpath匹配:循环获取相同标签下的内容 通过网页分析,我们在获取小说的章节名时,发现他们都在标签<DIV class="clearfix dirconone">下的li的a中: 这时,我们可以先把其中所有的li标签先获取到: titles = r

weixin_44949187的博客 2836

EJB——有状态的会话bean和无状态的会话bean

前面文章介绍过EJB的一些基本概念和三种bean,今天重点介绍一下会话bean中的有状态会话bean和无状态会话bean。  会话bean分为有状态的会话bean和无状态的会话bean:有状态会话bean :  每个用户有自己特有的一个实例,在用户的生存期内,bean保持了用户的信息,即“有状态”;一旦用户灭亡(调用结束或实例结束),bean的生命期也告结束。即每个用户最初都会得到一个初始的bea

邵鸿鑫 7654

《自然语言处理实战入门》文本分类 ---- 使用词向量与SVM 进行文本分类

文本分类用电脑对文本集(或其他实体或物件)按照一定的分类体系或标准进行自动分类标记。 它根据一个已经被标注的训练文档集合, 找到文档特征和文档类别之间的关系模型, 然后利用这种学习得到的关系模型对 新的文档进行类别判断 。文本分类从基于知识的方法逐渐转变为基于统计 和机器学习的方法。

shiter编写程序的艺术 2388

【STK】手把手教你利用STK进行覆盖分析05-方位覆盖分析、覆盖网络检查工具和单对象覆盖分析

这一篇是我们STK覆盖模块的理论部分的最后一篇文章,之后会找尽可能多的论文来复现论文中关于STK覆盖模块的仿真的部分,到时候大家遇到不会的就可以结合前面的理论部分来看。

weixin_44184852的博客 1493

EJB有状态的会话Bean和无状态的会话Bean的区别

在EJB里面,会话Bean分为两种,一种是有状态的会话Bean,另一种是无状态的会话Bean,本节主要讲解一下两者之间的区别。        对于有状态的会话Bean,这种情况属于,服务端与你单独开辟了一块空间与你进行交互。而客户端感觉服务端单独为他自己服务似的。而无状态的会话Bean,则服务端不提供了一个资源但是谁用都行,他不负责。所以客户端在使用的时候,则会感到这个服务 与其他人共享似的。服务

赵崇 2530

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

EJB基础一 无状态会话BEAN使用

EJB基础一 无状态会话BEAN使用 EJB是J2EE的一条标准。以往EJB被人诟病,缺点是复杂,沉重。然后spring崛起了,spring因其轻量级,开发方便而得到了迅速地推广。但是这是过去了,EJB 2.X确实存在这个特点。但新标准的EJB 3.X却在向轻量级转变,而且开发效率可以说完全与spring相当。 要进行EJB开发,必须有EJB容器,tomcat是默认没有实现EJB的。实现了EJ

ilovewqf的博客 1767

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

专稿:实战EJB之三 开发会话Bean(有状态会话Bean)

google_ad_client = "pub-8800625213955058";/* 336x280, 创建于 07-11-21 */google_ad_slot = "0989131976";google_ad_width = 336;google_ad_height = 280;//<script type="text/java

java专栏 555

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

「Java EE开发指南」用MyEclipse开发EJB 3无状态会话Bean(一)

本教程将向您展示如何用MyEclipse开发EJB 3无状态会话Bean,欢迎下载最新版IDE体验!

需要界面开发、IDE工具研发中文教程资料的小伙伴,记得私信我~ 1097

EJB系列(三)--有状态会话Bean和无状态会话Bean

EJB的基本分类     EJB分为EnterpriseBean(企业Bean)和Persistence(持久化),持久化Bean指的是Entity Bean(实体Bean,是一个代表存在于数据库中业务对象的复杂业务实体)。企业Bean又包括Session Bean(会话Bean,完成一个清晰的解耦的任务)和Message Driven Bean(MDB,消息驱动Bean,基于JMS,专门用于异

帆布鞋也能走猫步 1378

「Java EE开发指南」用MyEclipse开发EJB 3无状态会话Bean(二)

本教程将向您展示如何用MyEclipse开发EJB 3无状态会话Bean,欢迎下载最新版IDE体验!

需要界面开发、IDE工具研发中文教程资料的小伙伴,记得私信我~ 1334

EJB3.0入门经典(笔记)-无状态会话Bean

路漫漫其修远兮,吾将上下而求索 4196

EJB 有状态会话bean无状态会话bean详解

下面主要对Session  Bean讨论     现实中,很多朋友对两种session bean存在误解,认为有状态是实例一直存在,保存每次调用后的状态,并对下一次调用起作用,而认为无状态是每次调用实例化一次,不保留用户信息。仔细分析并用实践检验后,你会发现,事实恰好相反:有状态和无状态会话bean的本质区别是它们的生命期。    首先解释一个下面要用到的概念--用户:session be

eddle的专栏 1265

[原创]EJB循序渐进,手把手创建简单的无状态会话BEAN

    大家好,我是bluesky35(蓝天),好久不见了,抽空和大家交流一下EJB的有关问题,听说过或做过JAVA的人一定知道EJB(Enterprise JavaBean)的存在,EJB作为JAVA的一项重要标准,已经被广泛应用,它的状态持久性和出色的WebService表现一度令人拍案叫绝,EJB大致分为三种类型(实体Bean,会话Bean和消息驱动Bean).会话Bean又称为Sessio

bluesky35(蓝天)的专栏 2619
上一篇: 多种Java框架并存并非坏事
下一篇: 专稿:实战EJB之三 开发会话Bean(有状态会话Bean)
java169
博客等级 码龄18年 27粉丝 2568原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值