sobota, 27 sierpnia 2011

Modelowanie danych z użyciem PowerDesigner cz1. Koceptualny model danych

Jest to narzędzie typu CASE (Computer Aided System Engineering) wyprodukowane przez firmę Sybase, która produkuje systemy bazodanowe.
PowerDesigner służy do modelowania systemów.  Jako bogate narzędzie posiada ono funkcje pozwalające na modelowanie różnych rozwiązań architektonicznych. Główne zastosowania to: modelowanie danych, hurtowni danych, obiektów aplikacji i systemów,procesów biznesowych,architektury korporacyjnej. Przyjrzyjmy się dziedzinie, w której narzędzie jest to najsilniejsze czyli modelowaniu danych. PowerDesigner obsługuje ponad 60 platform bazodanowych.


Model danych jest reprezentacją danych, które są przetwarzane i produkowane przez system. Modelowanie danych wiąże się z reprezentacją obiektów oraz z relacjami występującymi między nimi.
PowerDesigner umożliwia tworzenie konceptualnych, logicznych i fizycznych modeli danych. Modele pozwalają na analizę systemu na wszystkich poziomach abstrakcji.

W tym artykule skupimy się głównie na wykorzystaniu modelowania danych  przy tworzeniu bazy danych. Możemy wyróżnić trzy fazy projektowania bazy danych:
  • budowanie modelu konceptualnego
  • budowanie modelu logicznego
  • budowanie modelu fizycznego



Konceptualny model danych (conceptual data model CDM) reprezentuje ogólną strukturę danych w systemie informatycznym, czyli relacje pomiędzy jego obiektami. Model konceptualny jest najbardziej abstrakcyjną formą, dlatego pomija aspekt implementacji fizycznej. Dane są reprezentowane w postaci graficznej za pomocą encji i relacji. Powstaje on a podstawie udokumentowanych wymagań użytkownika, czyli w wyniku etapu analizy.

Logiczny model danych jest na niższym poziomie abstrakcji, ponieważ uwzględnia specyfikację modelu danych ale bez jakichkolwiek uwarunkowań konkretnej implementacji fizycznej. 

Fizyczny model danych jest opisem modelu logicznego, w konkretnym środowisku bazodanowym. Uwzględnia on organizację plików, indeksów itp.  


Reprezentacją graficzną modelu logicznego danych relacyjnych są diagramy E-R ( Entity Relationship Diagram - Diagram związków encji ) . Obiekty, które modelujemy są reprezentowane przez encje. Są one opisywane za pomocą atrybutów. Pomiędzy encjami występują powiązania. Powiązania wynikają z etapu analizy. 

Na poniższym konceptualnym diagramie danych, nauczyciel i student dziedziczą atrybuty z encji Osoba. Między encjami nauczyciel i student występuje relacja jeden do wielu (one-to-many). Oznacza ona, że nauczyciel ma kilku uczniów, ale każdy uczeń ma tylko jednego głównego nauczyciela.


Ponadto:
Nauczyciel może uczyć kilku przedmiotów i przedmiot może być prowadzony przez kilku nauczycieli ( relacja wiele do wielu).
Nauczyciel może uczyć kilku lekcji i lekcja jest prowadzona tylko przez jednego nauczyciela ( relacja jeden do wielu).
Student uczęszcza na wiele zajęć i lekcji  i jest wielu studentów na lekcji i zajęciach (relacja wiele-do-wielu).
Student studiuje wiele przedmiotów i przedmiot może być studiowany przez wielu studentów
(relacja wielu do wielu).

• wiele lekcji jest z danego przedmiotu, jeden przedmiot może mieć wiele lekcji (relacja wiele do jednego )


Składowymi modelu danych, czyli diagramu E-R są elementy:
  • Encja(entity) - prezentuje wyodrębniony logiczny zestaw danych (np. dane odnoszące się do osoby, samochodu itp)
  • Wystąpienie encji(entity instance) - instancja encji, która posiada określone wartości wszystkich atrybutów encji. Każde wystąpienie encji jest identyfikowane jednoznacznie za pomocą niepustego podzbioru atrybutów. (np. wystąpienie encji Uzytkownik jest konkretny użytkownik identyfikowany np. jego loginem )
  • Identyfikator encji(entity identifier) - jest to niepusty podzbiór atrybutów encji, który w jednoznaczny sposób identyfikuje każde wystąpienie encji.
  • Atrybut(attribute) - opisuje pewną właściwość encji lub związku. (np. dla encji Osoba atrybuty to imie, nazwisko, pesel itp )
  • Dziedzina atrybutu (domain) - jest to typ danych jakie mogą przyjmować atrybutu lub zakres wartości dozwolony dla danego atrybutu
  • Podklasa(subtype) - jest to encja będąca podzbiorem innej encji (nadklasy). Encja(podklasa) dziedziczy atrybuty i związki nadklasy(np. encja Student dziedziczy po bardziej ogólnej encji Osoba)
  • Związek(relationship) - jest to połączenie pomiędzy encjami (dwóch lub więcej). Odzwierciedla współdziałanie pomiędzy encjami. Związek pomiędzy instancjami tej samej klasy naszą nazwe rekurencyjnych. Związek może zawierać atrybuty, które go opisują. 
  • Liczność(cardinality) - jest to liczba instancji będących w danej relacji. Wyróżniamy ze względu na liczność następujące relacje: jeden do jedn, jeden do wielu, wiele do wiele.
  • Opcjonalność (modality) - jak sama nazwa wskazuje czy wystąpienie encji w danej relacji jest wymagane. 0 oznacz opcjonalność wystąpienia, 1 wymóg. ( W naszym przykładzie w relacji Nauczyciel - Student 0 jest reprezentowane przez okrąg, a 1 przez pionową kreskę. Nauczyciel może mieć wielu studentów ale równie dobrze w danym czasie nie musi mieć żadanego, natomiast student musi posiadać nauczyciela )
  • Normalizacja  - jest to technika analizy zależności pomiędzy elementami danych mająca na celu usuwania nadmiarowych, niespójnych elementów danych.

Pora na utworzenie naszego konceptualnego modelu danych. Po uruchomieniu naszego narzędzia z menu File wybieramy New, a potem New Model.




Następnie możemy zacząć tworzyć nasz model. W tym celu stwórzmy na początku wszystkie encje. Po prawej mamy do dyspozycji paletę narzędzi.



W celu edycji danej encji wystarczy kliknąć na nią dwukrotnie. W zakładce Attributes nadajemy atrybuty dla danej encji.




    Każdemu atrybutowi możemy określić, czy ma być kluczem głównym(P), czy jest obowiązkowy(M) czyli brak wartości NULL, i czy ma być wyświetlony(D). Ponadto możemy dla każdego atrybutu określić jego domenę. Klikając prawym przyciskiem myszy na pole numeracji atrybutów, z listy wybierzmy Properties(Właściwości), znajdziemy tam więcej ustawień dotyczących atrybutów.






Aby stworzyć relację wystarczy z palety wybrać ikonę, która reprezentuje relacje i przeciągnąć ją pomiędzy interesującymi nas encjami.







Aby ustawić właściwości relacji wystarczy kliknąć na nią dwukrotnie. W zakładce cardinalities ustawiamy liczność relacji. 










poniedziałek, 22 sierpnia 2011

Jak poprawnie zaimplementować wzorzec Singleton w Javie.

             Cel tego wzorca jest bardzo prosty tak jak on sam. Ma on zapewnić, że w naszej aplikacji istnieje tylko jedna instancja danej klasy. Jako, że mamy tylko jeden obiekt takowej klasy, trzeba oczywiście zapewnić do niego jakiś punkt dostępu, zwykle poprzez metodę statyczną. Pierwsza rzecz jaka przychodzi na myśl, to ograniczenie do konstruktora do własnej klasy i podklas.  Konstruktor musi być zatem opatrzony modyfikatorem private lub protected. Oczywiste też jest, że instancja musi być przechowywana w postaci prywatnego pola statycznego zainicjowanego wartością null. Najciekawiej prezentuje się metoda, która zarządza tym polem getInstance(). Jako, że stanowi ona nie jako punkt dostępu dla innych klas, musi być opatrzona modyfikatorem typu public.




Pojedyncza instrukcja if, która sprawdza czy instancja klasy nie została wcześniej utworzona mogła by nie wystarczyć. Wyobraźmy sobie taką sytuacje, że wątek który właśnie sprawdził czy instance == null zostaje wstrzymany na rzecz drugiego wątku.



Drugi wątek sprawdza warunek i tworzy obiekt. Może się zdarzyć, że wcześniejszy wątek znowu przejmie kontrolę w miejscu gdzie został wstrzymany czyli po wejściu do instrukcji if i ponownie utworzy nam instancje tej klasy. Może to wydawać się skomplikowane i zagmatwane ale kto nie wierzy ten niech sprawdzi. Można temu zapobiec stosują blok synchronizujący synchronized - zapewnia on nam, że kod w tym bloku w danym czasie może być wykonywany tylko przez jeden wątek.


Wydawać by się mogło, że jest to doskonałe rozwiązanie. Mamy tu jeden haczyk. Jaki? Jeśli klasa, ta implementowała by interfejs Serializable to po przez mechanizm serializacji można by utworzyć wiele takich obiektów. Spójrzmy na poniższy kod:



Rozwiązanie to wykorzystuje mechanizm class loader'ów. Jest on zapewniony przez maszynę wirtualną. Mechanizm ten jest synchronizowany. Obiekty class loader zapewniają ładowanie klas. Wewnątrz maszyny wirtualnej są zorganizowane w postaci drzewa. Jeśli taki obiekt otrzyma żądanie załadowania danej klasy to w celu uniknięcia wielokrotnego ładowania tej samej klasy, sprawdza czy jego nadrzędny class loader nie zrobił tego wcześniej.  Klasa wewnętrzna SingletonHolder posiada prywatne statyczne i niemodyfikowalne pole. Jak widzimy jest to instancja klasy Singleton. Kiedy zostaje wywołana metoda getInstance() class loader załaduje tylko jeden raz klasę SingletonHolder.

Istnieją jeszcze inne sposoby na poradzenie sobie z tym problemem. Przytoczyłem  dwa najbardziej popularne rozwiązania.

piątek, 19 sierpnia 2011

JAVA EE6 Programowanie aplikacji WWW KURS cz.5 Serwlety - Sesje

Ostatnio poznaliśmy podstawowe wykorzystanie Cookies. Dzisiaj przyjdzie czas na sesje. Protokół komunikacji między klientem a aplikacją WWW czyli HTTP został zaprojektowany jako bezstanowy. Oznacza to, że serwer nie jest w stanie określić czy dane żądanie HTTP pochodzi od tego samego użytkownika, czy od innych niezależnych użytkowników. Problem ten rozwiązano wprowadzając mechanizm emulacji sesji - HTTPSession. Zasada tego mechanizmu nie jest skomplikowana. Każdy klient dostaje od serwera niepowtarzalny identyfikator - identyfikator sesji. Zazwyczaj jest on zapisywany w zmiennej Cookie. Dzięki takiemu rozwiązaniu serwer aplikacji otrzymuje identyfikatoe przy ponownym żądaniu tego samego użytkownika. Serwer aplikacji posiada tablice sesji gdzie dany identyfikator skojarzony jest zbiór programowych obiektów JAVA, które reprezentują stan sesji. Jako, że serwlety w technologii JEE są mechanizm nazwijmy to niskopoziomowym mają one możliwość odczytu i zapisu obiektów odpowiadających za stan sesji. Wykorzystują do tego obiekt sesji. Jest on obiektem interfejsu HTTPSession. Stan sesji może zostać usunięty po przekroczeniu pewnego limitu czasowego lub po przez jawne usunięcie.



HttpSession session = request.getSession(true);
Podaje aktualną sesję lub tworzy nową. Gdyby podano parametr false, to nowa sesja nie będzie tworzona. Jeśli nie ma jeszcze sesji, metoda zwróci null.

Znowu przytoczę przykład z książki " JAVA EE6 programowanie aplikacji WWW". Poniższy kod sprawdza czy dane żądanie jest pierwszym żądaniem użytkownika danej sesji.





Oto najważniejsze metody interfejsu HTTPSession:


METODA

void setAttribute(n,o)
Opis

 Zapamiętuje na czas sesji obiekt pod podaną nazwą
String getId() Zwraca aktualny identyfikator sesji.
boolean isNew() Zwraca wartość true, jeśli klient nie odesłał jeszcze żądania z danym
identyfikatorem sesji.
long getCreationTime() Zwraca czas utworzenia sesji.
long getLastAccessedTime() Zwraca czas otrzymania przez kontener ostatniego żądania z danym
identyfikatorem sesji.
void setMaxInactivateInterval(int) Ustawia maksymalny czas (wyrażony w sekundach) pomiędzy kolejnymi żądaniami klienta w ramach danej sesji.
int getMaxInactiveInterval() Zwraca  maksymalny czas (wyrażony w sekundach) pomiędzy kolejnymi żądaniami klienta w ramach danej sesji.
void invalidate() Kończy sesję.

Oto inne wykorzystanie mechanizmu sesji. W poniższym kodzie następuje  mieszczenie nowego obiektu stanu sesji.



Następnie odczytujemy zapisany wcześniej obiekt stanu.





Jest to jedynie bardzo proste wykorzystanie sesji w celach edukacyjnych. Więcej możemy znaleźć w fachowej literaturze lub na stronach oracle. Temat miał jedynie pokazać czym są sesje i po co je stosujemy. Jeśli zamierzamy w przyszłości tworzyć aplikacje WWW musimy poszerzyć swoją wiedzę z tego zakresu.

wtorek, 16 sierpnia 2011

JAVA EE6 Programowanie aplikacji WWW KURS cz.4 Serwlety - Ciasteczka

Ciasteczka czyli zmiennie Cookies reprezentowane są w postaci klasy Cookie. Są one przechowywane na komputerach użytkowników aplikacji webowych. Dzięki nim możemy zapamiętywać preferencje, hasła, loginy.
Do wysyłania zmiennych Cookies do klienta HTTP służy metoda:
- addCookies() obiektu response
Zaś do odczytu zmiennych odebranych od klienta służy metoda:
- addCookies() obiektu request

Metody te tak naprawdę operują na nagłówkach żądań i odpowiedzi HTTP. Główne metody klasy Cookie to:





  •  Cookie(n, s) - tworzy zmienną o nazwie n i wartości s
  • String getDomain() - odczyt adresu domenowego dla, którego przeznaczona jest zmienna s
  • void setDomain(s) - ustawia adres domenowy dla, którego przeznaczona jest zmienna s
  • String getMaxAge() - odczyt czasu życia zmiennej liczony w sekundach 
  • void setMaxAge(v) - ustawia czas życia zmiennej liczony w sekundach 
  • String getName() - odczyt nazwy zmiennej
  • void setName(s) - ustawia zmienną 
  • String getPath() - odczyt prefiksu ścieżki URL na serwerze, dla której przeznaczona jest zmienna
  • void setPath(s) - ustawia prefiks ścieżki URL na serwerze, dla której przeznaczona jest zmienna
  • String getValue() - odczyt wartości zmiennej
  • void setValue(s) - ustawia wartość zmiennej
Kiedy zmienna Cookie jest wysyłana do klienta HTTP następuje serializacja obiektu do postaci łańcucha znakowego umieszczonego w nagłówku odpowiedzi HTTP, w polu Set-Cookie. Odczyt polega na operacji odwrotnej czyli zbudowaniu obiektu na podstawie pola Cookie nagłówka żądania HTTP.






Napiszmy sobie prosty serwlet, którego zadaniem będzie przechowywanie informacji o dacie ostatniej wizyty na stronie i wyświetlenie tej informacji. Przykład ten pochodzi z książki: "JAVA EE6 Programowanie aplikacji WWW"

W następnej części zastanowimy się nad problem bezstanowości protokołu HTTP. Czyli czas na sesje.

środa, 3 sierpnia 2011

JAVA EE6 Programowanie aplikacji WWW KURS cz.3 Serwlety.

Zaczynamy od podstaw podstaw. Opowiemy sobie o serwlecie czyli elemencie, który jest wykorzystywany we wszystkich aplikacjach webowych.

Warstwa prezentacji, o której wspomnieliśmy we wcześniejszych częściach stanowi część aplikacji WWW. Aplikacja ta znajduje się po stronie serwera HTTP, który odpowiada za generowanie graficznego interfejsu użytkownika. Każde żądanie powoduje kolejne wykonanie kodu logiki prezentacji. Protokół HTTP, który wykorzystuje model komunikacyjny typu klient-serwer jest protokołem tekstowym, oparty na TCP. Klient HTTP po nawiązaniu połączenia z serwerem przekazuje mu komunikat zawierający żądanie HTTP. Serwer HTTP odpowiada na żądanie i wysyła odpowiedź, która zawiera żądany dokument. Po zakończeniu tego procesu serwer zamyka połączenie. Musimy sobie powiedzieć, że protokół HTTP jest bezsesyjny i bezstanowy. Pod czas komunikacji klienta z serwerem, klient przekazuje parametry wywołania aplikacji na serwerze. Owe parametry mogą być przekazane za pośrednictwem protokołu HTTP na dwa sposoby:

- GET jest to rozkaz ,w którym parametry dołączone są do adresu URL
- POST  parametry są w ciele żądania HTTP, ciało reprezentuje dane wysyłane przez klienta HTTP do serwera np.parametry,pliki.





Działanie serwletów sprowadza się do metod doGet() doPost(). Obie metody są wywoływane, gdy serwlet otrzymuje żądanie HTTP. Kiedy klient spróbuje skorzystać z aplikacji po raz pierwszy, serwer wykona następujące czynności:

-załaduje klasy serwletu
-utworzy instancje serwletu
-wywoła metody init()
-wywoła metody service()

Każdy serwlet przez nas stworzony musi dziedziczyć po klasie HttpServlet. Wcześniej napisałem kilka podstawowych informacji dotyczących protokołu HTTP. Zawiera on definicję metod:GET, POST, PUT, HEAD, OPTIONS, TRACE, DELETE, CONNECT. W większości wypadków najczęściej stosuje się metody GET i POST.W serwlecie do obsługi tych metod służą nam:

-  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException

-  protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException

Napiszmy sobie naszą pierwszą aplikacje WWW. Do tego celu będziemy potrzebować środowiska programistycznego oraz serwera . Skorzystajmy do tego celu ze NetBeans IDE. Jako serwer aplikacji posłuży nam GlassFish. Zakładam, że czytelnik wie jak skonfigurować własne środowisko oraz serwer aplikacji więc nie będę wdawał się w zbędne szczegóły.

Gdy uruchomimy NetBeans'a, utwórzmy nowy projekt.
1. Z menu File wybieramy  New project.
2. Wybieramy element o nazwie Java Web, a potem zaznaczamy opcję Web Application i klikamy Next.
3. Nazywamy swoją aplikacje np. PierwszaAplikacja i klikamy Next.
4. Z listy Serwerów wybierzmy  pozycję GlssFish Server  3.x (Ja posiadam najnowszą wersje serwera)
5. Klikamy na przycisk Finish.



Powyższy rysunek przedstawia nam strukturę katalogów aplikacji webowej na serwerze.

Projekt aplikacji webowej domyślnie zawiera jedną stronę index.jsp. Wykorzystamy tę stronę do stworzenia prostego formularza. w formularzu stworzymy pole tekstowe i przycisk. Kiedy użytkownik kliknie na przycisk zostanie przeniesiony pod adres, który zostanie obsłużony przez serwlet. Zmodyfikujmy więc nasz plik index.jsp.

Dyrektywa @page określa różne istotne właściwości strony.
Atrybut action określa nazwę pliku, do którego przesyłamy żądanie. W naszym wypadku jest to formularz. Czas na stworzenie serwletu.

1. Kliknij prawym przyciskiem na Source Packages.
2. Z menu New wybierzmy opcję Servlet
3. Nazwijmy naszą klasę  ValidationOfAge, a w pole Package wpiszmy package1.
4. W następnym kroku zaznaczmy opcję : Add information to deployment descriptor (web.xml),a w polu Servlet Name wpiszmy Walidacja wieku. W polu URL Patterns(s) wpiszmy /validationofage.do  .

Powinniśmy otrzymać wygenerowany serwlet .



Środowisko NetBeans utworzył nam dodatkową metodę procesRequest(). Nie jest to metoda, która jest opisywana w specyfikacji, ale jedynie udogodnienie twórców tego środowiska. Możemy zauważyć, że niezależnie od rodzaju żądania, czy to jest żądanie typu GEST czy POST zawsze wywoływana jest metoda procesRequest().

Zmodyfikujmy właśnie tę metodę tak jak niżej na rysunku:


Metoda setContentType() ustawia nam typ MIME przesyłanego dokumentu. Możemy ją tak ustawić aby w odpowiedzi dostać np. plik graficzny - response.setContentType("image/jpg").

PrintWriter getWriter() - zwraca obiekt zapisujący dla danych tekstowych. Parametry metody HttpServletRequest i HttpServletResponse reprezentują obiekty żądania i odpowiedzi. Metoda Object getParameter(String name) pobiera parametr o danej nazwie w żądaniu. Nasz parametr nazywa się age, był podany w naszym formularzu:  <input type="text" name="age" /> . Nasuwa się też nam pytanie jak serwer skojarzył adres URL serwletu validationofage.do z klasą, któa go obsługuje - ValidationOfAge.class . Odpowiedź na nasze pytanie znajdziemy w pliku web.xml. Znajdziemy go w podanej ścieżce /WEB-INF/web.xml


Plik ten jest deskryptorem wdrożenia. Znajdują się w nim liczne ustawienia aplikacji webowych JEE. Dzięki takiemu podejściu czyli umieszczeniu konfiguracji w pliku XML, każda jego zmiana nie wymaga ponownej kompilacji kodów źródłowych. W pliki web.xml możemy zdefiniować parametry dla poszczególnych serwletów i naszej aplikacji. To na tyle w tej części. W następnej części będziemy rozwijać nasze poznane wiadomości dotyczące podstawowych elementów każdej aplikacji webowej - serwletów. Oczywiście nie myśl, że w ten sposób tworzy się obecnie aplikacje, było by to zbyt trudne. Czy wyobrażasz sobie cały kod html umieszczany w wywołaniu funkcji println() ? No ja na pewno nie.

JAVA EE6 Programowanie aplikacji WWW KURS cz.2 Model aplikacji.

Logika aplikacji podzielona jest na komponenty. Każdy komponent pełni inne funkcje. Wyróżniamy następujące warstwy aplikacji:

-kliencka Client Tier
-webowa Web Tier
-biznesowa Business Tier
-informacyjna Eis Tier



Klient web jest to przeglądarka WWW, która wyświetla strony otrzymane z serwera. Strony WWW są dynamicznie generowane w postaci dokumentów (HTML/XHTML,XML). Za generowanie odpowiadają komponenty webowe, które uruchamiane są w warstwie web.


Komponenty webowe są to:
-serwlety
-strony JSP i JSF 



Warstwa kliencka i webowa zazwyczaj traktowane są jako warstwa prezentacji.Podział taki pozwala skupić się na samym aspekcie wizualizacji bez wgłębiania się w szczegóły logiki biznesowej.

Warstwa biznesowa jej zadaniem są głównie np:obliczenia, operacje na danych,itp. Korzysta głównie z komponentów warstwy webowej i biznesowej (EJB - Enterprise JavaBeans).

Warstwa danych(informacyjna) inaczej warstwa EIS (Enterprise Information Systems) obejmuje wszelkie źródła danych dla warstwy logiki biznesowej. Takimi źródłami są między innymi: bazy danych, systemy informatyczne już istniejące w danym przedsiębiorstwie.

JAVA EE6 Programowanie aplikacji WWW KURS cz.1 Wprowadzenie

JEE - Java Enterprise Edition jest to standard tworzenia zorientowanych na usługi aplikacji biznesowych. Aplikacje te są budowane z wykorzystaniem języka Java i technologii J2SE (zakładam, że czytelnik zna tę technologię w stopniu minimum podstawowym).

    Wszystko wydawałoby się tak piękne i klarowne na początku jeśli nie to, że tak naprawdę jest to cała masa różnorodnych technologii, a także frameworków dzięki którym my programiści możemy tworzyć nasze aplikacje WWW.Musimy też sobie powiedzieć, że istnieją oczywiście  frameworki i biblioteki, udostępniane przez zewnętrzne firmy.Może na początku wydawać się to wszystko zagmatwane i przytłaczające, ale postaram się przedstawić podstawową, wprowadzającą wiedzę w świat tworzenia naszych przyszłych aplikacji WWW.Oczywiście potrzeba nam na początku przede wszystkim samozaparcia w naszej nauce.

Cechą szczególną  aplikacji JEE jest to, że do uruchomienia wymagają serwera aplikacji webowych.Najbardziej popularne to:GlassFish, Tomcat, IBM WebSphere Application Server.Na tej stronie:serwery możemy znaleźć certyfikowane serwery Java Enterprise.

Aplikacje webowe czyli strony internetowe wykorzystujące często bazy danych, posiadają dynamiczną funkcjonalność.Przykładem takich aplikacji są sklepy internetowe, systemy zarządzania treścią CMS.Jeśli spojrzymy na podstawowe technologie, z których korzystają są to:

-Java Servlet
-JavaServer Faces
-JavaServer Pages
-JavaServer Pages Standard Tag Library



Trzeba sobie powiedzieć, że podstawą wszystkich aplikacji webowych tworzonych za pomocą technologii JEE są serwlety.

Serwlety Java to programy umiejscowione po stronie serwera HTTP, służą do automatycznego generowania dokumentów stanowiących odpowiedź na żądania HTTP.

To na tyle jeśli chodzi o bardzo krótkie wprowadzenie.W następnych częściach przyjrzymy się dokładniej architekturze aplikacji WWW.Przypomnimy sobie podstawowe założenia protokołu HTTP, poznamy zasadę działania serwletów i napiszemy naszą pierwszą aplikacje WWW.

Labels