Die Version 6 der Java Enterprise Edition steht kurz vor der Verabschiedung. Viele Stimmen sagen, dass die darin enthaltenen Technologien nunmehr nahezu ausgereift und alle Erwartungen erfüllt seien. Es werden die neuen Features insbesondere in den Bereichen Enterprise JavaBeans, Webanwendungen, Java Persistence und Webservices beleuchtet. Die anschließende Diskussion kann zeigen, ob die anfangs angesprochenen Vorschusslorbeeren gerechtfertigt sind und ob die Wunschliste tatsächlich vollständig abgearbeitet wurde.
EJB 3.1
- Session Beans ohne local Interface
- Singletons, Timer
- Session Bean Methoden asynchron
Servlet 3.0
- Ease of Development
JSF 2.0
- Ohne faces-config.xml?
JPA 2.0
- Weitere Mapping-Optionen
- Relationsfelder im Primärschlüssel
Java oberflächlich betrachtet - Welche GUI ist die richtige?
Neue Features der Java EE 6
1. g GFU Cyrus AG
Ihr Partner für IT Schulung
"Semicolon" Vortragsreihe bei der GFU
Vortrag am Dienstag, 09. Juni 2009
Thema
Die Leichtigkeit der Softwareentwicklung
Stärken und Schwächen der neuen Spezifikation Java EE 6
Einführung
Peter Hecker, GFU Cyrus AG
Vortrag
Dirk Weil, GEDOPLAN GmbH
2. Entwicklung von Informationssystemen
29 Jahre am Markt
~35 Mitarbeiter
Beratung und Entwicklung
Konventionelle und
GEDOPLAN
neue Technologien
Maßgeschneiderte Lösungen Objektorientierte Softwareentwicklung
Standardsoftware
SAP®
SOA Java .NET
3. Seit 1998 im Bereich Java:
50+ Beratungs- und Entwicklungsprojekte
Konzeption und Entwicklung
30+ Seminartitel
GEDOPLAN
Java / Java EE
Diverse App.-Server Objektorientierte Softwareentwicklung
Glassfish
IBM WebSphere
JBoss SAP®
Oracle WebLogic SOA Java .NET
SAP NetWeaver
7. Java Enterprise Edition
J2EE 1.4
schwergewichtig
viele XML-Descriptoren
Java EE 5
POJOs, IoC / DI
Configuration by Exception
Java-5-Annotationen statt XML
Java EE 6
Fortsetzung des Trends zur Einfachheit
Diverse "Wunscherfüllungen"
7
8. Servlet 3.0: Konfiguration mit Annotationen
Bisher Registrierung in web.xml
public class SimpleServlet extends HttpServlet
{
protected void doGet(HttpServletRequest request,
HttpServletResponse response)
{
…
<web-app>
<servlet>
<servlet-name>SimpleServlet</servlet-name>
<servlet-class>de.gedoplan.demo.SimpleServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>SimpleServlet</servlet-name>
<url-pattern>/demo/SimpleServlet</url-pattern>
</servlet-mapping>
…
8
9. Servlet 3.0: Konfiguration mit Annotationen
Registrierung per Annotation
@WebServlet(name="SimpleServlet",
urlPatterns={"/demo/SimpleServlet"})
public class SimpleServlet extends HttpServlet
{
protected void doGet(HttpServletRequest request,
HttpServletResponse response)
{
…
Auch für:
Init-Parameter
Servlet Filter
Context Listener
9
10. Aber: Servlets sind keine POJOs!
Servlet-Klasse implementiert HttpServlet
Alternative Jersey/JAX-RS
@Path("/demo/SimpleServlet"})
public class SimpleServlet
{
@Get
@Produces("text/plain")
public String getMessage()
{
return "Hello, world";
10
11. JSF 2.0: Konfiguration mit Annotationen
Bisher Deklaration von Managed Beans in faces-config.xml
public class DemoBean
{
private double steuerSatz = 0.19;
public double getSteuerSatz()
{
return steuerSatz;
}
<faces-config>
... <managed-bean>
<description>DemoBean</description>
<managed-bean-name>demoBean</managed-bean-name>
<managed-bean-class>de.gedoplan.demo.DemoBean</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
</faces-config>
11
12. JSF 2.0: Konfiguration mit Annotationen
Deklaration von Managed Beans per Annotation
@ManagedBean(name = "demoBean")
@RequestScoped
public class DemoBean
{
private double steuerSatz = 0.19;
public double getSteuerSatz()
{
return steuerSatz;
}
...
12
13. JSF 2.0: Konfiguration mit Annotationen
Annotation auch für:
Managed Properties @ManagedProperty(value=”#{barBean}”)
private BarBean barBean;
Converter
Validatoren
Renderer
Lifecycle
13
14. JSF 2.0: faces-config.xml
ist optional
überschreibt Annotationen
weiterhin für
Anwendungsparameter wie Lokalisierung, Phase Listeners etc.
Navigationsregeln
14
15. EJB 3.1: No Interface Beans
Bis EJB 3.0: Obligatorisches Local oder Remote Interface
@Stateless
public class ArbeitsplatzDaoBean implements ArbeitsplatzDao
{
public void insert(Arbeitsplatz entity) { … }
public void update(Arbeitsplatz entity) { … }
…
@Local
public interface ArbeitsplatzDao
{
public void insert(Arbeitsplatz entity);
public void update(Arbeitsplatz entity);
…
Für rein interne Nutzung (Local!) lästig
15
16. EJB 3.1: No Interface Beans
Interfaces sind nun optional.
Wenn kein Interface deklariert:
Container stellt Referenz-Objekt (Proxy) zur Verfügung
Proxy enthält alle öffentlichen Methoden der Bean.
Proxy ist von der Bean-Klasse abgeleitet.
Nutzung (z.B.) aus anderen EJBs über den Typ der Bean-Klasse.
@Stateless
public class ArbeitsplatzDaoBean
{ @Stateless
public void insert(Arbeitsplatz entity) { … } class SomeOtherBean
public
public void update(Arbeitsplatz entity) { … }
{
… @EJB
private ArbeitsplatzDaoBean dao;
…
16
17. EJB 3.1: No Interface Beans
Erstellung des No-Interface-Referenzobjekts auch zusätzlich mit
@LocalBean
Achtung: Alle öffentlichen Methoden sind zugreifbar!
Aufruf nicht-öffentlicher Methoden wirft Exception.
17
18. EJB 3.1: Singletons
Genau eine Bean-Instanz pro JVM.
Neue Annotation für Session Beans: @Singleton.
@Singleton
public class SomeBean
{
…
18
19. EJB 3.1: Singletons
Lebenszyklus wird durch den Container gesteuert.
@Startup erzwingt
@Singleton
Instanziierung beim @Startup
Applikationsstart. public class A { … }
@DependsOn definiert @Singleton
public class B { … }
Abhängigkeiten für die
Instanziierung. @Singleton
@DependsOn("B")
public class C { … }
@Singleton
@Startup
@DependsOn({"A", "B"})
public class E { … }
19
20. EJB 3.1: Singletons
Unterstützt nebenläufigen Zugriff (Concurrent Access).
CMC (Container Managed Concurrency, Default)
Container kontrolliert und regelt den Zugriff.
Steuerung durch @READ und @WRITE (Default).
@AccessTimeout für Limitierung der Blockade.
BMC (Bean Managed Concurrency)
Entwickler muss synchronized, volatile etc. einsetzen.
20
21. EJB 3.1: Singletons
Concurrency Strategy: Beispiele
@Singleton
@ConcurrencyManagement(CONTAINER)
public class A { ... } @Singleton
@Lock(READ)
@Singleton public class D
@Lock(WRITE) {
public class B { ... } ...
@Singleton @Lock(WRITE)
@Lock(READ) public String sayBye() { ... }
public class C { ... } ...
}
@Singleton
@AccessTimeout(10000)
public class E { ... }
21
22. EJB 3.1: Singletons
Singletons sind statusbehaftet.
Status besteht bis zum Applikationsende (Shutdown/Undeploy).
Im Clusterbetrieb gibt es pro JVM eine Singleton-Instanz.
System Exceptions führen nicht zur Zerstörung.
22
23. EJB 3.1: Timer
Timer Service wurde von EJB 2.1 mit beschränkter Funktionalität
eingeführt:
Alle Timer müssen programmatisch erzeugt werden.
Unflexibles Scheduling der Timer.
Kein Cluster-Support.
23
24. EJB 3.1: Timer
Programmatische Instanziierung durch erweitertes Interface
TimerService.
Deklarative Instanziierung durch Annotationen.
Timer können persistent gehalten werden.
Timer sind nun cluster-fähig.
Nicht-persistente Timer 1 x pro JVM.
Persistente Timer 1 x pro Cluster.
24
25. EJB 3.1: Timer
@Schedule steuert Erzeugung und Intervalle.
@Schedule wird auf Timeout-Callback-Methoden angewandt.
@Stateless
public class TimerEJB
{
@Schedule(dayOfWeek="Mon")
public void itIsMonday(Timer timer) { … }
@Schedule(dayOfMonth="Last")
public void itIsEndOfMonth(Timer timer) {
… }
}
25
26. EJB 3.1: Timer
Eine Methode kann auch mit mehreren Timern ausgestattet werden
Umfangreiche Erweiterung der Schedule-Terminologie
// Every Tuesday at 7.30am
@Schedule(hour = "7", minute = "30", dayOfWeek = "Tue")
// From Monday to Friday, at 7, 15 and 20
@Schedule(hour = "7, 15, 20", dayOfWeek = "Mon-Fri")
// Every hour on Sundays
@Schedule(hour = "*", dayOfWeek = "0")
// Last Friday of December, at 12
@Schedule(hour = "12", dayOfMonth = "Last Fri", month="Dec")
// Three days before the last day of the month, for every month of 2009, at 8pm
@Schedule(hour = "20", dayOfMonth = "-3", year="2009")
// Every 5 minutes of every hour, starting at 3pm
@Schedule(minute = "*/5", hour = "15/1")
26
27. EJB 3.1: Asynchrone Session-Bean-Methoden
Session Beans unterstützen asynchronen Methodenaufruf.
Kontrolle wird dem Client zurückgegeben werden, bevor der
Container den Aufruf an die Bean-Instanz weiterleitet.
Es können vom Client parallele (nebenläufige) Prozesse angestoßen
werden.
27
28. EJB 3.1: Asynchrone Session-Bean-Methoden
Asynchrone Methoden werden durch die @Asynchronous
gekennzeichnet.
Sowohl Klassen, als auch Methoden können annotiert werden.
Rückgabe-Typ asynchroner Methoden:
void @Stateless
public class C implements CLocal { … }
Future<V>
@Local
public interface CLocal
{
@Asynchronous
public void flushBye();
}
28
29. JPA 2.0: Weitere Mapping-Optionen
Abbildung von Collections (ohne explizite Relation)
Neue Annotation dafür: @ElementCollection.
@Entity
public class Person
{
@ElementCollection
private Set<String> hobbies;
Auch nutzbar für einbettbare Elemente (@Embeddable).
Realisierung wie Relation mit Primärschlüssel-Join.
29
30. JPA 2.0: Weitere Mapping-Optionen
@Entity
public class Vehicle
Relationen auf einge- {
@Id
bettete Objekte int vehicleId;
@Embedded
PurchaseInfo purchaseInfo;
@Embeddable
public class PurchaseInfo …
{
int price;
@Temporal(DATE) @Entity
@Column(name=”PUR_DATE”) public class Dealer
Date purchaseDate; {
@Id
@ManyToOne int dealerId;
Dealer dealer;
@OneToMany(mappedBy=”purchaseInfo.dealer”)
… Collection<Vehicle> vehiclesSold;
…
30
31. JPA 2.0: Weitere Mapping-Optionen
Unidirectional One-to-Many mit einem Foreign Key
@Entity
public class Vehicle
{
@Id
private int vehicleId;
@OneToMany
private Set<Part> parts;
…
31
32. JPA 2.0: Relationsfelder im Primärschlüssel
In manchen Fällen, insbesondere bei der Integration von Alt-
Systemen (lagacy databases) ist es notwendig, Primärschlüssel mit
Fremdschlüssel einer anderen Tabelle zu realisieren…
32
33. JPA 2.0: Relationsfelder im Primärschlüssel
Beispiel:
public class ProjectId
{
@Entity String name;
@IdClass(ProjectId.class) int dept;
public class Project …
{ }
@Id
String name;
@Id
@ManyToOne
@JoinColumn(name=”D_ID”)
Department dept;
… @Entity
public class Department
{
@Id
int id;
…
33
34. Fazit
Trend zur Vereinfachung setzt sich fort
Annotationen statt XML
Configuration by Exception
Viele nützliche Erweiterungen
Singletons
Asnchrone Methoden
Timer
Lohnt sich!
34