public class - Dariusz Pałka Dydaktyka

Transkrypt

public class - Dariusz Pałka Dydaktyka
Tworzenie
Aplikacji
Internetowych
dr Dariusz Pałka
Sun J2EE Tutorial
http://java.sun.com/javaee/5/docs/tutorial/doc/
Rozproszone aplikacje wielowarstwowe
Komponenty J2EE
• Po stronie klienta
– Application clients
– Applets
• Po stronie serwera
– Java Servlet
– JavaServer Pages (JSP)
– Enterprise JavaBeans (EJB)
Klienci J2EE
• Klienci webowi (Web Clients)
• Aplety (Applets)
• Aplikacje klienckie (Application Clients)
Komunikacja z serwerem J2EE
Komponenty webowe
Komponenty biznesowe
Usługi Kontenera
• Kontenery są interfejsami pomiędzy
komponentami i niskopoziomowymi
funkcjami platformy
• Przykłady usług kontenera:
– J2EE security model
– J2EE transaction model
– JNDI lookup services
– J2EE remote connectivity model
Typy kontenerów
Web serwisy
• XML
• SOAP Transport Protocol
• WSDL Standard Format
Warstwa prezentacyjna
JavaServer Faces (JSF)
• JSF to framework do tworzenia interfejsu
użytkownika dla aplikacji webowych
• Podstawowy cel to uproszczenie
najbardziej złożonego i żmudnego
procesu w tworzeniu aplikacji webowych
jakim jest tworzenie UI
Podstawowe składniki JSF
Komponenty (ang. components)
Zdarzenia (ang. events)
Walidatory i konwertery (ang. validators & converters)
Nawigacja (ang. navigation)
Back-end-data integration
JSF
W jaki sposób JSF upraszcza proces
deweloperski
• Bazuje na podejściu skoncentrowanym na
komponentach (component-centric)
• Jest niezależne od klienta (przynajmniej w
znacznej mierze)
• Upraszcza dostęp i zarządzanie warstwą danych z
poziomu webowego interfejsu użytkownika
• Automatycznie zarządza stanem interfejsu
użytkownika pomiędzy wieloma żądaniami i dla
wielu klientów
• Przyjazny dla użytkowników będących na z
różnym poziomem doświadczenia
Java Specification Requests (JSR) #127
• The following 8 design goals represent the focus of this
proposal:
• 1. Create a standard GUI component framework which can
be leveraged by development tools to make it easier for tool
users to both create high quality GUIs and manage the
GUI's connections to application behavior.
• 2. Define a set of simple lightweight Java base classes for
GUI components, component state, and input events.
These classes will address GUI lifecycle issues, notably
managing a component's persistent state for the lifetime of
its page.
• 3. Provide a set of common GUI components, including the
standard HTML form input elements. These components
will be derived from the simple set of base classes (outlined
in #1) that can be used to define new components.
Java Specification Requests (JSR) #127
• 4. Provide a JavaBeans model for dispatching events from
client-side GUI controls to server-side application behavior.
• 5. Define APIs for input validation, including support for
client-side validation.
• 6. Specify a model for internationalization and localization of
the GUI.
• 7. Automatic generation of appropriate output for the target
client, taking into account all available client configuration
data, such as browser version, etc.
• 8. Automatic Generation of output containing required hooks
for supporting accessibility, as defined by Web Acesibility
Initiative (WAI).
Architektura aplikacji JSF
• Aplikacja JSF jest to standardowa, webowa
aplikacja J2EE posiadająca specyficzną
konfigurację
– Wpis w web.xml, który włącza obsługę adresów
URL z określonym wzorcem (np. /faces/*) za
pomocą servletu Face Controller
– Plik konfiguracyjny JSF faces-config.xml
– Katalog WEB-INF zawierający biblioteki Javy:
• jsf-api.jar, jsf-impl.jar (biblioteki JSF)
• commons-beanutils.jar, commonscollections.jar, itp.
• jstl.jar, standard.jar (biblioteki JSTL)
Obsługa żądań (request processing)
w JSF
Faces
Request
Faces
Response
Restore
View
Apply
Request Values
Process
Validations
Render
Response
Invoke
Application
Update Model
Values
Model nawigacji w JSF
• JSF jest zaprojektowany w oparciu o
paradygmat projektowy MVC
– Model – zawiera logikę biznesową lub kod nie
związany z UI
– View (widok) – kod niezbędny do
prezentowania użytkownikowi UI
– Controller (kontroler) – front-end agent
obsługujący żądania użytkownika i
rozdzielający je do odpowiednich widoków
Model nawigacji w JSF
Controller
(Faces Servlet)
View
(JSF Pages)
Model
(Managed Beans)
Reguły nawigacji w faces-config.xml
<navigation-rule>
<display-name>register</display-name>
<from-view-id>/register.jsp</from-view-id>
<navigation-case>
<from-outcome>success</from-outcome>
<to-view-id>/welcome.jsp</to-view-id>
</navigation-case>
</navigation-rule>
<navigation-rule>
<display-name>register</display-name>
<from-view-id>/register.jsp</from-view-id>
<navigation-case>
<from-outcome>emailRegistered</from-outcome>
<to-view-id>/emailAlreadyRegistered.jsp</to-view-id>
</navigation-case>
</navigation-rule>
Komponenty UI
• Klasa bazowa dla wszystkich komponentów
– UIComponent/UIComponentBase
• Standardowe podklasy klasy UIComponent
– UICommand, UIForm, UIOutput
– UIGraphic, UIInput, UIPanel, UIParameter
– UISelectBoolean, UISelectMany, UISelectOne
• Przykład
– <h:inputText id=”userPasswd”
value=”#{LoginBean.password}” />
Managed Beans
• JSF managed beans
– POJOs przechowujące dane aplikacji i
zarządzane przez kontener
– Muszą być zarejestrowane w face-config.xml
– Można się do nich odwoływać przez JSF EL
np.
<h:outputText value=”#{loginBean.name}” />
– Dostępne zakresy trwałości: none, request,
session, application
Przykład
public class LoginBean {
String name;
String password;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
Wiązanie UI z Managed Bean
Dostępne komponenty JSF
• MyFaces Trinidad, Tabago, Tomahawk
http://myfaces.apache.org/
• MyFaces Trinidad
http://myfaces.apache.org/trinidad/index.
html
• http://www.jsfcentral.com/
Strona JSF
<%@taglib uri="http://java.sun.com/jsf/core" prefix="f"%><%@taglib
uri="http://java.sun.com/jsf/html" prefix="h"%><%@ page language="java"
contentType="text/html; charset=ISO-8859-2"
pageEncoding="ISO-8859-2"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-2">
<title>Logowanie</title>
</head><body>
<f:view>
<h:form>
<h2>Logowanie</h2>
<h:panelGrid border="1" columns="2">
<h:outputLabel value="login (email):"></h:outputLabel>
<h:outputText value="#{loginBean.name}"></h:outputText>
<h:outputLabel value="hasło:"></h:outputLabel>
<h:inputSecret value="#{loginBean.password}"></h:inputSecret>
</h:panelGrid>
<h:commandButton value="Ok"></h:commandButton>
</h:form>
</f:view>
</body></html>
JSF konwertery i walidatory
Walidator
<p>Podaj ilość osób na utrzymaniu (od 1 do 20):
<h:inputText value'#{userBean.iloscOsobnaUtrzymaniu}” id=”ionu”
required=”true”>
<f:validateLongRange minimum=”1” maximum=”20” />
</h:inputText>
</p>
<h:messages for=”ionu” />
<h:commandButton value=”Ok” />
JSF konwertery i walidatory
Konwerter
<p>Stopa zwrotu:
<h:outputText value=”#{bean.stopaZwrotu}”>
<f:convertNumber type=”percentage” />
</h:outputText>
</p>
JSF konwertery i walidatory
Konwerter i walidator
<p>
<h:inputText value=”#{adresBean.kodPocztowy}” required=”true” id=”kodp”
size=”6”>
<f:validator validatorId=”kodpWalidator” />
<f:converter converterId=”kodpKonwerter” />
</h:inputText>
</p>
<h:message styleClass=”errorMsg” for=”kodp” />
JSF konwertery i walidatory
• Konwertery mogą być powiązane z
komponentami wejściowymi i
wyjściowymi
• Walidatory mogą być tylko powiązane z
komponentami wejściowymi
Konwertery JSF
• Interfejs javax.faces.converter.Converter
zobacz :
http://java.sun.com/javaee/javaserverfaces/1.2/docs/api/
• java.lang.Object getAsObject(FacesContext context, UIComponent
component, java.lang.String value)
• java.lang.String getAsString(FacesContext context, UIComponent
component, java.lang.Object value)
Walidacja i konwersja
Faces
Request
Faces
Response
Restore
View
Apply
Request Values
Process
Validations
Render
Response
Invoke
Application
Update Model
Values
Standardowe konwertery
Converter ID
javax.faces.BigDecimal
javax.faces.BigInteger
javax.faces.Boolean
javax.faces.Byte
javax.faces.Character
javax.faces.DateTime
javax.faces.Double
javax.faces.Float
javax.faces.Integer
javax.faces.Long
javax.faces.Number
javax.faces.Short
Converter class
javax.faces.convert.BigDecimalConverter
javax.faces.convert.BigIntegerConverter
javax.faces.convert.BooleanConverter
javax.faces.convert.ByteConverter
javax.faces.convert.CharacterConverter
javax.faces.convert.DateTimeConverter
javax.faces.convert.DoubleConverter
javax.faces.convert.FloatConverter
javax.faces.convert.IntegerConverter
javax.faces.convert.LongConverter
javax.faces.convert.NumberConverter
javax.faces.convert.ShortConverter
Konwerter DataTime
Postać ogólna:
<f:converterDateTime dateStyle=”dateStyle” locale=”locale”
pattern=”formatPattern” timeZone=”timeZone”
type=”type” binding=”valueExp” />
Przykład użycia:
<h:inputText value=”#{userBean.dataUr}” id=”du” required=”true” >
<f:convertDateTime pattern=”MM-dd-yy” />
</h:inputText> (mm-dd-rr)
<h:message for=”du” />
Java Persistence API
• Część standardu EJB 3.0
• ORM
• Zbudowane na bazie Hibernate i TopLink
Encje
• Encje są zwykłymi obiektami Javy (POJO)
import javax.persistence.*
@Entity
public class Customer {
private int id;
private String name;
@Id @GeneratedValue
public int getId() {
return id; }
public void setId(int id) {
this.id = id; }
}
public String getName() {
return name; }
public void setName(String name) {
this.name = name; }
Encje zarządzanie i niezarządzane
• EntityManager
– centralny dostawca usług związanych z
utrwalaniem danych
– odpowiada za zarządzanie odwzorowaniem
obiektowo-relacyjnym
• Encje zarządzane – połączone z EntityManager,
zmiany w nich są śledzone i synchronizowane z
bazą danych
• Encje niezarządzane – odłączone od
EntityManager, zmiany w niech nie są śledzone
Uzyskiwanie dostępu do EntityManager
• J2EE - metoda 'wstrzykiwania'
import javax.persistence.*;
import javax.ejb.*;
@Stateless
public class FooBean implements FooRemote
{
@PersistenceContext(unitName=”up”)
private EntityManager entityManager;
}
Utrwalanie encji
Customer cust = new Customer();
cust.setName(„Jan Kowalski”);
entityManager.persist(cust);
Wyszukiwanie encji
• Metoda find()
Customer cust =
entityManager.find(Customer.class,
5);
• Metoda getReference()
Customer cust = null;
try {
cust=entityManager.getReference(
Customer.class,5);
} catch(EntityNotFoundException) {
//
}
Aktualizacja encji
@PersistenceContext
EntityManager entityManager;
@TransactionAttribute(REQUIRED)
public void updateCustomerName(int id,
String n) {
Customer cust =
entityManager.find(Customer.class,
id);
cust.setName(n);
}
Scalanie encji
@TransactionAttribute(REQUIRED)
public void mergeCustomer(Customer cust) {
Customer c = entityManager.merge(cust);
}
Usuwanie encji
@TransactionAttribute(REQUIRED)
public void removeCustomer(int id) {
Customer c =
entityManager.find(Customer.class,
id);
entityManager.remove(c);
}
Zapytania
Query q =
entityManager.createQuery(„from Customer
c where id=5”);
Customer cust =
(Customer)q.getSingleResult();
Więcej informacji
• Bill Burke, Richard Monson-Haefel
„Enterprise JavaBeans 3.0”
• http://java.sun.com/javaee/technologies/per
sistence.jsp
Komponenty sesyjne
Komponenty sesyjne (session beans)
• Bezstanowe (stateless) – kolekcja
wzajemnie powiązanych usług
reprezentowanych przez metody
• Stanowe (stateful) – wykonują zadania w
imieniu klienta i utrzymują stan
(konwersacji- conversational state)
właściwy dla danego klienta.
Bezstanowe komponenty sesyjne
• Po zakończeniu obsługi żądania jednego
klienta mogą przystąpić do obsługi żądania
innego klienta
• Nie utrzymują stanu konwersacji – nie
podlegają procesom aktywacji i pasywacji
• Wszystkie dane potrzebne do obsługi
żądania są przekazywane jako parametry*
• Są lekkie i szybkie
Interfejs biznesowy
• Komponent sesyjny może udostępniać
jeden lub wiele interfejsów biznesowych.
• Interfejs biznesowy może być interfejsem
zdalnym lub lokalnym (ale nie może pełnić
obu funkcji jednocześnie)
Rodzaje klientów
• Zdalny klient (dostęp przez zdalny interfejs
biznesowy)
– Może być uruchomiony na innym komputerze
(w innej JVM) niż EJB
– Może być komponentem webowym, aplikacją
kliencką lub innym EJB
– Nie ma dla niego znaczenia lokalizacja
(umiejscowienie) EJB
Rodzaje klientów
• Lokalny klient (dostęp
interfejs biznesowy)
przez
lokalny
– Musi być uruchomiony na tej samej JVM co
EJB
– Może być komponentem webowym lub innym
EJB
– Lokalizacja EJB jest dla niego istotna
Przykład
public interface CommunicationManager {
public boolean sendByEmail(Customer c,
String message) throws CommunicationException;
public boolean sendBySMS(Customer c, String
message) throws CommunicationException;
}
---------------------------------------------import javax.ejb.Remote;
@Remote
public interface CommunicationManager { ... }
---------------------------------------------import javax.ejb.Local;
@Local
public interface CommunicationManager { ... }
Przykład
@Stateless
public class CommunicationManagerBean
implements CommunicationManager {
public boolean sendByEmail(Customer c,
String message) throws CommunicationException
{
// implementacja
}
public boolean sendBySMS(Customer c, String
message) throws CommunicationException {
// implementacja
}
}
Interfejs SessionContext
• Daje dostęp do środowiska kontenera
EJB
• Może być używany do uzyskiwania
informacji o kontekście wywołania metod
Interfejs SessionContext
@Stateless
public class CommunicationManagerBean
implements CommunicationManager {
@Resource SessionContext ctx;
}
Uzyskanie referencji do samego siebie
@Stateless
public class ABean implements ARemote {
@Resource SessionContext ctx;
public void foo() {
ARemote mySelf =
ctx.getBussinessObject(ARemote.class);
}
}
Interfejs EJBContext
• Interfejs bazowy dla SessionContext
http://java.sun.com/javaee/5/docs/api/jav
ax/ejb/EJBContext.html
Cykl życia bezstanowego komponentu
sesyjnego
Stanowe komponenty sesyjne
• Utrzymują stan konwersacji
• Mogą przechowywać dane dla klienta
między poszczególnymi wywołaniami
metod
• Żądanie od jednego klienta muszą być
obsługiwane przez ten sam egzemplarz
• Komponenty nie mają charakteru trwałego
• Pozwalają przenieść logikę biznesową z
aplikacji na serwer
Przykład
@Remote
public interface ShoppingCenterRemote {
public Customer findOrCreateCustomer(String
name);
public boolean addItemToShoppingCart(Item i);
Public void removeItemFromShoppingCart(Item i);
public boolean makeOrder();
}
Przykład
@Stateful
public interface ShoppingCenterBean implements
ShoppingCenterRemote{
// implementacja
}
Użycie z perspektywy klienta
Context jndi = getInitialContext();
Object ref =
jndi.lookup(„ShoppingCenterBean/remote”);
ShoppingCenterRemote b = (ShoppingCenterRemote)
Portable.RemoteObject.narrow(ref,
ShoppingCenterRemote.class)
Cykl życia stanowego komponentu
sesyjnego
When to Use Session Beans
• In general, you should use a session
bean if the following circumstances hold:
– At any given time, only one client has
access to the bean instance.
– The state of the bean is not persistent,
existing only for a short period (perhaps a
few hours).
– The bean implements a web service.
When to Use Session Beans
• Stateful session beans are appropriate if
any of the following conditions are true:
– The bean’s state represents the interaction
between the bean and a specific client.
– The bean needs to hold information about
the client across method invocations.
– The bean mediates between the client and
the other components of the application,
presenting a simplified view to the client.
When to Use Session Beans
• To improve performance, you might choose a
stateless session bean if it has any of these traits:
– The bean’s state has no data for a specific
client.
– In a single method invocation, the bean
performs a generic task for all clients. For
example, you might use a stateless session
bean to send an email that confirms an online
order.
http://java.sun.com/javaee/5/docs/tutorial/doc/
bnbly.html

Podobne dokumenty