2012-11-22 98 views
0

这里相同输出的代码示例我想获取无状态和有状态会话bean

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" 
    pageEncoding="ISO-8859-1"%> 
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> 
<title>Sample1</title> 
</head> 
<body> 
<form action="ActionServlet" method="post"> 
<h1>This is inside sample1</h1> 
<input type="submit"> 
</form> 
</body> 
</html> 

周一公布,2012年11月19日下午10时58分十一秒悄悄话 报价 下面是示例代码我试图

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" 
    pageEncoding="ISO-8859-1"%> 
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> 
<title>Sample1</title> 
</head> 
<body> 
<form action="ActionServlet" method="post"> 
<h1>This is inside sample1</h1> 
<input type="submit"> 
</form> 
</body> 
</html> 

上点击提交,控制导航到SERVLET命名的ActionServlet

public class ActionServlet extends HttpServlet { 
    private static final long serialVersionUID = 1L; 

    /** 
    * Default constructor. 
    */ 
    public ActionServlet() { 
     // TODO Auto-generated constructor stub 
    } 

    /** 
    * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 
    */ 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     // TODO Auto-generated method stub 
     doPost(request, response); 
    } 

    /** 
    * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 
    */ 
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     // TODO Auto-generated method stub 
     System.out.println("This is inside doPost method for action servlet"); 

     System.out.println("Before calling EJB for action servlet"); 
     try{ 
      Context ic = new InitialContext(); 

      //first instance creation 
      StateFulServiceHome home=(StateFulServiceHome)ic.lookup("Stateful1234"); 
      StateFulService sample=(StateFulService)home.create(); 
      sample.setName("Hello1223"); 
      sample.getName(); 
      //second instance creation 
      Context ic1 = new InitialContext(); 
      StateFulServiceHome home1=(StateFulServiceHome)ic1.lookup("Stateful1234"); 
      StateFulService sample1=(StateFulService)home1.create(); 
      sample1.getName(); 
     }catch (Exception e) { 
      e.printStackTrace(); 
     } 
     System.out.println("After calling EJB in action servlet1"); 
     request.getRequestDispatcher("Sample2.jsp").forward(request,response); 

    } 

} 

的ActionServlet上的bean有状态会话bean

public class StateFulBean implements SessionBean{ 
    String name; 
    public void setName(String name)throws RemoteException{ 
     this.name =name; 
    } 
    private SessionContext context; 
    public void ejbActivate() throws EJBException, RemoteException { 
     // TODO Auto-generated method stub 
     System.out.println("*********This is inside ejbActivate method***********"); 

    } 

    public void ejbPassivate() throws EJBException, RemoteException { 
     // TODO Auto-generated method stub 
     System.out.println("*********This is inside ejbpassivate method***********"); 

    } 

    public void ejbRemove() throws EJBException, RemoteException { 
     // TODO Auto-generated method stub 
     System.out.println("*********This is inside Ejb remove method***********"); 

    } 
    public void ejbCreate() throws EJBException,RemoteException{ 
     System.out.println("*********This is inside create method***********"); 
    } 
    public void setSessionContext(SessionContext ctx) throws EJBException, 
      RemoteException { 
     // TODO Auto-generated method stub 
     context=ctx; 
     System.out.println("*********This is for set session context***********"); 
    } 
    public void getName()throws RemoteException{ 
     System.out.println("***********This is for start of getting business method*****"); 
     System.out.println("The name obtained is"+this.name); 
     System.out.println("***********This is for end of getting business method*****"); 
    } 

} 

    public interface StateFulService extends EJBObject { 
    public void getName()throws RemoteException; 
    public void setName(String name)throws RemoteException; 
} 



    public interface StateFulServiceHome extends EJBHome { 
    public StateFulService create() throws RemoteException,CreateException; 
} 

,最后我的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> 
<enterprise-beans> 
    <session> 
     <ejb-name>Stateful1234</ejb-name> 
     <home>StateFulServiceHome</home> 
     <remote>StateFulService</remote> 
     <ejb-class>StateFulBean</ejb-class> 
     <session-type>Stateful</session-type> 
     <transaction-type>Container</transaction-type> 
    </session> 
</enterprise-beans> 
</ejb-jar> 

我越来越有状态和无状态会话bean相同的输出,调用业务方法我假设是当我的bean被定义为有状态的时候,我应该在第二次查找bean的时候得到这个名字。

让我知道,如果我错了某处。

-Shyam

回答

0

我的假设是,当我的bean被定义为有状态,bean的查找第二次时我应该得到的名称。

这不是有状态的会话bean的工作方式。当您使用有状态会话bean时,您可以将代理存储到“某处”的bean,即当容器在某段时间内不调用它的方法时,该容器会将其钝化。如果在bean销毁之前随时通过代理发出后续请求,容器将“记住”客户端(您的情况为servlet)。换句话说,后续的调用会记住会话状态,因此会记录会话bean的状态。您可以将状态存储在会话Bean中,即使是跨HTTP请求(因此,存储对代理的引用的原因)。

请注意,这与查找很少有关。在您的代码中:

//first instance creation 
StateFulServiceHome home=(StateFulServiceHome)ic.lookup("Stateful1234"); 
StateFulService sample=(StateFulService)home.create(); 
sample.setName("Hello1223"); 
sample.getName(); 
//second instance creation 
Context ic1 = new InitialContext(); 
StateFulServiceHome home1=(StateFulServiceHome)ic1.lookup("Stateful1234"); 
StateFulService sample1=(StateFulService)home1.create(); 
sample1.getName(); 

您已经创建了会话bean的两个实例,并且您有两个代理。第二个bean显然不会知道第一个存储的状态。

要考虑无状态会话bean,那么你需要记住,存储对其代理的引用是有点没有意义的,特别是在HttpSession对象中。这主要是因为存储在bean中的状态只在方法调用期间有效。 EJB容器管理一个无状态会话Bean池,每个调用可能涉及池中不同的未使用实例。

PS - 你有什么理由说明你现在在学习EJB 2.x吗?它不仅旧,在Java EE 6应用程序中不再需要它的一部分,而且在Java EE 7中正在修剪某些部分(实体bean)。