Session Bean(Stateful Session Bean) 27/04/2003

StatefulHello: Bir Durumlu Session Bean

 

Durumlu bir Session Bean aynen durumsuz bir Session Bean e benzemektedir fakat içerisinde accessor ve mutator metodları bulundurmaktadır.İmplementasyonu oldukça benzer olmakla beraber ejb-jar.xml dosyasında bean Stateful olarak tanımlanmalıdır.

 

Stateful bir Session Bean örneği önceki bölümde verdiğimiz Stateless Session Bean örneğine oldukça benzeyecektir.

 

1.     Önceki örnekteki Hello dizinin bir kopyasını oluşturarak ismini StatefulHello olarak değiştirin.Dizin yapınız oldukça benzer olacaktır.

 

 StatefulHello/HelloClient

 

HelloClient
  |
  +-- build.xml (*)
  |
  +-- index.jsp (*)
  |
  +-- WEB-INF
        |
        +-- web.xml (*)
        |
        +-- app.tld (*)
        |
        +-- struts-bean.tld (*)
        |
        +-- struts-form.tld (*)
        |
        +-- struts-html.tld (*)
        |
        +-- struts-logic.tld (*)
        |
        +-- struts-template.tld (*)
        |
        +-- struts.tld (*)
        |
        +-- struts-config.xml (*)
        |
        +-- classes
        |     |
        |     +-- com
        |           |
        |           +-- masslight
        |                 |
        |                 +-- beans
        |                 |     |
        |                 |     +-- HelloClientBean.java (*)
        |                 |
        |                 +-- actions
        |                       |
        |                       +-- GetBeanAction.java (*)
        |
        +-- lib
              |
              +-- struts.jar (*)
 
(*) bir dosyayı göstermektedir

 

2.     İstemci kodunda iki dosya dışında herşey aynı klacaktır.İstemci bean I çağıran Action sınıfı ve EJB yi çağıran istemci bean değişecektir.Action sınıfını oluşturalım.

 

StatefulHello/HelloClient/WEB-INF/classes/com/masslight/actions/GetBeanAction.java

 

package com.masslight.actions;

 

import java.util.Vector;

import java.io.IOException;

import java.lang.reflect.InvocationTargetException;

import java.util.Locale;

import java.util.Hashtable;

import javax.servlet.*;

import javax.servlet.http.*;

import org.apache.struts.action.*;

import org.apache.struts.util.*;

 

import com.masslight.beans.HelloClientBean;

 

public final class GetBeanAction extends Action {

 

   

    public GetBeanAction() {

    }

 

    public ActionForward perform(ActionMapping mapping,

                                 ActionForm form,

                                 HttpServletRequest request,

                                 HttpServletResponse response)

    throws IOException, ServletException {

 

        HttpSession session = request.getSession();

 

        HelloClientBean clientbean = new HelloClientBean();

        clientbean.startup();

        session.setAttribute("greeting", clientbean.sayGreeting("stateful EJB den merhaba!"));

 

        return (mapping.findForward("success"));

    }

}

 

3.     İstemci Bean I oluşturalım

 

Hello/HelloClient/WEB-INF/classes/com/masslight/beans/HelloClientBean.java

 

package com.masslight.beans;

 

import javax.naming.*;

import java.util.Hashtable;

import javax.rmi.PortableRemoteObject;

import javax.ejb.*;

 

public class HelloClientBean

{

    com.masslight.HelloEJBClasses.Hello hello = null;

    com.masslight.HelloEJBClasses.HelloHome home = null;

 

    public HelloClientBean() {

 

    }

 

   

    public void startup () {

        System.setProperty("java.naming.factory.initial",

                           "org.jnp.interfaces.NamingContextFactory");

        System.setProperty("java.naming.provider.url",

                           "localhost:1099");

 

        try

        {

            InitialContext jndiContext = new InitialContext();

            System.out.println("Got context \n");

 

            Object ref  = jndiContext.lookup("Hello");

            System.out.println("Got reference \n");

 

            home = (com.masslight.HelloEJBClasses.HelloHome)

                PortableRemoteObject.narrow (ref,

                 com.masslight.HelloEJBClasses.HelloHome.class);

 

            hello = home.create();

 

        }   catch(Exception e)

        {

            System.out.println(e.toString());

        }

    }

    public String sayGreeting(String greeting) {

        String output = new String("");

        try {

            output += hello.sayHello(greeting);

        }  catch(Exception e)    {

            System.out.println(e.toString());

        }

        return(output);

    }

}

 

4.     İstemci kodundan kopyaladığınızdan dolayı EJB için zaten bir dizin yapınızın bulunması gerekmektedir.

 

StatefulHello/HelloEJB

 

HelloEJB
  |
  +-- build.xml (*)
  |
  +-- META-INF
  |     |
  |     +-- ejb-jar.xml (*)
  |
  +-- com
        |
        +-- masslight
              |
              +-- HelloEJBClasses
                    |
                    +-- HelloBean.java (*)
                    |
                    +-- Hello.java (*)
                    |
                    +-- HelloHome.java (*)
 
(*) bir dosyayı gösterir

 

5.     Home Interface aynı kalmaktadır fakat EJB  nin durumlu olması ve accessor ve mutator metodlar için tüm diğer dosyaların bir değişiklikten geçmesi gerekmektedir.

 

StatefulHello/HelloEJB/com/masslight/HelloEJBClasses/HelloHome.java

 

package com.masslight.HelloEJBClasses;

import java.io.Serializable;

import java.rmi.RemoteException;

import javax.ejb.CreateException;

import javax.ejb.EJBHome;

 

 

public interface HelloHome extends EJBHome

{

   

    Hello create() throws RemoteException, CreateException;

}

 

6.     Ek olarak setGreeting ve getGreeting metodlarına sahip olan Remote Interface oluşturulmalıdır.

 

StatefulHello/HelloEJB/com/masslight/HelloEJBClasses/Hello.java

 

package com.masslight.HelloEJBClasses;

import javax.ejb.EJBObject;

import java.rmi.RemoteException;

 

public interface Hello extends EJBObject

{

    public void setGreeting(String newGreeting) throws RemoteException;

    public String getGreeting() throws RemoteException;

    public String sayHello() throws RemoteException;

}

 

7.     getGreeting ve setGreeting metod kodlarına ve greeting değişkenine sahip olan EJB snıfı oluşturulmalıdır.Bu durumlu EJB nin tuttuğu durumdur.

 

StatefulHello/HelloEJB/com/masslight/HelloEJBClasses/HelloBean.java

 

package com.masslight.HelloEJBClasses;

import java.rmi.RemoteException;

import javax.ejb.SessionBean;

import javax.ejb.SessionContext;

 

public class HelloBean implements SessionBean

{

    String greeting;

 

    public void setGreeting(String newGreeting) {

        greeting = newGreeting;

    }

    public String getGreeting() {

        return (greeting);

    }

    public String sayHello()

    {

        return(getGreeting());

    }

    public HelloBean() {}

    public void ejbCreate() {}

    public void ejbRemove() {}

    public void ejbActivate() {}

    public void ejbPassivate() {}

    public void setSessionContext(SessionContext sc) {}

}

 

8.     ejb-jar.xml tanımlayıcı dosyasının oluşturulması gerekmektedir.Bu dosya EJB nin durumlu olduğunu , home ve remote interface lere sahip olduğunu ve bir EJB sınıfını içerdiğinin tanımlarını yapacaktır.

 

StatefulHello/HelloEJB/META-INF/ejb-jar.xml

 

<?xml version="1.0" encoding="Cp1252"?>

 

<!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>

  <display-name>Hello</display-name>

  <enterprise-beans>

    <session>

      <display-name>Hello</display-name>

      <ejb-name>Hello</ejb-name>

      <home>com.masslight.HelloEJBClasses.HelloHome</home>

      <remote>com.masslight.HelloEJBClasses.Hello</remote>

      <ejb-class>com.masslight.HelloEJBClasses.HelloBean</ejb-class>

      <session-type>Stateful</session-type>

      <transaction-type>Bean</transaction-type>

      <security-identity>

        <description></description>

        <use-caller-identity></use-caller-identity>

      </security-identity>

    </session>

  </enterprise-beans>

</ejb-jar>

 

9.     İstemci kodu , EJB kodu ve bunları birbirine bağlayan ana scripti oluşturun

 

StatefulHello/HelloClient/build.xml

 

<project name="HelloClient" default="dist" basedir=".">

 

 <property environment="env"/>

 <property name="top" value="."/>

 <property name="src" value="."/>

 <property name="build" value="build"/>

 <property name="dist" value="dist"/>

 <property name="war_dir" value="${dist}/lib"/>

 <property name="war_file" value="${war_dir}/HelloClient.war"/>

 

 <property name="webinf" value="${top}/WEB-INF"/>

 <property name="web.xml" value="${webinf}/web.xml"/>

 <property name="classes" value="${webinf}/classes"/>

 <property name="lib" value="${top}/WEB-INF/lib"/>

 <property name="struts.jar" value="${env.STRUTS_HOME}/lib/struts.jar"/>

 <property name="servlet.jar" value="${env.TOMCAT_HOME}/lib/servlet.jar"/>

 <property name="ejb.src" value="${top}/../HelloEJB"/>

 <property name="ejb.jar" value="${env.JBOSS_HOME}/lib/ext/jboss-j2ee.jar"/>

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

 

 <target name="clean">

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

   <delete dir="${dist}"/>

   <delete dir="${war_dir}"/>

 </target>

 

 <target name="init">

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

   <mkdir dir="${dist}"/>

   <mkdir dir="${war_dir}"/>

 </target>

 

 <target name="compile" depends="init">

   <javac

     srcdir="${ejb.src}"

     destdir="${build}"

     classpath="${ejb.jar}"/>

   <javac

     srcdir="${top}/${src}"

     destdir="${build}"

     classpath="${servlet.jar}:${struts.jar}:${ejb.jar}"/>

 </target>

 

 <target name="dist" depends="compile">

   <war warfile="${war_file}" webxml="${web.xml}">

     <!-- include all JSPs in root level, and all .properties files anywhere -->

     <fileset dir="${top}/${src}">

       <include name="*.jsp"/>

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

     </fileset>

 

    

     <webinf dir="${webinf}">

       <include name="*.tld"/>

       <include name="*.xml"/>

       <exclude name="web.xml"/>

     </webinf>

 

  

     <lib dir="${lib}"/>

 

     <classes dir="${build}"/>

   </war>

 </target>

 

 <target name="deploy">

   <copy file="${war_file}" todir="${deploy}"/>

 </target>

 

 <target name="all" depends="clean,dist,deploy"/>

 

</project>

 

StatefulHello/HelloEJB/build.xml

 

<project name="HelloEJB" default="dist" basedir=".">

 

 <property environment="env"/>

 <property name="top" value="."/>

 <property name="src" value="."/>

 <property name="build" value="build"/>

 <property name="dist" value="dist"/>

 <property name="jar_dir" value="${dist}/lib"/>

 <property name="jar_file" value="${jar_dir}/HelloEJB.jar"/>

 

 <property name="webinf" value="${top}/WEB-INF"/>

 <property name="web.xml" value="${webinf}/web.xml"/>

 <property name="classes" value="${webinf}/classes"/>

 <property name="lib" value="${top}/WEB-INF/lib"/>

 <property name="ejb.jar" value="${env.JBOSS_HOME}/lib/ext/jboss-j2ee.jar"/>

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

 

 <target name="clean">

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

   <delete dir="${dist}"/>

   <delete dir="${jar_dir}"/>

 </target>

 

 <target name="init">

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

   <mkdir dir="${dist}"/>

   <mkdir dir="${jar_dir}"/>

 </target>

 

 <target name="compile" depends="init">

   <javac

     srcdir="${top}/${src}"

     destdir="${build}"

     classpath="${ejb.jar}"/>

 </target>

 

 <target name="dist" depends="compile">

   <jar jarfile="${jar_file}">

     <!-- include all compiled class files -->

     <fileset dir="${build}">

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

     </fileset>

 

     <fileset dir="${top}">

       <include name="META-INF/ejb-jar.xml"/>

     </fileset>

   </jar>

 </target>

 

 <target name="deploy">

   <copy file="${jar_file}" todir="${deploy}"/>

 </target>

 

 <target name="all" depends="clean,dist,deploy"/>

 

</project>

 

StatefulHello/build.xml

 

<project name="StatefulHello" default="all" basedir=".">

 

<target name="all">

  <ant dir="HelloClient" target="all"/>

  <ant dir="HelloEJB" target="all"/>

</target>

 

<target name="clean">

  <ant dir="HelloClient" target="clean"/>

  <ant dir="HelloEJB" target="clean"/>

</target>

 

</project>

 

10. StatefulHello kök dizininde ant all yaparak EJB kodunun derlenmesi ve konuşlandırılması işlemi gerçekleştirilecektir.

11. Uygulamayı test etmek için http://localhost:8080/HelloClient/getEJB.do adresine gitmelisiniz.