Design av distribuerade system, några generella mål • Lätt att underhålla och modifiera • Utvecklare med olika färdigheter ska kunna arbeta oberoende av varandra • Systemet ska gå att skala upp, flytta och ha en hög tillgängligt • Kod ska vara återanvändbar • Systemet ska kunna samarbeta med andra system • Utvecklare ska kunna fokusera på utveckling av affärslogik inte systemmekanismer • De ska vara möjligt att separera kod med olika utvecklingsbehov • Det ska vara enkelt att gå från en web-centrerad design till en komponentbaserad 1 Java 2 Platform Enterprise Edition, J2EE • J2EE innehåller stöd för utveckling av system bestående av flera lager • Varje lager tjänar sitt speciella syfte 2 J2EE, Components Containers, Connectors • Components, de delar i systemet som beskriver applikationerna • Containers, den miljö i vilken komponenterna förekommer. • Connectors, fungerar som anslutningar mot olika leverantörers programvaror 3 • • • • • • • • J2EE och några av dess services JNDI, Java Naming and Directory Interface En enkel mekanism för att hitta och ansluta andra objekt JDBC, Java DataBase Connectivity Databasstöd JavaMail Möjlighet att ta i mot och sända mail CORBA Ger möjligheter att ansluta till andra icke Java-system Java Transaction Stöd för transaktioner av operationer XML Stöd för enhetlig dokumenthantering JMS, Java Message Service En teknik för att sända meddelanden mellan olika 4 komponenter i ett distribuerat system Enterpise Java Beans, EJB • EJB är komponenter som erbjuder olika tjänster över nätet • EJB exekverar alltid på en applikationsserver • En applikationsserver är försedd med en EJBcontainer och en Web-container j2ee, Tomcat, JBoss-Jetty, Orion, WebSphere, WebLogic, Jrun, iPlanet, Oracle 9i AS, java.sun.com jakarta.apache.org www.jboss.org www.orionserver.com www.ibm.com www.beasys.com www.jrun.com www.iplanet.com www.oracle.com • Några exempel på olika applikationservrar är, – – – – – – – – – 5 Typer av EJB • Det finns tre olika typer av EJB – Session beans Utför någon typ av uppdrag åt klienten • Stateless session beans Är ej knuten till någon unik klients session • Stateful session beans Knyts till en specifik klients session, dvs är unik för den anropande klienten – Entity beans Är persistenta, dvs deras tillstånd sparas permanent. Detta görs med hjälp av en databas – Message-Driven Beans Fungerar som lyssnare för JMS-meddelanden 6 Exempel, valuta växling, del 1 Applikationsserver EJB-container Remote-interface Converter Enterprise Java Bean ConverterBean Home-interface ConverterHome Web-container index.jsp 7 home interface EJB class EJB JAR namn EJB namn Typ <name> <namn>Home <namn>Bean <namn>JAR <namn>EJB Syntax Converter ConverterHome ConverterBean ConverterJAR ConverterEJB Exempel Några regler för namngivning remote interface 8 Exemplet, valuta växling , del 2 remote interface import javax.ejb.EJBObject; import java.rmi.RemoteException; import java.math.*; public BigDecimal dollarToYen(BigDecimal dollars) throws RemoteException; public BigDecimal yenToEuro(BigDecimal yen) throws RemoteException; public interface Converter extends EJBObject { } 9 java.io.Serializable; java.rmi.RemoteException; javax.ejb.CreateException; javax.ejb.EJBHome; Exemplet, valuta växling , del 3 home interface import import import import Converter create() throws RemoteException, CreateException; public interface ConverterHome extends EJBHome { } 10 java.rmi.RemoteException; javax.ejb.SessionBean; javax.ejb.SessionContext; java.math.*; Exemplet, valuta växling , del 4 enterprise bean class import import import import BigDecimal result = dollars.multiply(yenRate); return result.setScale(2,BigDecimal.ROUND_UP); ConverterBean() {} void ejbCreate() {} void ejbRemove() {} void ejbActivate() {} void ejbPassivate() {} void setSessionContext(SessionContext sc) {} BigDecimal result = yen.multiply(euroRate); return result.setScale(2,BigDecimal.ROUND_UP); public public public public public public } public BigDecimal yenToEuro(BigDecimal yen) { } public BigDecimal dollarToYen(BigDecimal dollars) { BigDecimal yenRate = new BigDecimal("121.6000"); BigDecimal euroRate = new BigDecimal("0.0077"); public class ConverterBean implements SessionBean { } 11 Exemplet, valuta växling , del 5 JSP-sidan try { InitialContext ic = new InitialContext(); Object objRef = ic.lookup("java:comp/env/ejb/TheConverter"); ConverterHome home = (ConverterHome) PortableRemoteObject.narrow(objRef, ConverterHome.class); System.out.println("Unable to lookup home: "+ "TheConverter "+ ex.getMessage()); 12 converter = home.create(); } catch (RemoteException ex) { System.out.println("Couldn't create converter bean."+ ex.getMessage()); } catch (CreateException ex) { System.out.println("Couldn't create converter bean."+ ex.getMessage()); } catch (NamingException ex) { } public void jspDestroy(){converter = null;} } public void jspInit() { private Converter converter = null; <%@ page import="Converter,ConverterHome,javax.ejb.*, java.math.*, javax.naming.*, javax.rmi.PortableRemoteObject, java.rmi.RemoteException" %> <%! %> 13 Yen. Exemplet, valuta växling , del 6 JSP-sidan <html> <head> <title>Converter</title> </head> if ( amount != null && amount.length() > 0 ) { BigDecimal d = new BigDecimal (amount); String amount = request.getParameter("amount"); <body bgcolor="white"> <h1><b><center>Converter</center></b></h1> <hr> <p>Enter an amount to convert:</p> <form method="get"> <input type="text" name="amount" size="25"> <br> <p> <input type="submit" value="Submit"> <input type="reset" value="Reset"> </form> <% %> } <p> <%= amount %> dollars are <%= converter.dollarToYen(d) %> <p> <%= amount %> Yen are <%= converter.yenToEuro(d) %> Euro. <% %> </body> </html> Exemplet, valuta växling , del 7 En deployment descriptor <?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> <display-name>ConverterJAR</display-name> <enterprise-beans> <session> <display-name>ConverterBean</display-name> <ejb-name>ConverterBean</ejb-name> <home>ConverterHome</home> <remote>Converter</remote> <ejb-class>ConverterBean</ejb-class> <session-type>Stateless</session-type> <transaction-type>Bean</transaction-type> <security-identity> <description></description> <use-caller-identity></use-caller-identity> </security-identity> </session> </enterprise-beans> </ejb-jar> 14