Laboratorium - Elementy aplikacji Enterprise Java EE

Transkrypt

Laboratorium - Elementy aplikacji Enterprise Java EE
Laboratorium
Prosta aplikacja Java EE typu Enterprise
Głównym celem laboratorium jest zapoznanie studenta z podstawowymi mechanizmami tworzenia
aplikacji przy użyciu Java EE z szczególnym uwzględnieniem warstwy logiki i dostępu do danych.
Laboratorium m.in. obejmuje następujące zagadnienia:
1. Organizacja złożonego projektu EAR aplikacji Java EE.
2. Komponenty Enterprise Java Beans (EJB) 3/3.1.
3. Serwery aplikacji Java EE (Glassfish).
4. Warstwa trwałości w oparciu mapowanie O/R o Java Persistence API (JPA).
Materiały pomocnicze
1. http://docs.oracle.com/javaee/6/api/
2. http://www.oracle.com/technetwork/java/javaee/documentation/tutorials-137605.html
3. http://www.tutorialspoint.com/jsp/jsp_standard_tag_library.htm
4. http://help.eclipse.org/juno/index.jsp?nav=%2F66_1
5. itd.
Instalacja serwera Glassfish
Upewnij się, że serwer Apache Tomcat jest wyłączony.
Ściągnij i zainstaluj Glassfish Open Source Edition Full Platform (w wersji 3.1.x) ze strony:
http://glassfish.java.net/public/downloadsindex.html#top
Nie zmieniaj ustawień domeny (Domain Info).
Następnie serwer Glassfish należy dodać do przestrzeni roboczej Eclipse (New → Server). W celu
pojawienia się Oracle Glassfish na liście serwerów należy w kreatorze wybrać opcję doinstalowania
odpowiedniego adaptera (Oracle GlassFish Server Tools). Przy konfiguracji JRE należy wybrać
zamiast JRE wybrać zainstalowane w systemie JDK Javy (w razie konieczności należy
skonfigurować Installed JRE preferences).
Zadania:
W celu przygotowania środowiska pracy utwórz w repozytorium w folderze trunk podfolder lab6ear (import lub checkout i commit). W razie potrzeby możesz usunąć wcześniejszą zawartość
folderu trunk. Nad poniższym projektem pracuj w kopii roboczej folderu lab6-ear commitując
zmiany w czasie trwania laboratorium.
Pliki źródłowe do laboratorium znajdują się w repozytorium svn pod adresem:
http://team.kis.p.lodz.pl:8080/svn/samples/trunk/psoir/lab-ear/
Zadanie 1
Wygeneruj za pomocą Eclipse IDE i uruchom na serwerze Glassfish projekt aplikacji przemysłowej
(ang. Enterprise application) składający się z dwóch projektów:
•
projekt EJB – mający na celu dostarczenie implementacji komponentów odpowiedzialnych
za dostęp do danych (patrz Zadanie 2).
•
projekt WEB – implementujący warstwę prezentacji i podstawową logikę aplikacji.
Schemat organizacji powyższej aplikacji został przedstawiony na 1.
Ilustracja 1: Organizacja projektu prostej aplikacji JavaEE [1]
1. W środowisku EclipseIDE utwórz nowe projekty skonfigurowane dla serwera Glassfish:
a) Projekt EJB o nazwie HelloUsersEJB
b) Projekt Dynamic WEB (w wersji 3.0) o nazwie HelloUsersWEB
c) Projekt nadrzędny HelloUsersPRJ typu Enterprise Application Project (w wersji 6.0)
zawierający powyższe projekty (etap Jave EE module dependencies kreatora).
2. Zapoznaj się ze strukturą projektów oraz z ich własnościami (Project → Properties). W
szczególności należy zwrócić uwagę na
•
Project Facets – konfiguracja własności i wymagań dla projektu.
•
Deployment Assembly – lista elementów wdrażanych na serwer aplikacji.
3. Do projektu HelloUsersWEB zaimportuj strony JSP: hello.jsp i index.jsp.
4. Zamknij projekt HelloUsersPRJ. Uruchom aplikację HelloUsersWEB na serwerze Glassfish
z poziomu EclipseIDE (Run->Run As->Run on server). Sprawdź działanie aplikacji.
UWAGA: Jeżeli strona się nie wyświetla sprawdź czy jest uruchomiony serwer (zakładka
Servers) oraz ścieżkę webową na jaką mapuje się serwlet (konfiguracja w drzewie projektu:
Deployment Descriptor->Servlet mappings)
5. Utwórz nowy serwlet do obsługi formularza w index.jsp. Serwlet ten korzystając z obiektu
RequestDispatcher:
ServletContext context = getServletContext();
RequestDispatcher dispatcher = context.getRequestDispatcher(url);
dispatcher.forward(request, response);
ma przenosić do strony hello.jsp. W przypadku, gdy przekazany parametr formularza user
jest pusty powinien nastąpić powrót do strony index.jsp, a za pomocą atrybutu żądania i
nazwie error należy przekazać informacje o błędzie, tzn: „User name must not be empty.”.
6. Przetestuj działanie strony JSP i serwletu.
Zadanie 2
W ramach projektu HelloUsersEJB zaimplementuj bezstanowy komponent sesyjny EJB 3
dostarczający mechanizm zdalnego dostępu do bazy danych użytkowników. Wykorzystaj ten
komponent do uzupełnienia serwletu z poprzedniego zadania o wyznaczenie pełnej nazwy
użytkownika (patrz na użycie atrybutu fullname w hello.jsp).
1. W ramach rozpoczętego w poprzednim zadaniu projektu HelloUsersEJB w pakiecie
edu.kis.psoir.users utwórz bezstanowy komponent sesyjny EJB 3 (New → Session bean) o
nazwie UsersResolver. Zaznacz opcję wygenerowania interfejsu typu Local (np.
IUsersResolverLocal).
2. Do utworzonego interfejsu dodaj metodę getFullName(String username) i zaimplementuj ją
w komponencie, aby „na sztywno” zwracała przykładowy napis.
3. W build path projektu HelloUsersWEB ustaw zależność od projektu HelloUsersEJB.
4. Używając annotacji @EJB do serwletu w projekcie HelloUsersWEB dodaj prywatny atrybut
typu lokalnego interfejsu odpowiadającego komponentowi sesyjnemu. Wykorzystaj metodę
getFullName, aby ustawić wartość atrybutu fullname wykorzystywanego przez hello.jsp
(Inicjalizacją atrybutu zajmie się kontener).
5. Otwórz projekt HelloUsersPRJ i zweryfikuj działanie całej aplikacji. W razie potrzeby
zrestartuj serwer.
6. * Znajdź odpowiedź na pytanie: W jaki sposób w instancji serwletu została ustawiona
(wstrzyknięta) instancja komponentu EJB?
7. Dodaj do projektu HelloUsersEJB klasę UserJavaDAO oraz bibliotekę sterownika JDBC do
bazy danych MySQL:
http://dev.mysql.com/downloads/connector/j/
8. Wydeleguj implementację metody getFullName do metody lookupFullname z klasy
UserJavaDAO w celu wykorzystania danych z bazy danych MySQL na serwerze team.
Sprawdź działanie aplikacji na użytkowniku 'dai'.
9. * Znajdź odpowiedź na pytanie: W jaki sposób zostaje wybrany sterownik MySQL do
realizacji zapytań?
10.
* Zmodyfikuj implementację klas projektu HelloUsersEJB, tak aby połączenie do
bazy Connection było ustanawiane tylko raz na czas życia komponentu sesyjnego.
(Wskazówka: zaimplementuj metody opatrzone annotacją @postconstruct i @predestroy)
Zadanie 3 - opcjonalne
Dodaj do aplikacji możliwość modyfikacji pełnej nazwy użytkownika w bazie danych.
Wskazówki:
1. Wykorzystaj obiekt sesji do zapamiętania identyfikatora użytkownika. Sesję pobieramy z
obiektu request (metoda getSession())
2. Obiekt sesji ma możliwość ustawiania (metoda setAttribute()) oraz pobierania wartości
atrybutów (metoda getAttribute()).
3. Rozszerz implementacje w obu projektach: HelloUsersEJB i HelloUsersWEB
Zadanie 4
1. Wykorzystując informacje o bazie danych z pliku UserJavaDAO skonfiguruj w przestrzeni
roboczej (workspace) Eclipse połączenie do bazy (okno Data Source Explorer → Database
Connections → new...)
2. Utworz plik SQL (lub SQL scrapbook) z instrukcją wstawiającą nowego użytkownika do
bazy oraz zapytaniem zwracającym całą tabelę o nazwie login. Uruchom instrukcje na bazie.
Zweryfikuj działanie aplikacji na nowym użytkowniku.
Zadanie 5
Ręcznie zaimplementuj alternatywną wersję bezstanowego komponentu sesyjnego realizującego
zadanie określone przez interfejs IUsersResolverLocal wykorzystując mapowanie O/R JPA (Java
Persistence API).
Wskazówki:
1. Usuń annotację @Stateless w UserResolver (W kontenerze aplikacji może być tylko jedna
implementacja komponentu sesyjnego o określonym interfejsie.).
2. Dodaj do projektu EJB Project Facet JPA wykorzystując bibliotekę EclipseLink i
skonfiguruj na połączenie z bazą MySQL na team.
3. W edytorze pliku persistence.xml w zakładce connection ustaw na typ transakcji
RESOURCE_LOCAL oraz użyj opcji 'Populate from connection...'.
4. Korzystając z JPA utworzyć encję UserEntity z tabeli login (JPA Entities from Tables).
5. Dostęp do danych w komponencie sesyjnym zrealizuj używając instancji klasy
EntityManager (np. metoda find), którą można otrzymać następująco:
Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME).createEntity
Manager()
Zadanie 6 - opcjonalne
Zmień konfigurację JPA tak, żeby bazowała na konfiguracji połączenia określonej na serwerze
Glassfish.
Wskazówki:
1. Ustaw typ transakcji na JTA.
2. Skonfiguruj ustawienia JDBC resources i connection polls w panelu administracyjnym
Glassfish.
3. Zrezygnuj z EntityManagerFactory, użyj annotacji @PersistenceContext z atrybutem
EntityManager.
Bibliografia
[1] Naci Dai, Lawrence Mandel, Arthur Ryman: Eclipse Web Tools Platform: Developing Java(TM) Web
Applications, Addison-Wesley Professional