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