Laboratorium Prosta aplikacja Java EE typu Enterprise Zadania:
Transkrypt
Laboratorium Prosta aplikacja Java EE typu Enterprise Zadania:
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 ze strony: http://glassfish.java.net/public/downloadsindex.html#top Nie zmieniaj ustawień domeny (Domain Info), tylko dla użytkownika admin ustaw hasło nimda. 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). 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 Ilustracja 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 o nazwie HelloUsersWEB c) Projekt nadrzędny HelloUsersPRJ typu Enterprise Application Project 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. Uruchom aplikację HelloUsersPRJ 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. Zweryfikuj działanie 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