Avatar billede dennish Nybegynder
18. november 2005 - 19:50 Der er 10 kommentarer og
1 løsning

Design overvejelser - facade

Jeg har en hjemmeside:

JSP -> servlet -> sessionBean(Facade)  -> entityBeaBean

Siden består af en login knap og en opret kunde form.

Når der klikkes på login kaldes en FacadeServlet der sørger for at lave lookup på en sessionBean der igen laver lookup på en CustomerBean(entityBean). Derfefter verificerers om kunden er oprettet i systemet.

Opret kunde form kalder selvsammen FacadeServlet der laver lookup på den samme sessionBean som ovenstående, der igen kalder CustomerBean der gemmer data i databasen

Er det et helt forkeret design ? og kan jeg egentlig ikke gemme min reference til mit Local Home interface i min sessionBean som en variabel og så bruge referencen hver gang jeg laver lookup på CustomerBean Bean'en. ?
Avatar billede arne_v Ekspert
18. november 2005 - 20:47 #1
det er anbefalelses værdigt at gemme en reference til home interfacet

det har sågar et navn: service locator pattern
Avatar billede dennish Nybegynder
21. november 2005 - 00:25 #2
Arne>> har siddet og kigge på  service locator pattern. Er det rigtig opfattet at man bruger det på følgende måde :

JSP - Servlet - StatelessSessionBean - > ServiceLocator cacher lookup på alle ens EntityBeans.

Jeg troede faktisk at man implementerede Service Locator i ens sessionBean, men ud fra det jeg har læst ser det ud til at man opretter eet objekt ServiceLocator(der er defineret singleton), der indeholder/cacher de referencer man skal bruge til sine EntityBeans.

Eller har jeg helt misforstået design patternet ?
Avatar billede dennish Nybegynder
21. november 2005 - 00:28 #3
Lidt mere info. Ud fra MasteringEJB anbefales det også at man har mere end en enkelt facade = sessionbean, for ikke at skabe en flaskehals. Så alle mine sessionsbeans, der jo fungerer som facade bruger så det ene objekt ServiceLocator for at opnå reference til mine EntityBeans
Avatar billede arne_v Ekspert
21. november 2005 - 00:35 #4
du cacher home interface ikke interface i service locator
Avatar billede arne_v Ekspert
21. november 2005 - 00:38 #5
pattern bruges når du skal have fat på et home interface

det må have samme positive effekt uanset om det er:

servlet -> facade session bean

facade session bean -> anden session bean

session bean -> entity bean
Avatar billede arne_v Ekspert
21. november 2005 - 00:42 #6
hvor skriver han det henne ?  (udgave & side nummer)
Avatar billede dennish Nybegynder
22. november 2005 - 14:12 #7
arne>> sorry det er i EJB Design patterns, downloaded i pdf fra theserverside.com

Kan også købes i bogform:

http://www.amazon.com/gp/product/0471208310/102-4422084-5609718?v=glance&n=283155&tagActionCode=theserverside-20

Kapitel 1: Side 5 - 12
Avatar billede arne_v Ekspert
22. november 2005 - 14:21 #8
jeg har bogen

det eneste jeg kan finde der er at de anbefaler at man splitter sine use cases
i logiske grupper med en facade session bean for hver - ikke p.g.a. runtime
performance men p.g.a. development (med en stor facade så vil alle skulle rette i den
hele tiden)
Avatar billede dennish Nybegynder
22. november 2005 - 14:28 #9
Smider lige koden så andre kan få gavn af den:

NB. der bliver returneret et LocalHome interface, idet sessionBean kalder en EntityBean lokalt på JBoss serveren

import javax.ejb.CreateException;
import javax.ejb.SessionContext;
import javax.ejb.EJBException;
import javax.rmi.PortableRemoteObject;
import javax.ejb.SessionBean;
import javax.naming.Context;
import javax.naming.InitialContext;
import java.util.ArrayList;
import java.util.Iterator;

import customer.CustomerHome;
import customer.Customer;
import common.ServiceLocator;
import common.ServiceLocatorException;

/**
Sessionbean, der håndterer bruger login. Fungerer som facade for login 
SessionBean der kalder en EntityBean(CustomerBean)

EntityBean: CustomerBean.java, Customer.java, CustomerHome.java
           
*/

public class UserManagerBean implements javax.ejb.SessionBean
{
    private SessionContext ctx;
    private String usernameDB;
    private String passwordDB;
    private String roleDB;
 
 

    public void createCustomer()
    {
   
    try
        {
        ServiceLocator serviceLocator = ServiceLocator.getInstance();
        CustomerHome customerHome = (CustomerHome)serviceLocator.getHome("customer",CustomerHome.class);
        customerHome.create("sys","sys","sysadmin");
        customerHome.create("cus","cus","customer");
        customerHome.create("dev","dev","developer");
        }
    catch(Exception ex)
        {
        ex.printStackTrace();
        }
    }
   
//----------------------------------------------------
    // Begin EJB-required methods.  The methods below are
    // called by the Container, and never called by client
    // code.
    //----------------------------------------------------   
    public void ejbCreate() throws CreateException
    {
    System.out.println("ejbCreate() called.");
    }
    public void ejbRemove() throws EJBException
    {
    System.out.println("ejbRemove() called.");
    }
   
    public void ejbActivate() throws EJBException
    {
    System.out.println("ejbActivate() called.");
    }
    public void ejbPassivate() throws EJBException
    {
    System.out.println("ejbPassivate() called.");
    }
    public void setSessionContext(SessionContext ctx) throws EJBException
    {
    System.out.println("setSessionContext() called");
    this.ctx = ctx;
    }     
    //----------------------------------------------------
    // End EJB-required methods
    //----------------------------------------------------

}

import java.util.*;
import javax.naming.*;
import java.rmi.RemoteException;
import javax.ejb.*;
import javax.rmi.PortableRemoteObject;
import java.io.*;
import customer.CustomerHome;


/**
  ServiceLocator pattern, which makes lookup on all local entity beans
  The design pattern is inspired by Java.sun.com  http://java.sun.com/blueprints/corej2eepatterns/Patterns/ServiceLocator.html
*/

public class ServiceLocator
{
   
    public static InitialContext ctx;
    public static ServiceLocator me;
   
    private ServiceLocator() throws ServiceLocatorException
    {
    }
   
   
    public static ServiceLocator getInstance() throws ServiceLocatorException
    {
    if (me == null)
        {
        me = new ServiceLocator();
        }
    return me;
    }
   
   
   
    /**
    * @param name the JNDI name
    * @return The EJBLocalHome interface 
    */
    public EJBLocalHome getHome(String name, Class homeClass) throws ServiceLocatorException
    {
    try
        {
        // create JNDI context
        ctx = new InitialContext();
        Object obj = ctx.lookup(name);
        (CustomerHome)PortableRemoteObject.narrow(obj,homeClass);
        EJBLocalHome home = (EJBLocalHome)PortableRemoteObject.narrow(obj, homeClass);
        return home;
        }
    catch(NamingException ex)
        {
        throw new ServiceLocatorException();
        }
   
    }

}
Avatar billede dennish Nybegynder
23. november 2005 - 23:49 #10
arne>> smider du ikke lige et svar. Og ja jeg har nu grupperet mine use cases i logsike grupper med en session facade  bean for hver use case.
Avatar billede arne_v Ekspert
23. november 2005 - 23:56 #11
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester