Tworzenie warstwy integracji i uzupełnienie wartwy prezentacji w wielowarstwowej aplikacji Przykład w środowisku Visual Web JSP

Podobne dokumenty
Utrwalanie danych zastosowanie obiektowego modelu danych warstwy biznesowej do generowania schematu relacyjnej bazy danych Przykład

Tworzenie warstwy prezentacji drugi etap Przykład z laboratorium5_6. Autor Zofia Kruczkiewicz Wzorce oprogramowania laboratorium7_8

Tworzenie warstwy prezentacji w wielowarstwowej aplikacji Przykład w środowisku Visual Web JSP

Autor Zofia Kruczkiewicz Wzorce oprogramowania - laboratorium5_6

Instrukcja 5 Laboratorium z Podstaw Inżynierii Oprogramowania. Warstwy integracji z bazą danych: Wzorzec DAO Technologia ORM

Projektowanie oprogramowania. Warstwa integracji z bazą danych oparta na technologii ORM Platforma Java EE Autor: Zofia Kruczkiewicz

Wstęp - Prosta aplikacja internetowa w technologii Java EE 5. Programowanie komponentowe 1

Programowanie komponentowe 5

Tworzenie systemów informatycznych. Inżynieria oprogramowania Zofia Kruczkiewicz

1. Czynności przygotowujące aplikację działającą na platformie Java SE Biblioteka5 (należy ją pobrać z załącznika z p.1)

Zasady generowania kluczy głównych Język Java Persistence Podstawowa architektura wielowarstwowych aplikacji w oparciu o wzorce oprogramowania

E:\DYDAKTYKA\ZAI\ZWWW\Laboratoria\L07\Java Persistence.doc 2011-lis-24, 17:0 Zaawansowane aplikacje internetowe Laboratorium Java Persistence.

Laboratorium 1. Wzorce oprogramowania lab1, Zofia Kruczkiewicz

Instrukcja tworzenia aplikacji EE na bazie aplikacji prezentowanej na zajęciach lab.4 z PIO umożliwiająca przez sieć dostęp wielu użytkownikom.

Wprowadzenie do technologii JavaServer Faces 2.1 na podstawie

Wprowadzenie do technologii JavaServer Faces 2.1 na podstawie

Zaawansowane aplikacje internetowe - laboratorium

Bazy danych tworzenie aplikacji bazodanowych ORM / JPA

Sposoby tworzenia projektu zawierającego aplet w środowisku NetBeans. Metody zabezpieczenia komputera użytkownika przed działaniem apletu.

Budowa prostej aplikacji wielowarstwowej. Laboratorium 1 Programowanie komponentowe Zofia Kruczkiewicz

Budowa aplikacji wielowarstwowych zastosowanie szablonów. Laboratorium 2 Programowanie komponentowe Zofia Kruczkiewicz

Zastosowanie komponentów EJB typu Session

Tworzenie systemów informatycznych. Inżynieria oprogramowania Zofia Kruczkiewicz

E:\DYDAKTYKA\ZAI\ZWWW\Laboratoria\L07\Java Persistence.doc 2011-lis-24, 17:0 Zaawansowane aplikacje internetowe Laboratorium Java Persistence.

Java Enterprise Edition spotkanie nr 6. przygotował Jacek Sroka. Java Persistence API

Laboratorium z przedmiotu: Inżynieria Oprogramowania INP

Programowanie komponentowe. Przykład 1 Bezpieczeństwo wg The Java EE 5 Tutorial Autor: Zofia Kruczkiewicz

Protokół JDBC współpraca z relacyjnymi bazami danych lab4. Dr inż. Zofia Kruczkiewicz Programowanie aplikacji internetowych

Protokół JDBC współpraca z relacyjnymi bazami danych lab3

Języki i metody programowania Java Lab2 podejście obiektowe

Java Persistence API. Class powinny być zaznaczone. Kliknij przycisk Finish.

Laboratorium 2_3_4 Wzorce oprogramowania zastosowane w modelu obiektowym (wg Alan Shalloway, James R.Trott)

Wielowarstwowe aplikacje internetowe - laboratorium

Podstawowe informacje o technologii Java Persistence API

Materiały oryginalne: ZAWWW-2st1.2-l11.tresc-1.0kolor.pdf. Materiały poprawione

Informacje wstępne Autor Zofia Kruczkiewicz Wzorce oprogramowania 4

Instrukcja 2 Laboratorium z Podstaw Inżynierii Oprogramowania

1 LINQ. Zaawansowane programowanie internetowe Instrukcja nr 1

Projekt INP Instrukcja 2. Autor Dr inż. Zofia Kruczkiewicz

Przykłady tworzenia aplikacji komponentowych w technologii JavaServer Faces 2.1 na podstawie

Wykład 5 Okna MDI i SDI, dziedziczenie

Laboratorium z przedmiotu: Inżynieria Oprogramowania INEK Instrukcja 7

Podstawowe informacje o technologii Java Persistence API - przykład

Tworzenie systemów informatycznych. Inżynieria oprogramowania Zofia Kruczkiewicz

Modelowanie i analiza. warstwy biznesowej aplikacji

Java EE: JSF + EJB + JPA

Instrukcja 10 Laboratorium 13 Testy akceptacyjne z wykorzystaniem narzędzia FitNesse

Budowa aplikacji z graficznym interfejsem użytkownika - GUI (Graphic User Interface)

Diagramy maszyn stanowych, wzorce projektowe Wykład 5 część 1

Budowa prostej aplikacji wielowarstwowej

Wybierz kategorię Java Web i typ projektu Web Application. Kliknij przycisk Next >.

BEAN VALIDATION. Waldemar Korłub. Narzędzia i aplikacje Java EE KASK ETI Politechnika Gdańska

Wykład 6 Dziedziczenie cd., pliki

Projekt INP Instrukcja 1. Autor Dr inż. Zofia Kruczkiewicz

Laboratorium z przedmiotu: Inżynieria Oprogramowania INEK Instrukcja 6

WYKONANIE APLIKACJI OKIENKOWEJ OBLICZAJĄCEJ SUMĘ DWÓCH LICZB W ŚRODOWISKU PROGRAMISTYCZNYM. NetBeans. Wykonał: Jacek Ventzke informatyka sem.

Zaawansowane aplikacje internetowe - laboratorium Architektura Spring.

Java Persistence API (JPA)

Programowanie obiektowe

Ćwiczenia 9 - Swing - część 1

Programowanie obiektowe zastosowanie języka Java SE

Laboratorium z przedmiotu: Inżynieria Oprogramowania INP002017_ Laboratorium 11 Testy akceptacyjne z wykorzystaniem narzędzia FitNesse

Instytut Mechaniki i Inżynierii Obliczeniowej Wydział Mechaniczny technologiczny Politechnika Śląska

Tworzenie projektu zawierającego aplet w środowisku NetBeans. lab1. Dr inż. Zofia Kruczkiewicz Programowanie aplikacji internetowych

Instytut Mechaniki i Inżynierii Obliczeniowej fb.com/groups/bazydanychmt/

Wzorce logiki dziedziny

Języki i metody programowania Java Lab1 Zofia Kruczkiewicz

Języki i metody programowania Java Lab4 podejście obiektowe, zastosowanie pojemników

Programowanie obiektowe

Języki i metody programowania Java INF302W Wykład 2 (część 1)

Wykład 4 Delegat (delegate), właściwości indeksowane, zdarzenie (event) Zofia Kruczkiewicz

Laboratorium z przedmiotu: Inżynieria Oprogramowania INEK Instrukcja 5

ASP.NET MVC. Podstawy. Zaawansowane programowanie internetowe Instrukcja nr 3

Narzędzia i aplikacje Java EE. Usługi sieciowe Paweł Czarnul pczarnul@eti.pg.gda.pl

Języki i metody programowania Java. Wykład 2 (część 2)

Wprowadzenie do Doctrine ORM

Budowa aplikacji wielowarstwowych. Obsługa zdarzeń

Projektowanie aplikacji internetowych laboratorium

Instrukcja 3 Laboratorium z Podstaw Inżynierii Oprogramowania

Aplikacje WWW - laboratorium

Db4o obiektowa baza danych wersja.net

Java EE: JSF + EJB + JPA + CDI + BV

Wykład 3 Inżynieria oprogramowania. Przykład 1 Bezpieczeństwo(2) wg The Java EE 5 Tutorial Autor: Zofia Kruczkiewicz

Instytut Mechaniki i Inżynierii Obliczeniowej Wydział Mechaniczny technologiczny Politechnika Śląska

Kurs programowania. Wykład 2. Wojciech Macyna. 17 marca 2016

Diagramy stanów tworzenie modeli analizy i projektowania Na podstawie UML 2.0 Tutorial

Aplikacje w środowisku Java

Zaawansowane aplikacje internetowe - laboratorium Architektura CORBA.

Diagramy maszyn stanowych, wzorce projektowe Wykład 5 część 1

Metody dostępu do danych

Aplikacje w środowisku Java

Wdrożenie do projektu

Microsoft.NET: ASP.NET MVC + Entity Framework (Code First)

ORM w Javie. Adam Michalik 2007

Programowanie obiektowe i zdarzeniowe wykład 4 Kompozycja, kolekcje, wiązanie danych

Koncepcja, projekt i implementacja wielowarstwowego systemu informatycznego Inżynieria oprogramowania Zofia Kruczkiewicz

Laboratorium 1 - Programowanie proceduralne i obiektowe

Wprowadzenie do laboratorium. Zasady obowiązujące na zajęciach. Wprowadzenie do narzędzi wykorzystywanych podczas laboratorium.

Programowanie Obiektowe GUI

Transkrypt:

Tworzenie warstwy integracji i uzupełnienie wartwy prezentacji w wielowarstwowej aplikacji Przykład w środowisku Visual Web JSP Autor Zofia Kruczkiewicz Programowanie i wdrażanie systemów informatycznych

Architektura aplikacji pięciowarstwowej Baza danych katalog Warstwa integrująca (EntityManager, ) Technologia TopLink Wzorce: Domain Store Transfer Object fasady (XXXController) fabryki obiektów Obiektowy model danych Wzorce: fasady TAplikacja fabryki obiektów strategii ApplicationBean1 Wzorzec fasady usług SessionBean1 Wzorzec fasady sesji SessionBean1 Wzorzec fasady sesji SessionBean1 Wzorzec fasady sesji Page1 (JSF) Page1 (JSF) Page1 (JSF) Klient1 Klient2 Klient3

1. Tworzenie pustej bazy danych w systemie baz danych Derby

Tworzenie bazy danych w systemie baz danych Derby Należy wybrać katalog na pustą bazę danych w systemie bazy danych Derby domyślnym katalogiem jest katalog użytkowników systemu Windows \.netbeans-derby - slajd(1) Należy wybrać z zakładki Services środowiska NetBeans 6.7.1 opcję Databases. Następnie kliknąć prawym klawiszem myszy na Java DB i wybrać opcję Create Database slajd (2) W formularzu tworzenia bazy danych wg wzoru podanego na slajdzie (3) wprowadzić dane dotyczące bazy danych: Database Name, User, Password oraz Database Location (domyślne lub wybrane przez użytkownika) w wybranym katalogu pojawi się katalog o nazwie bazy danych z pustą bazą danych (slajd (4)) W zakładce Service należy otworzyć opcję Databases (slajd (5)) i wybierając prawym klawiszem myszy pozycję z listy połączeń do baz danych typu jdbc:derby://localhost:1527/nazwa_bazy_danych:[użytkownik on schematbazydanych], należy nacisnąć Connect. Po chwili nastąpi połączenie z bazą danych pustą symboliczny kwadrat z lewej strony łańcucha połączenia ulegnie scaleniu. Przy połączeniu domyślnie zapamiętane jest hasło do bazy danych. Można to zmienić w okienku Properties (wybór po kliknięciu prawym klawiszem myszy na pozycję połączenia) Należy kliknąć na symbol [+] z lewej strony łańcucha połączenia pojawi się zawartość katalogu z trzema pustymi podkatalogami: Tables, Views, Procedures (slajd (6))

1.1.Zakładanie nowej bazy danych w domyślnym katalogu dla baz danych typu Derby (1)

Zakładanie pustej bazy danych dla systemu baz danych Derby (2)

Zakładanie bazy danych katalog w systemie baz danych Derby (3)

Założono nową bazę danych katalog w domyślnym katalogu dla baz danych typu Derby (4)

1.2. Łączenie z pustą bazą danych (5)

Połączenie z pustą bazą danych (6)

2. Wykonanie kontrolerów wartwy integrującej warstwę biznesową z bazą danych (warstwa zasobów)

2.1. Dodanie modułu do utrwalania danych Należy wstawić moduł typu Persistence Unit - prawym klawiszem kliknąć na nazwę projektu w zakładce Projects, wybrać New\ Persistence Unit (slajd 7). Jeśli w liście nie ma pozycji Persistence Unit, należy wybrać pozycję Other, wybrać w formularzu New File w lewym oknie Categories pozycję Persistence i w prawym oknie FileTypes typ pliku Persistence Unit. Po naciśnięciu Next należy ustalić nazwę modułu. Nazwa modułu wynika z nazwy projektu z przyrostkiem PU. Można zmienić tę nazwę. Należy wybrać Persistence Library typu TopLink oraz połączyć się z pustą bazą danych założoną w pierwszym etapie prac wybierając właściwy łańcuch połączenia z listy Data Source (slajd 8). W formularzu tworzenia modułu należy wybrać Strategy Generation Table typu Create (slajd 9) jeśli tabel nie ma, zostaną utworzone, w przeciwnym wypadku nie będą tworzone nowe tabele (sytuacja sygnalizowana wyjątkami). W katalogu projektu Source Packages META-INF pojawia się plik persitence.xml i w katalogu Libraries pojawiają się biblioteki technologii TopLink w plikach jar zaznaczono je na slajdzie (10)

Wstawianie do projektu typu Java Application modułu typu Persistence Unit (7)

Wybór bazy danych, w której będą utrwalane obiekty pustej (8)

Tworzenie modułu utrwalania danych dla technologii TopLink (9)

Plik persistence.xml reprezentujący moduł utrwalania danych typu TopLink Uzupełnianie zawartości projektu typu Java Application o klasy typu Controller dla każdej z utrwalanych klas modelu obiektowego (10)

2.2. Wprowadzanie warstwy integracji i przekształcanie klas modelu obiektowego na encje Na slajdach 11 do 17 podano wskazówki dotyczące zamiany klas TTytul_ksiazki, TTytul_ksiazki_na_kasecie, TEgzemplarz, TEgzemplarz_termin na klasy z adnotacjami @Entity. W klasie TEgzemplarz wprowadzono wirtualne metody: public Date gettermin() i public void settermin(date termin). Podczas tworzenia kodu należy uzupełniać import pakietów za pomocą opcji Fix Imports (prawym klawiszem myszy należy klikać na ciało klasy i wybrać z wyskakującego menu Fix Imports i wybierać klasy z pakietu javax.persistence). Zgodnie ze slajdem 18, należy w zakładce Projects wybrać w projekcie zakładkę META-INF i otworzyć plik persistence.xml w trybie Design. W formularzu pliku XML należy za pomocą klawisza Add class wstawić z listy utworzone cztery klasy typu Entity. Należy skompilować uzupełniany projekt tutaj Wypozyczalnia1app

(11) Encja TTytul_ksiazki - zmiana typu klas danych na typ @Entity dodano adnotacje, nowe atrybuty (Id, Ksiazka) z metodami. Należy zestandaryzować nazwy metod dostępu do składowych

(12) Encja TTytul_ksiazki cd.

(13) Encja TTytul_ksiazki cd. należy przedefiniować metody equals oraz hashcode

(14) Encja TTytul_ksiazki_na_kasecie - zmiana typu klas danych na typ @Entity dzięki polimorfizmowi metod getaktor i setaktor obie klasy zostaną odwzorowane do jednej tabeli TTytul_ksiazki w bazie danych

(15) Encja TEgzemplarz - Zmiana typu klas danych na typ @Entity () dodano adnotacje, nowy atrybut (Id) z metodami. Należy zestandaryzować nazwy metod dostępu do składowych utrwalanych

(16) Encja Tegzemplarz cd należy przedefiniować metody equals oraz hashcode

(17) Encja Tegzemplarz_termin - zmiana typu klas danych na typ @Entity dzięki polimorfizmowi metod gettermin i settermin obie klasy zostaną odwzorowane do jednej tabeli o nazwie TEgzemplarz w bazie danych

(18) Wstawienie do modułu typu Persistence Unit wszystkich klas typu Entity

2.3. Dodanie kontrolerów do utrwalania encji Na slajdzie (19) pokazano docelową zawartość projektu typu Java Application należy teraz utworzyć klasy typu Controller dla każdej z utrwalanych klas. W przypadku dziedziczenia należy utworzyć te klasy dla klas bazowych. Klasy typu Controller są fasadami warstwy integracji dla każdej z utrwalanych klas. W celu utworzenia każdego z plików TTytul_ksiazkiController.java oraz TEgzemplarzController.java, należy prawym klawiszem kliknąć na nazwę projektu w zakładce Projects, wybrać New\Java Class. Jeśli w liście nie ma pozycji Java Class, należy wybrać pozycję Other, wybrać w formularzu New File w lewym oknie Categories pozycję Java i w prawym oknie FileTypes typ pliku Java Class. Po naciśnięciu Next należy podać nazwę pliku w pozycji Class Name (TTytul_ksiazkiController) i wybrać z listy Package pakiet, w którym znajdują się klasy warstwy biznesowej (TTytul_ksiazki.java itd..) np. wypozyczalnia1app. Nacisnąć Finish. Całą procedurę powtórzyć do utworzenia pliku TEgzemplarzController.java. Po zakończeniu tych czynności powstają pliki zawierające klasy typu public z pustym ciałem. Na slajdach 20-22 pokazano przebieg tworzenia kodu dla klasy typu Controller dla TTytul_ksiazki. Należy napisać taki kod zgodnie ze wskazówkami również dla klasy TEgzemplarz. Podczas pisania metody getentitymanager() łańcuch w liście parametrów metody createentitymanagerfactory powinien być nazwą modułu Persistence Unit. Oba pliki mogą znajdować się w katalogu klas modelu biznesowego lub nowym pakiecie tego projektu. W celu ułatwienia czynności po zakończeniu tworzenia ciała klasy TTytul_ksiazkiController można skopiować je i wkleić do ciała klasy TEgzemplarzController, zamienić ciąg znaków TTytul_ksiazki na TEgzemplarz za pomocą CTRL+H. Podczas tworzenia kodu należy uzupełniać import pakietów za pomocą opcji Fix Imports (prawym klawiszem myszy należy klikać na ciało klasy i wybrać z wyskakującego menu Fix Imports i wybierać klasy z pakietu javax.persistence. Dla typu List wybrać pakiet java.util.).

(19) Inżynieria odwrotna dla utworzonych przez programistę klas typu Controller dla każdej z utrwalanych klas modelu obiektowego (TTytul_ksiazki)

(20) Diagram klas uproszczony schemat warstwy integracji Fasady warstwy integracji

(21) Klasa typu TTytul_ksiazkiController dla każdej z klas utrwalanych obiektów public class TTytul_ksiazkiController { private EntityManagerFactory emf=null; private EntityManager getentitymanager() { if (emf == null) { emf = Persistence.createEntityManagerFactory("Wypozyczalnia1appPU"); } return emf.createentitymanager(); } public boolean findttytul_ksiazkis(ttytul_ksiazki TTytul_ksiazki) { EntityManager em = getentitymanager(); try { return em.find(ttytul_ksiazki.class, TTytul_ksiazki.getId())!=null; } finally { em.close(); } } public TTytul_ksiazki[] getttytul_ksiazkis() { return (TTytul_ksiazki[]) getttytul_ksiazki().toarray( new TTytul_ksiazki[0]); } public List<TTytul_ksiazki> getttytul_ksiazki() { EntityManager em = getentitymanager(); try { javax.persistence.query q = em.createquery("select c from TTytul_ksiazki as c"); return q.getresultlist(); } finally { em.close(); } }

public boolean addttytul_ksiazkis( TTytul_ksiazki TTytul_ksiazki) { EntityManager em = getentitymanager(); try { em.gettransaction().begin(); em.persist(ttytul_ksiazki); em.gettransaction().commit(); } finally { em.close(); return false; } } public boolean addttytul_ksiazki(arraylist<ttytul_ksiazki> tytuly) { EntityManager em = getentitymanager(); try { Iterator it = tytuly.iterator(); while (it.hasnext()) { TTytul_ksiazki newttytul_ksiazki = (TTytul_ksiazki) it.next(); if (newttytul_ksiazki.getid()==null) { em.gettransaction().begin(); em.persist(newttytul_ksiazki); em.gettransaction().commit();} } } finally { em.close(); return false; } }

public boolean removettytul_ksiazkis(ttytul_ksiazki TTytul_ksiazki) { EntityManager em = getentitymanager(); try { em.gettransaction().begin(); TTytul_ksiazki TTytul_ksiazkix = em.find(ttytul_ksiazki.class, Tytul_ksiazki.getId()); em.remove(ttytul_ksiazkix); em.gettransaction().commit(); } finally { em.close(); return false; } } public boolean updatettytul_ksiazkis(ttytul_ksiazki TTytul_ksiazki) { EntityManager em = getentitymanager(); try { em.gettransaction().begin(); TTytul_ksiazki TTytul_ksiazkix = em.find(ttytul_ksiazki.class, TTytul_ksiazki.getId()); TTytul_ksiazkix.setTytul(TTytul_ksiazki.getTytul()); TTytul_ksiazkix.setAutor(TTytul_ksiazki.getAutor()); TTytul_ksiazkix.setISBN(TTytul_ksiazki.getISBN()); TTytul_ksiazkix.setWydawnictwo(TTytul_ksiazki.getWydawnictwo()); em.gettransaction().commit(); } finally { em.close(); return false; } }

(22) Klasa typu TEgzemplarzController dla każdej z klas utrwalanych obiektów public class TEgzemplarzController { private EntityManagerFactory emf = null; private EntityManager getentitymanager() { if (emf == null) { emf = Persistence.createEntityManagerFactory("Wypozyczalnia1appPU"); } return emf.createentitymanager(); } public boolean findtegzemplarzs(tegzemplarz TEgzemplarz) { EntityManager em = getentitymanager(); try { return em.find(tegzemplarz.class, TEgzemplarz.getId())!=null; } finally { em.close(); } } public TEgzemplarz[] gettegzemplarzs() { return (TEgzemplarz[]) gettegzemplarze().toarray(new TEgzemplarz[0]); } public List<TEgzemplarz> gettegzemplarze() { EntityManager em = getentitymanager(); try { javax.persistence.query q = em.createquery("select c from TEgzemplarz as c"); return q.getresultlist(); } finally { em.close(); } }

public boolean addtegzemplarzs(tegzemplarz TEgzemplarz) { EntityManager em = getentitymanager(); try { em.gettransaction().begin(); em.persist(tegzemplarz); em.gettransaction().commit(); } finally { em.close(); return false; } } public boolean addtegzemplarze(arraylist<ttytul_ksiazki> tytuly) { EntityManager em = getentitymanager(); Iterator it = tytuly.iterator(); try { while (it.hasnext()) { TTytul_ksiazki newttytul_ksiazki = (TTytul_ksiazki) it.next(); if (newttytul_ksiazki.getid()==null) continue; terator it_ = newttytul_ksiazki.getmksiazka().iterator(); while (it_.hasnext()) { TEgzemplarz newtegzemplarz = (TEgzemplarz) it_.next(); if (newtegzemplarz.getid()==null) { em.gettransaction().begin(); em.persist(newtegzemplarz); em.gettransaction().commit(); } } } } finally { em.close(); return false; } }

public boolean removetegzemplarzs(tegzemplarz TEgzemplarz) { EntityManager em = getentitymanager(); try { em.gettransaction().begin(); TEgzemplarz TEgzemplarzx = em.find(tegzemplarz.class, TEgzemplarz.getId()); em.remove(tegzemplarzx); em.gettransaction().commit(); } finally { em.close(); return false; } } } public boolean updatetegzemplarzs(tegzemplarz TEgzemplarz) { EntityManager em = getentitymanager(); try { em.gettransaction().begin(); TEgzemplarz TEgzemplarzx = em.find(tegzemplarz.class, TEgzemplarz.getId()); TEgzemplarzx.setNumer(TEgzemplarz.getNumer()); em.gettransaction().commit(); } finally { em.close(); return false; } }

3. Wykonanie formularzy typy JSP zawierających wieloużywalne formularze typu JSPF dla uzupełnienie formularzy dla warstwy integrującej

Projekty formularza głównego Strona główna (Page1.jsp)

Projekty formularza Dodaj tytul do bazy (Baza_tytul.jsp)

Wstawianie atrybutów obiektowych do kodu Javy w celu zmiany właściwości komponentu metodami programistycznymi - należy to wykonać dla uproszczenia dla każdego komponentu użytego w projekcie.

Projekty formularza Przepisz tytuły do bazy (Baza_tytuly.jsp)

Projekty formularza Przepisz ksiazki do bazy (Baza_ksiazki.jsp)

4. Wykonanie oprogramowania systemu dla wielu klientów ze wspólną warstwą biznesową istniejącą podczas sesji i wspólną warstwą integrująca z bazą danych uzupełnienie dla warstwy integrującej

4.1. Oprogramowanie dotyczące formularza Dodaj tytul do bazy 4.1.1. Definicje metod w klasie Baza_tytul dla strony typu JSP do zapisu tytułów z warstwy biznesowej metodą zapisz_tytul_do_bazy (obsługa zdarzenia bazatytul_action) 4.1.2. Generowania widoku w fazie Response - przetwarzanie strony metoda prerender (wygaszanie linku do bieżącej strony w formularzu Menu typu JSPF, aktualizacja tablicy tytuly metodą updatetytuls w klasie ApplicationBean1, wyświetlanej w komponencie Table strony Tytulybaza typu JSPF, czyszczenie pól formularza FormTytul typu JSPF jego metodą odswiez_form)

4.1.3. Definicje metod w klasie ApplicationBean1: - odczytującą dane typu kolekcja obiektów TTytul_ksiazki i TTytul_ksiazki_na_kasecie z bazy danych (updatetytuls) - metoda zapisz_tytul_do_bazy zapisująca do bazy danych (addttytul_ksiazkis) i warstwy biznesowej (dodaj_tytul ) pojedynczych danych typu TTytul_ksiazki i TTytul_ksiazki_na_kasecie oraz odświeżająca zawartość komponentu typu DropDownList na stronie Tytulyaplikacja typu JSPF (przygotujtytuly)

4.1.4. Bindowanie tablicy tytuly z komponentem typu Table w celu wyświetlenia wszystkich tytułów przechowywanych w pamięci aplikacji

4.2. Oprogramowanie dotyczące formularza Baza_tytuly.jsp 4.2.1. Definicje metod w klasie Baza_tytuly dla strony typu JSP do zapisu tytułów z warstwy biznesowej metodą zapisz_tytuly_do_bazy (obsługa zdarzenia dodajtytulbaza_action) 4.2.2. Generowanie widoku w fazie Response - przetwarzanie strony metodą prerender (wygaszanie linku do bieżącej strony w fdormularzu Menu typu JSPF i aktualizacja tablicy tytuly metodą updatetytuls w klasie ApplicationBean1 wyświetlanej w komponencie Table strony Tytulybaza typu JSPF)

4.2.3. Definicje metody zapisz_tytuly_do_bazy w klasie ApplicationBean1 związanej z zapisem danych typu kolekcja obiektów TTytul_ksiazki i TTytul_ksiazki_na_kasecie w bazie danych

4.3. Oprogramowanie dotyczące formularza Baza_ksiazki.jsp 4.3.1. Definicje metod w klasie Baza_ksiazki dla strony typu JSP do zapisu książek z warstwy biznesowej metodą zapisz_ksiazki_do_bazy (obsługa zdarzenia dodajksiazkabaza_action) 4.3.2. Generowanie widoku w fazie Response - przetwarzanie strony metodą prerender (wygaszanie linku do bieżącej strony w formularzu Menu typu JSPF i aktualizacja tablicy ksiazki metodą updateksiazkis w klasie ApplicationBean1 wyświetlanej w komponencie Table strony Ksiazkibaza typu JSPF)

4.3.3. Definicja metod w klasie ApplicationBean1 związanej z zapisem (zapisz_ksiazki_do_bazy) 4.3.4. Definicja metod w klasie ApplicationBean1 związanej z odczytem (updateksiazkis) danych typu kolekcja obiektów TEgzemplarz i TEgzemplarz_termin w bazie danych

4.3.5. Bindowanie tablicy ksiazki z komponentem typu Table w celu wyświetlenia wszystkich książek przechowywanych w pamięci aplikacji

4.4.

4.5. Widok bazy danych w zakładce Services wykonanie operacji ViewData dostępnej z wyskakującego menu po naciśnięciu tabeli TEgzemplarz prawym klawiszem myszy

Dodatek: Zalecenia dla klas typu Entity, które mogą być utrwalane w bazach danych (1) opis klas Entity na podstawie: http://java.sun.com/javaee/5/docs/tutorial/doc/ Musi posiadać adnotację javax.persistence.entity (@Entity) Klasa musi mieć konstruktor typu public lub protected, bezparametrowy Klasa nie może być typu final Klasa musi być serializowana, stąd musi wystąpić w deklaracji klasy implements Serializable Klasy typu Entity mogą dziedziczyć po klasach zarówno typu Entity jak i zwykłej oraz zwykła klasa może dziedziczyć od klasy typu Entity. Dostęp do danych obiektu typu Entity może odbywać się tylko poprzez metody Musi mieć metody hashcode() i equals(object other) Podstawowe adnotacje dla kluczy głównych (PK) @Id oznacza adnotację dla klucza głównego. Adnotacja @GeneratedValue (strategy=generationtype.<...>) oznacza strategię tworzenia wartości kluczy głównych, zależną od systemu baz danych (javax.persistence.generatedvalue, javax.persistence.generationtype). Adnotacja @GeneratedValue(strategy = GenerationType.IDENTITY) oznacza odpowiedzialność za generowanie wartości kluczy głównych przez bazę danych. Adnotacja @GeneratedValue(strategy = GenerationType.AUTO) pozwala na przejęcie odpowiedzialności za generowanie kluczy przez system mapujący np.toplink, który posługuje się pomocniczą tabelą przechowującą wartości potrzebne do generowania kluczy)

Dodatek: Zalecenia dla klas typu Entity, które mogą być utrwalane w bazach danych (2) Typy danych pól: typy nieobiektowe, java.lang.string, java.math.biginteger, java.math.bigdecimal,java.util.date, java.util.calendar, java.sql.date, java.sql.time, java.sql.timestamp, user-defined serializable types, byte[], Byte[], char[], Character[], typu wyliczeniowe, kolekcje, klasy wewnętrzne Pomijanie pól przy utrwalaniu realizuje się za pomocą javax.persistence.transient - @Transient Można stosować następujące interfejsy kolekcji: java.util.collection, java.util.set, java.util.list, java.util.map oraz korzystać z parametryzacji kolekcji np. set<phonenumber> getphonenumbers() {} void setphonenumbers(set<phonenumber>) {} Klucze główne: typy nieobiektowe (adnotacja @Id - javax.persistence.id ), typy złożone: java.lang.string, java.util.date, java.sql.date adnotacje javax.persistence.embeddedid and javax.persistence.idclass (@EmbeddedId oraz @IdClass) Muszą być publiczne Klasa klucza głównego musi mieć domyślny konstruktor, Klasa głównego klucza musi mieć metody hashcode() and equals(object other) Klasa głównego klucza musi być serializowana

Dodatek: Zalecenia dla klas typu Entity, które mogą być utrwalane w bazach danych (3) Zaznaczone metody w przykładowej klasie muszą wystąpić w klasach kluczy głównych oraz w klasach typu Entity public final class LineItemKey implements Serializable { public Integer orderid; public int itemid; public LineItemKey() {} public LineItemKey(Integer orderid, int itemid) { this.orderid = orderid; this.itemid = itemid; } public boolean equals(object otherob) { if (this == otherob) { return true; } if (!(otherob instanceof LineItemKey)) { return false; } LineItemKey other = (LineItemKey) otherob; return ( (orderid == null? other.orderid==null : public int hashcode() orderid.equals (other.orderid) ) && (itemid == other.itemid) ); } { return ( (orderid==null? 0 : orderid.hashcode()) ^ ((int) itemid) ); } public String tostring() { return "" + orderid + "-" + itemid; } }

Dodatek: Zalecenia dla klas typu Entity, które mogą być utrwalane w bazach danych (4) Typy relacji (liczność) One-to-one: adnotacja javax.persistence.onetoone -@OneToOne One-to-many: adnotacja javax.persistence.onetomany - @OneToMany Many-to-one: adnotacja javax.persistence.manytoone - @ManyToOne Many-to-many: adnotacja javax.persistence.manytomany - @ManyToMany Kierunek relacji Jednokierunkowa posiada implementację po jednej stronie relacji (zapytanie może być realizowane od właściela, który zna inny obiekt ) Dwukierunkowa musi spełniać wymagania: Przeciwna strona relacji musi posiadać element typu mappedby o adnotacji @OneToOne, @OneToMany, lub @ManyToMany, w zależności od definicji drugiej strony relacji. Element mappedby oznacza pole właściciela relacji (drugiej strony relacji). Druga strona relacji many-to-many lub many-to-one nie może posiadać elementu mappedby. Dla relacji one-to-one, strona właściciela odpowiada stronie z kluczem obcym. Dla relacji many-to-many każda strona relacji jest właścicielem drugiej strony. Zapytanie mogą być realizowane w obu kierunkach Kaskadowe usuwanie wszystkich obiektów powiązanych przez element mappedby np. @OneToMany(cascade=REMOVE, mappedby="customer ") public Set<Order> getorders() { return orders; }