Session Bean(Stateless Session Bean) 27/04/2003
Stateful ve Stateless Session Bean
Session Bean ler durumlu ve durumsuz olarak ikiye ayrılmaktadırlar.Durumlu bir session bean , giriş ve mutatör metodları ile özelliklere sahiptir ve konuşlandırma tanımlayıcı da durumlu olduğunu belirtmek zorundadır.Bunun yanında durumsuz session bean ler ise benzer olarak tanımlayıcıda durumsuz olduklarını belirtmelidirler.
Durumsuz Session Bean lerin iç durumu bulunmamaktadır.Bu sebepten dolayı pasive edilmeleri gerekmemektedir.Durumlularda ise iç durum bulunduğundan pasivasyon ve aktivasyon işlemlerinin ele alınması gerekmektedir.Durumsuz session bean ler çoklu istemciler için havuz servisi oluşturulabilir ancak durumlular ise aynı anda sadece bir istemciye hizmet verebilir.
Session Bean İmplementasyonu
Session Bean ler bir home interface , remote interface , bean class ve XML konuşlandırma tanımlayıcısından oluşmaktadır.EJB konteyneri içerisine konuşlandırma için bu dört kısmında belirli kurallara uyması gerekmektedir.Home Interface , javax.ejb.EJBHome arayüzünü extend eder ve benzer olarak remote interface javax.ejb.EJBObject arayüzünü extend eder.Bean Class , javax.ejb.SessionBean arayüzünü super sınıfı javax.ejb.EnterpriseBean ile implement etmek zorundadır.
public interface EnterpriseBean extends java.io.Serializable {}
public
interface SessionBean extends EnterpriseBean {
public abstract void ejbActivate() throws java.rmi.RemoteException;
public abstract void ejbPasivate() throws java.rmi.RemoteException;
public abstract void ejbRemove() throws java.rmi.RemoteException;
public abstract void setSessionContext(SessionContext ctx) throws
java.rmi.RemoteException;
}
Aşağıdaki tablolar , romet interface , home interface ve durumlu ve durumsuz session bean ler için gerekli olan bean class elemanlarını anlatmaktadır.
home interface extends javax.ejb.EJBHome
|
Metod ismi |
Dönüş değeri |
Tanım |
| create() throws java.rmi.RemoteException, javax.ejb.CreateException | Remote interface için bir kütük |
Konteyner bu çağrıyı aldığında , session bean için bir örnekleme yaratmaktadır – create metodu bean class içerisindeki EJBCreate implementasyonuna uyduğu sürece parametreler içerebilir.Bu metod gerekli bir metoddur ve en az bir adet create metodu bulunmalıdır. |
Remote interface extends javax.ejb.EJBObject
|
Metod ismi |
Dönüş değeri |
Tanım |
| ornekMethod(int TurkiyeGSMH); | int |
Bu arayüz içerisinde tanımlanan tüm metodlar herhangi bir EJB ye özgü metodlardan oluşmaktadır.Burada tanımlanan her metodun implementasyonu bean class içerisinde yapılmalıdır.Gerekli değildir. |
bean class implements javax.ejb.SessionBean
|
Metod ismi |
Dönüş değeri |
Tanım |
| ejbCreate() throws javax.ejb.CreateException | void |
Home interface içerisinde tanımlanan create metoduna karşılık gelmelidir.İstemci create metodunu çağırdıktan sonra konteyner ejbCreate metodunu çağırmaktadır.Gereklidir. |
| ejbRemove() |
void |
Konteyner bu metodu bean örneklemesine yok edileceğinin sinyalini vermek için kullanır.Daha sonra bean örneği yok edilmeden önce temizleme işlemini başlatır.Gereklidir. |
| ejbActivate() | void |
Konteyner bu metodu bean örneğine active edileceğini bildirmek için kullnaır böylece bean network bağlantılarını ve handle larını gerektiği gibi ayarlar.Gereklidir. |
| ejbPassivate() | void |
Konteyner bu metodu bean örneğine pasivasyona gireceğini bildirmek için kullanmaktadır ve bunun sonucunda bean network bağlantıları ve handle ları serbest bırakır.Gereklidir. |
| setSessionContext() | void |
Konteyner bu metodu bean oluşturulduktan sorna ancak herhangi bir ejbCreate metodu çağrılmadan çnce çağırmaktadır.Bean javax.ejb.SessionContext nesnesini kaydetmek ile yükümlüdür.Bu metod gereklidir. |
| ornekMethod(int TurkiyeGSMH); | int |
REmnote interface içerisinde tanımlanan metodun implementasyonu niteliğindedir.Gerekli değildir. |
Basit bir EJB Uygulaması
Masslight tarafından sunulan örnek bir uygulama konunun anlaşılması için oldukça yardımcı olacaktır.Gerekecek olan dosyaları buradan çekebilirsiniz.Bu örneğin gerçekleştirilmesi için java tarafından J2EE uygulamaları için geröekleştirilmiş olan ANT aracınının kullanılması gerekmektdir.ANcak amacımız Session Bean konu anlatımı olduğundan dolayı ant aracının kullanımı bu bölümde anlatılmayacaktır.Session Bean kavramının oturması için verilen bu örnekleri çalıştırmak isteyenler http://java.sun.com sitesinden ant kullanımı hakkında ayrıntılı bilgiye ulaşabilirler.Kişisel olarak ben ANT aracını kullanmamaktayım.
Yapılacaklar
1. Dizin yapısının oluşturulması gerekmektedir.Kök dizin “Hello” olmalıdır.Bunun içerisinde , HelloClient ve HElloEJB olarak iki dizin bulunduracağız.HelloClient web uygulamalarına benzeyecektir:JSP dosyaları , Struts çatısına sahip bir WEB-INF dizini ve kullanacağımız iki pakedi yuvalanmış olarak içerecek bir classes dizini bulunduracaktır.
2. Struts çatısının Hello/HelloClient/WEB-INF dizinine kopyalanması gerekmektedir.
Hello/HelloClient
HelloClient
|
+-- build.xml (*)
|
+-- index.jsp (*)
|
+-- WEB-INF
|
+-- web.xml (*)
|
+-- app.tld (*)
|
+-- struts-bean.tld (*)
|
+-- struts-config.xml (*)
|
+-- struts-form.tld (*)
|
+-- struts-html.tld (*)
|
+-- struts-logic.tld (*)
|
+-- struts-template.tld (*)
|
+-- struts.tld (*)
|
+-- classes
| |
| +-- com
| |
| +-- dat
| |
| +-- beans
| | |
| | +-- HelloClientBean.java (*)
| |
| +-- actions
| |
| +-- GetBeanAction.java (*)
|
+-- lib
|
+-- struts.jar (*)
(*) bir dosyayı göstermektedir.
3. JSPyi kök dizinde değil HelloClient dizininde oluşturmalısınız.
Hello/HelloClient/index.jsp
<%@ page language="java" %>
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<html:html>
<head>
<title>
EJB Ornegi
</title>
<html:base/>
</head>
<body>
<logic:present name="greeting">
<bean:write name="greeting"/>
</logic:present>
</body>
</html:html>
4. HelloClient/WEB-INF dizininde web.xml dosyasını oluşturun.
Hello/HelloClient/WEB-INF/web.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN"
"http://java.sun.com/j2ee/dtds/web-app_2_2.dtd">
<web-app>
<!—Eylem Servler Ayarlari -->
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<init-param>
<param-name>application</param-name>
<param-value>com.masslight.ApplicationResources</param-value>
</init-param>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
<init-param>
<param-name>debug</param-name>
<param-value>2</param-value>
</init-param>
<init-param>
<param-name>detail</param-name>
<param-value>2</param-value>
</init-param>
<init-param>
<param-name>validate</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
<!—Eylem Servlet Örtümü -->
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<!-- Struts Etiket Eylem Tanimlari-->
<taglib>
<taglib-uri>/WEB-INF/struts-bean.tld</taglib-uri>
<taglib-location>/WEB-INF/struts-bean.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>/WEB-INF/struts-html.tld</taglib-uri>
<taglib-location>/WEB-INF/struts-html.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>/WEB-INF/struts-logic.tld</taglib-uri>
<taglib-location>/WEB-INF/struts-logic.tld</taglib-location>
</taglib>
</web-app>
5. struts-confıg.xml dosyasını oluşturun.
Hello/HelloClient/WEB-INF/struts-config.xml
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE struts-config PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 1.0//EN"
"http://jakarta.apache.org/struts/dtds/struts-config_1_0.dtd">
<struts-config>
<!-- ========== Global Ön Tanımlar ============================== -->
<global-forwards>
<forward name="success" path="/index.jsp"/>
</global-forwards>
<!-- ========== Eylem Örtüm Tanımları ============================== -->
<action-mappings>
<!-- Save user registration -->
<action path="/getEJB"
type="com.masslight.actions.GetBeanAction" />
</action-mappings>
</struts-config>
6. Bu JSP için Struts Action(Eylem) sınıfını oluşturun.Burada action sınıfı HelloClientBean I çağırarak işi yapmasını belirtmektedir.
Hello/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 {
// Bu sinif icin kullanilan constructor
public GetBeanAction() {
}
// Liste bir session bean olarak kullaniliyor
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("Hello"));
return (mapping.findForward("success"));
}
}
7. İstemci bean I yaratılmalıdır.Bu , EJB ye bir referans çıkararak işi yapmasını gerektiğini söylemektedir.
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() {
}
/**
Bu metod tüm işi geröekleştirmektedir.Hello EJB nin sunucuda bir örneklemisini oluşturmakta
Ve onun sayHello metodunu çağırmaktadır va daha sonra dönen String değerini bastırmaktadır.
*/
public void startup () {
// İsim saglayicinin ayarlanmasi;bu her zaman gerkli olmayabilir ve Java sisteminizin kurulum ayarlarına baglidir
System.setProperty("java.naming.factory.initial",
"org.jnp.interfaces.NamingContextFactory");
System.setProperty("java.naming.provider.url",
"localhost:1099");
// Tek bir `try' blogu exception yakalamak icin iyi bir yol degildir fakat kodu okumada kolaylık saglamaktdir
try
{
// İsimlendirme kontektinin alinmasi
InitialContext jndiContext = new InitialContext();
System.out.println("Kontekst alindi \n");
// hello Bean e referans alinmasi
Object ref = jndiContext.lookup("Hello");
System.out.println("Referans alindi \n");
// Bundan bean in home interface ine referans alinmasi
home = (com.masslight.HelloEJBClasses.HelloHome)
PortableRemoteObject.narrow (ref,
com.masslight.HelloEJBClasses.HelloHome.class);
// home interface ten home nesnesinin yaratilmasi
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);
}
}
8. EJB kodunu tutması için bir dizin yapısı oluşturun.Kök dizin,HelloEJB,istemci kodu için oluşturduğumuz
HelloClient dizini ile aynı dizinde bulunmalıdır.EJB tanımlayıcısı için bir META-INF dizini bulundurmalı ve EJB sınıflarına yolu
belirtmek için bir dizin hiyerarşisi oluşturmalıyız.
Bu örnekte bu com.masslight.HelloEJBClasses olarak adlandırılacaktır.
Hello/HelloEJB
HelloEJB
|
+-- build.xml (*)
|
+-- META-INF
| |
| +-- ejb-jar.xml (*)
|
+-- com
|
+-- masslight
|
+-- HelloEJBClasses
|
+-- HelloBean.java (*)
|
+-- Hello.java (*)
&n