11 wzorce projektowe warstwy aplikacji - freeshell.demaciek/studia/7/par/wyklady/11...projektowanie...

31
1 [email protected] [email protected] Wzorce projektowe Wzorce projektowe warstwy aplikacji warstwy aplikacji Projektowanie Aplikacji Rozproszonych Projektowanie Aplikacji Rozproszonych

Upload: others

Post on 01-Jan-2021

7 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 11 Wzorce projektowe warstwy aplikacji - freeshell.demaciek/studia/7/par/wyklady/11...Projektowanie Aplikacji Rozproszonych Wzorce projektowe warstwyaplikacji 2/31 Wzorce projektowe

1

[email protected]

[email protected]

Wzorce projektowe Wzorce projektowe

warstwy aplikacjiwarstwy aplikacji

Projektowanie Aplikacji RozproszonychProjektowanie Aplikacji Rozproszonych

Page 2: 11 Wzorce projektowe warstwy aplikacji - freeshell.demaciek/studia/7/par/wyklady/11...Projektowanie Aplikacji Rozproszonych Wzorce projektowe warstwyaplikacji 2/31 Wzorce projektowe

2

Projektowanie Aplikacji

Rozproszonych 2/31Wzorce projektowe warstwy aplikacji

Wzorce projektowe warstwy Wzorce projektowe warstwy

aplikacjiaplikacji

�� Front Controller Front Controller

�� Zapewnia wspZapewnia wspóólny punkt obslny punkt obsłługi ugi ŜąŜądadańń dla komponentdla komponentóów w

warstwy prezentacjiwarstwy prezentacji

�� Dispatcher ViewDispatcher View

�� Zapewnia przekazywanie Zapewnia przekazywanie ŜąŜądadańń klienta do wybranych klienta do wybranych

komponentkomponentóów widoku (wybw widoku (wybóór widoku przez klienta)r widoku przez klienta)

�� Service To WorkerService To Worker

�� Zapewnia przekazywanie Zapewnia przekazywanie ŜąŜądadańń klienta do wybranych klienta do wybranych

komponentkomponentóów widoku (wybw widoku (wybóór widoku przez serwer)r widoku przez serwer)

Page 3: 11 Wzorce projektowe warstwy aplikacji - freeshell.demaciek/studia/7/par/wyklady/11...Projektowanie Aplikacji Rozproszonych Wzorce projektowe warstwyaplikacji 2/31 Wzorce projektowe

3

Projektowanie Aplikacji

Rozproszonych 3/31Wzorce projektowe warstwy aplikacji

Front ControllerFront Controller

Page 4: 11 Wzorce projektowe warstwy aplikacji - freeshell.demaciek/studia/7/par/wyklady/11...Projektowanie Aplikacji Rozproszonych Wzorce projektowe warstwyaplikacji 2/31 Wzorce projektowe

4

Projektowanie Aplikacji

Rozproszonych 4/31Wzorce projektowe warstwy aplikacji

Front ControllerFront Controller -- motywacjemotywacje

�� Mechanizm obsMechanizm obsłługi ugi ŜąŜądadańń warstwy prezentacji mowarstwy prezentacji moŜŜe e

bybyćć zdecentralizowany lub scentralizowany.zdecentralizowany lub scentralizowany.

�� Mechanizm zdecentralizowany powoduje problemy:Mechanizm zdecentralizowany powoduje problemy:

�� Redundancja kodu dostRedundancja kodu dostęępu do komponentpu do komponentóów usw usłługowychugowych

�� Brak spBrak spóójnojnośści w nawigacji mici w nawigacji mięędzy rdzy róóŜŜnymi widokaminymi widokami

�� Trudniejsza pielTrudniejsza pielęęgnacja (czgnacja (częęste zmiany w rste zmiany w róóŜŜnych miejscach)nych miejscach)

System rozproszony potrzebuje dla warstwy prezentacji centralnego punktu dostępowego, który będzie

integrował usługi, zarządzał odtwarzaniem zawartości, prezentacją treści i nawigacją. Jeśli takiego

centralnego punktu dostępowego brakuje, to pojawiają się następujące problemy:

•KaŜdy widok zapewnia sobie sam dostęp do komponentów usługowych, co powoduje redundancję kodu.

•KaŜdy widok sam organizuje nawigację, co moŜe powodować niespójność nawigacji między róŜnymi

widokami

•Sterowanie rozproszone jest trudniejsze w pielęgnacji i modyfikacji z powodu konieczności zmian w wielu

róŜnych miejscach

Page 5: 11 Wzorce projektowe warstwy aplikacji - freeshell.demaciek/studia/7/par/wyklady/11...Projektowanie Aplikacji Rozproszonych Wzorce projektowe warstwyaplikacji 2/31 Wzorce projektowe

5

Projektowanie Aplikacji

Rozproszonych 5/31Wzorce projektowe warstwy aplikacji

SpostrzeSpostrzeŜŜenia i wymaganiaenia i wymagania

�� WspWspóólne uslne usłługi systemowe rozpoczynajugi systemowe rozpoczynająą i i

kokońńczcząą przetwarzanie w tym samym przetwarzanie w tym samym ŜąŜądaniu.daniu.

�� Przy odtwarzaniu i manipulacji danymi Przy odtwarzaniu i manipulacji danymi

konieczne skonieczne sąą punkty decyzyjne.punkty decyzyjne.

�� Potrzebny jest centralny punkt monitorujPotrzebny jest centralny punkt monitorująący.cy.

�� Wiele rWiele róóŜŜnych widoknych widokóów odpowiada na podobne w odpowiada na podobne

ŜąŜądania biznesowe.dania biznesowe.

�� Logika zarzLogika zarząądzania widokami jest dodzania widokami jest dośćść zzłłooŜŜona.ona.

Ponadto zauwaŜono, Ŝe w systemach wykorzystujących wspólne komponenty usługowe:

•Komponenty usługowe często realizują operacje w pojedynczych Ŝądaniach. Dla przykładu usługi ochrony

potrzebują jednego Ŝądania dla uwierzytelnienia klienta.

•Potrzebne są punkty decyzyjne, w których klient będzie mógł podejmować decyzje co do odtwarzania

danych i ich zapisywania.

•Potrzebny jest centralny punkt monitorujący działania uŜytkownika i postęp przetwarzania w całej witrynie.

•Wiele róŜnych widoków odpowiada na podobne Ŝądania biznesowe.

•Logika zarządzania widokami jest często dość złoŜona.

Page 6: 11 Wzorce projektowe warstwy aplikacji - freeshell.demaciek/studia/7/par/wyklady/11...Projektowanie Aplikacji Rozproszonych Wzorce projektowe warstwyaplikacji 2/31 Wzorce projektowe

6

Projektowanie Aplikacji

Rozproszonych 6/31Wzorce projektowe warstwy aplikacji

RozwiRozwiąązaniezanie

�� Zastosowanie centralnego kontrolera frontowego Zastosowanie centralnego kontrolera frontowego ((Front ControllerFront Controller)) do obsdo obsłługi ugi ŜąŜądadańń..

�� Kontroler frontowy:Kontroler frontowy:�� zarzzarząądza obsdza obsłługugąą ŜąŜądadańń

�� wywowywołłuje usuje usłługi ochrony (ugi ochrony (npnp. uwierzytelnienia). uwierzytelnienia)

�� przekazuje przekazuje ŜąŜądania przetwarzania do komponentdania przetwarzania do komponentóów w ususłługowychugowych

�� zarzzarząądza wyborem odpowiedniego widoku w odpowiedzi na dza wyborem odpowiedniego widoku w odpowiedzi na ŜąŜądaniedanie

�� zarzzarząądza wyborem strategii tworzenia zawartodza wyborem strategii tworzenia zawartośścici

�� zarzzarząądza obsdza obsłługugąą bbłęłęddóóww

Przez zcentralizowanie sterowania Front Controller zmniejsza wielkość kodu Java w skrypletach zawartych

na stronach JSP wspierając wielokrotne wykorzystanie tego samego kodu.

Kontroler frontowy często współpracuje z komponentem przekaźnika (Dispatcher View), który jest

odpowiedzialny za zarządzanie widokami i nawigację. Przekaźnik wybiera widok i przekazuje sterowanie

do tego widoku. Przekaźnik moŜe być zawarty bezpośrednio w kontrolerze lub umieszczony w osobnym

komponencie.

ChociaŜ wzorzec Front Controller sugeruje centralne przetwarzanie Ŝądań, nie ogranicza on liczby

komponentów obsługujących Ŝądania. Aplikacja moŜe wykorzystywać wiele kontrolerów frontowych, po

jednym dla osobnego zbioru usług.

Page 7: 11 Wzorce projektowe warstwy aplikacji - freeshell.demaciek/studia/7/par/wyklady/11...Projektowanie Aplikacji Rozproszonych Wzorce projektowe warstwyaplikacji 2/31 Wzorce projektowe

7

Projektowanie Aplikacji

Rozproszonych 7/31Wzorce projektowe warstwy aplikacji

Struktura komponentStruktura komponentóóww

Clientrequests Front

Controller

«JSP»

JSP Front

«servlet»

Servlet

Front

Głównym komponentem wzorca jest Front Controller, który moŜe być zrealizowany w technologii serwletów

lub technologii JSP.

Page 8: 11 Wzorce projektowe warstwy aplikacji - freeshell.demaciek/studia/7/par/wyklady/11...Projektowanie Aplikacji Rozproszonych Wzorce projektowe warstwyaplikacji 2/31 Wzorce projektowe

8

Projektowanie Aplikacji

Rozproszonych 8/31Wzorce projektowe warstwy aplikacji

Przekazywanie Przekazywanie ŜąŜądadańń

ClientFront

ControllerDispatcher View Helper

1: Send (Request) 1.1: Delegate (Request) 1.1.1: Forward (Request)

2: Send (Request)2.1: Forward (Request)

3: Send (Request) 3.1: Forward (Request)

1. Klient wysyła Ŝądania do kontrolera frontowego.

1.1 Kontroler frontowy rozpoznaje Ŝądania i przekazuje je do przekaźnika

1.1.1 Przekaźnik wybiera określony widok i przekazuje do niego Ŝądanie klienta

2. W drugim przypadku klient wysyła Ŝądanie do kontrolera frontowego, a ten

2.1 bezpośrednio przekazuje Ŝądanie do wybranego przez siebie widoku

3. W trzecim przypadku klient wysyła do kontrolera frontowego Ŝądanie, które nie wymaga obsługi przez widok,

3.1 lecz przez obiekt pomocniczy

Page 9: 11 Wzorce projektowe warstwy aplikacji - freeshell.demaciek/studia/7/par/wyklady/11...Projektowanie Aplikacji Rozproszonych Wzorce projektowe warstwyaplikacji 2/31 Wzorce projektowe

9

Projektowanie Aplikacji

Rozproszonych 9/31Wzorce projektowe warstwy aplikacji

Strategie implementacyjneStrategie implementacyjne

�� Implementacja przez serwletImplementacja przez serwlet

�� momoŜŜliwoliwośćść wykorzystania interpretera komend wykorzystania interpretera komend

(wzorzec (wzorzec CommandCommand [[GoFGoF]]))

�� Implementacja przez stronImplementacja przez stronęę JSPJSP

Page 10: 11 Wzorce projektowe warstwy aplikacji - freeshell.demaciek/studia/7/par/wyklady/11...Projektowanie Aplikacji Rozproszonych Wzorce projektowe warstwyaplikacji 2/31 Wzorce projektowe

10

Projektowanie Aplikacji

Rozproszonych 10/31Wzorce projektowe warstwy aplikacji

PrzykPrzykłład ad –– implementacja implementacja

przez serwletprzez serwletpublic class EmployeeController extends HttpServlet { ... // Handles the HTTP GET method. protected void doGet(HttpServletRequest request, HttpServletResponse response) { processRequest(request, response); }

// Handles the HTTP POST method. protected void doPost(HttpServletRequest request, HttpServletResponse response) { processRequest(request, response); }

// Processes requests for both HTTP GET and POST methods protected void processRequest (HttpServletRequest equest, HttpServletResponse response) { String page;

// ApplicationResources provides a simple API for retrieving constants // and other preconfigured values ApplicationResources resource = ApplicationResources.getInstance(); // Use a helper object to gather parameter specific information. RequestHelper helper = new RequestHelper(request);

Command cmdHelper= helper.getCommand();

// Command helper perform custom operation

W implementacji przez serwlet:

•metoda doGet obsługuje Ŝądania przekazywane przez metodę HTTP GET

•metoda doPost obsługuje Ŝądanie przekazywane przez metodę HTTP POST

•obie te metody korzystają ze wspólnej procedury processRequest

•która wykorzystuje pomocniczy komponent interpretera komend (cmdHelper)

•i na podstawie odpowiedzi wybiera odpowiedni widok, do którego przekazuje Ŝądanie klienta (dispatch)

//-----------------------------------------------------------------------

public class Controller extends HttpServlet {

// Handles the HTTP GET method.

protected void doGet(HttpServletRequest request, HttpServletResponse response) {

processRequest(request, response);

}

// Handles the HTTP POST method.

protected void doPost(HttpServletRequest request,HttpServletResponse response) {

processRequest(request, response);

}

// Processes requests for both HTTP GET and POST methods.

protected void processRequest(HttpServletRequest request, HttpServletResponse response) {

String page;

// ApplicationResources provides a simple API for retrieving constants

// and other preconfigured values

ApplicationResources resource = ApplicationResources.getInstance();

// Use a helper object to gather parameter specific information.

RequestHelper helper = new RequestHelper(request);

Command cmdHelper= helper.getCommand();

// Command helper perform custom operation

page = cmdHelper.execute(request, response);

// dispatch control to view

Page 11: 11 Wzorce projektowe warstwy aplikacji - freeshell.demaciek/studia/7/par/wyklady/11...Projektowanie Aplikacji Rozproszonych Wzorce projektowe warstwyaplikacji 2/31 Wzorce projektowe

11

Projektowanie Aplikacji

Rozproszonych 11/31Wzorce projektowe warstwy aplikacji

PrzykPrzykłład ad –– implementacja implementacja

przez stronprzez stronęę JSPJSP<%@page contentType="text/html"%><%@ page import="corepatterns.util.*" %><html><head><title>JSP Front Controller</title></head><body>

<h3><center> Employee Profile </h3>

<% <jsp:useBean id="employee" scope="request" class="corepatterns.util.EmployeeTO"/> <FORM method=POST > <table width="60%"> <tr> <td> First Name : </td> <td> <input type="text" name="<%=Constants.FLD_FIRSTNAME%>" value="<jsp:getProperty name="employee" property="firstName"/>"> </td> </tr> <tr> <td> Last Name : </td> <td> <input type="text" name="<%=Constants.FLD_LASTNAME%>" value="<jsp:getProperty name="employee" property="lastName"/>"> </td> </tr> <tr>

Implementacja przez stronę JSP, chociaŜ semantycznie równowaŜna, jest mniej popularna od

implementacji przez serwlet z dwóch powodów:

•PoniewaŜ kontroler frontowy przetwarza Ŝądania niekoniecznie związane z formatowaniem widoku, więc

implementacja tego komponentu przez stronę JSP wydaje się być nieporozumieniem.

•PoniewaŜ technologia JSP bazuje na znacznikach JSP w kodzie HTML, więc śledzenie wykonywania

programu jest mocno utrudnione.

//-----------------------------------------------------------------------

<%@page contentType="text/html"%>

<%@ page import="corepatterns.util.*" %>

<html>

<head><title>JSP Front Controller</title></head>

<body>

<h3><center> Employee Profile </h3>

<%

<jsp:useBean id="employee" scope="request" class="corepatterns.util.EmployeeTO"/>

<FORM method=POST >

<table width="60%">

<tr>

<td> First Name : </td>

<td>

<input type="text" name="<%=Constants.FLD_FIRSTNAME%>"

value="<jsp:getProperty name="employee" property="firstName"/>">

</td>

</tr>

<tr>

<td> Last Name : </td>

<td>

<input type="text" name="<%=Constants.FLD_LASTNAME%>"

value="<jsp:getProperty name="employee" property="lastName"/>">

</td>

</tr>

<tr>

<td> Employee ID : </td>

<td>

<input type="text"

Page 12: 11 Wzorce projektowe warstwy aplikacji - freeshell.demaciek/studia/7/par/wyklady/11...Projektowanie Aplikacji Rozproszonych Wzorce projektowe warstwyaplikacji 2/31 Wzorce projektowe

12

Projektowanie Aplikacji

Rozproszonych 12/31Wzorce projektowe warstwy aplikacji

Strategie adresowania kontroleraStrategie adresowania kontrolera

�� Adresowanie fizyczneAdresowanie fizyczne

�� http://some.server.com/resource1.jsphttp://some.server.com/resource1.jsp

�� http://some.server.com/servlet/Controllerhttp://some.server.com/servlet/Controller

�� Adresowanie logiczneAdresowanie logiczne

�� http://some.server.com/processhttp://some.server.com/process

�� process=resource1.jspprocess=resource1.jsp

�� process=servletControllerprocess=servletController

Przy przekazywaniu Ŝądań do kontrolera frontowego pojawia się problem adresowania tego kontrolera. Najprostszym rozwiązaniem jest jawne wpisanie nazwy fizycznego komponentu implementującego kontroler do URL, jak np.:

•http://some.server.com/resource1.jsp

•http://some.server.com/servlet/Controller

Oczywiście przy zmianie sposobu implementacji adresy URL będą musiały ulec zmianie. Dlatego wskazane jest uŜycie nazwy logicznej zasobu, np.:

•http://some.server.com/process

a następnie w konfiguracji witryny przypisanie nazwy logicznej do zasobu fizycznego:

•process=resource1.jsp

•process=servletController

Page 13: 11 Wzorce projektowe warstwy aplikacji - freeshell.demaciek/studia/7/par/wyklady/11...Projektowanie Aplikacji Rozproszonych Wzorce projektowe warstwyaplikacji 2/31 Wzorce projektowe

13

Projektowanie Aplikacji

Rozproszonych 13/31Wzorce projektowe warstwy aplikacji

Zalety i wady stosowania wzorcaZalety i wady stosowania wzorca

�� Centralizacja sterowaniaCentralizacja sterowania

�� wiwięększa ksza łłatwoatwośćść śśledzenia ledzenia ŜąŜądadańń

�� Uwaga: pojedynczy, wraUwaga: pojedynczy, wraŜŜliwy punkt systemuliwy punkt systemu

�� Wspomaganie zarzWspomaganie zarząądzania bezpieczedzania bezpieczeńństwemstwem

�� Pojedynczy punkt kontroli (mniej zasobPojedynczy punkt kontroli (mniej zasobóów)w)

�� Wspomaganie powtWspomaganie powtóórnego wykorzystania kodurnego wykorzystania kodu

�� WspWspóólny kod komponentlny kod komponentóów przeniesiony do w przeniesiony do

sterownikasterownika

Centralizacja sterowania

Kontroler frontowy stanowi centralny punkt obsługi Ŝądań. Ułatwia to śledzenie Ŝądań i ich obsługi. Z

drugiej jednak strony stanowi punkt wraŜliwy, potencjalnie naraŜony na błędy implementacji.

Wspomaganie zarządzania bezpieczeństwem

Kontroler frontowy moŜe realizować funkcje ochronne (np. uwierzytelnienia). PoniewaŜ taki punkt kontrolny

jest pojedynczy, to kontrola uwierzytelnienia jest łatwiejsza, a ponadto zuŜywa się na to mniej zasobów.

Wspomaganie powtórnego wykorzystania kodu

Kontroler frontowy powoduje, Ŝe często wykorzystywany kod komponentów warstwy prezentacji zostaje

przeniesiony do wspólnego sterownika.

Page 14: 11 Wzorce projektowe warstwy aplikacji - freeshell.demaciek/studia/7/par/wyklady/11...Projektowanie Aplikacji Rozproszonych Wzorce projektowe warstwyaplikacji 2/31 Wzorce projektowe

14

Projektowanie Aplikacji

Rozproszonych 14/31Wzorce projektowe warstwy aplikacji

Dispatcher ViewDispatcher View

Page 15: 11 Wzorce projektowe warstwy aplikacji - freeshell.demaciek/studia/7/par/wyklady/11...Projektowanie Aplikacji Rozproszonych Wzorce projektowe warstwyaplikacji 2/31 Wzorce projektowe

15

Projektowanie Aplikacji

Rozproszonych 15/31Wzorce projektowe warstwy aplikacji

Dispatcher ViewDispatcher View

�� Zapewnia przekazywanie Zapewnia przekazywanie ŜąŜądadańń klienta do klienta do

okreokreśślonego widokulonego widoku

�� ŁąŁączy wzorce czy wzorce Front ControllerFront Controller i i View View

HelperHelper

�� W odrW odróóŜŜnieniu od wzorca nieniu od wzorca Service Service TTo o

WorkerWorker rola przekarola przekaźźnikanika ograniczona lub ograniczona lub

umiarkowanaumiarkowana

Wzorzec Dispatcher View jest stosowany w aplikacji złoŜonej z wielu widoków. Zapewnia

przekazywanie Ŝądań klienta do odpowiedniego widoku wówczas, gdy to serwer

decyduje, do którego widoku musi trafić Ŝądanie.

Wzorzec łączy w sobie rozwiązania wzorców Front Controller i View Helper (ten drugi wzorzec

zdefiniowany jest w warstwie prezentacji).

Wzorzec Dispatcher View jest podobny do wzorca Service To Worker, ale w odróŜnieniu od niego rola

komponentu przekazującego Ŝądania jest ograniczona lub umiarkowana.

Page 16: 11 Wzorce projektowe warstwy aplikacji - freeshell.demaciek/studia/7/par/wyklady/11...Projektowanie Aplikacji Rozproszonych Wzorce projektowe warstwyaplikacji 2/31 Wzorce projektowe

16

Projektowanie Aplikacji

Rozproszonych 16/31Wzorce projektowe warstwy aplikacji

Ograniczona rola przekaOgraniczona rola przekaźźnikanika

�� Do wyboru widoku nie wykorzystuje siDo wyboru widoku nie wykorzystuje sięę

zewnzewnęętrznych zasobtrznych zasobóów. w.

�� Informacje zawarte w Informacje zawarte w ŜąŜądaniu sdaniu sąą wystarczajwystarczająące ce

do okredo okreśślenia widoku, do ktlenia widoku, do któórego trzeba rego trzeba

przekazaprzekazaćć ŜąŜądanie.danie.PrzykPrzykłład:ad:

http://some.server.com/servlet/Controller?next=login.jsphttp://some.server.com/servlet/Controller?next=login.jsp

Ograniczona rola przekaźnika polega na tym, Ŝe do wyboru widoku aplikacja nie potrzebuje dostępu do

Ŝadnych dodatkowych zasobów. Oznacza to, Ŝe dane przekazywane przez klienta w Ŝądaniu są

wystarczające do określenia widoku, do którego trzeba przekazać Ŝądanie. Dane są zakodowane w URL

poprzez parametry Ŝądania, np.:

http://some.server.com/servlet/Controller?next=login.jsp

Page 17: 11 Wzorce projektowe warstwy aplikacji - freeshell.demaciek/studia/7/par/wyklady/11...Projektowanie Aplikacji Rozproszonych Wzorce projektowe warstwyaplikacji 2/31 Wzorce projektowe

17

Projektowanie Aplikacji

Rozproszonych 17/31Wzorce projektowe warstwy aplikacji

Umiarkowana rola przekaUmiarkowana rola przekaźźnikanika

�� Klient przekazuje Klient przekazuje ŜąŜądanie bezpodanie bezpośśrednio do rednio do

sterownika, z parametrem kwerendy opisujsterownika, z parametrem kwerendy opisująącym cym

akcjakcjęę do podjdo podjęęcia:cia:

PrzykPrzykłładad

http://some.server.com/servlet/Controller?action=loginhttp://some.server.com/servlet/Controller?action=login

Umiarkowana rola przekaźnika polega na tym, Ŝe wybór widoku następuje na podstawie parametrów

przekazywane przez klienta, np.:

http://some.server.com/servlet/Controller?action=login

Page 18: 11 Wzorce projektowe warstwy aplikacji - freeshell.demaciek/studia/7/par/wyklady/11...Projektowanie Aplikacji Rozproszonych Wzorce projektowe warstwyaplikacji 2/31 Wzorce projektowe

18

Projektowanie Aplikacji

Rozproszonych 18/31Wzorce projektowe warstwy aplikacji

Struktura komponentStruktura komponentóóww

Clientrequests

«servlet»

Front

Controller

«JSP»

ViewDispatcher

delegates dispatches

1 1..*

Helper

uses

1

*

Głównym komponentem wzorca jest przekaźnik (Dispatcher). Komponent ten często współdziała z

kontrolerem frontowym (Front Controller) implementowanym w formie serwletu. Przekazuje Ŝądania z

kontrolera do wybranego widoku (np. strony JSP). Widok moŜe wykorzystywać dodatkowe obiekty

pomocnicze.

Page 19: 11 Wzorce projektowe warstwy aplikacji - freeshell.demaciek/studia/7/par/wyklady/11...Projektowanie Aplikacji Rozproszonych Wzorce projektowe warstwyaplikacji 2/31 Wzorce projektowe

19

Projektowanie Aplikacji

Rozproszonych 19/31Wzorce projektowe warstwy aplikacji

WspWspóółłdziadziałłanie komponentanie komponentóóww

Client

«servlet»

Front

Controller

«JSP»

ViewDispatcher Helper

1: Request1.1: Delegate

1.1.1: Dispatch

1.1.1.1: Retrieve

1.1.1.1.1: Get Data

1.1.1.2: Get Property

Value

Object

Business

Service

Przy współdziałaniu komponentów we wzorcu Dispatcher View:

1. Klient przesyła Ŝądanie do kontrolera frontowego

1.1 Kontroler rozpoznaje Ŝądanie i przesyła je do przekaźnika

1.1.1 Przekaźnik wybiera widok (stronę JSP) na podstawie danych zawartych w Ŝądaniu

1.1.1.1 Widok korzysta z obiektu pomocniczego, który

1.1.1.1.1 pobiera dane z komponentu usługowego zwracającego obiekt transferowy

1.1.1.2 który przenosi dane dla widoku

Page 20: 11 Wzorce projektowe warstwy aplikacji - freeshell.demaciek/studia/7/par/wyklady/11...Projektowanie Aplikacji Rozproszonych Wzorce projektowe warstwyaplikacji 2/31 Wzorce projektowe

20

Projektowanie Aplikacji

Rozproszonych 20/31Wzorce projektowe warstwy aplikacji

Strategie implementacyjneStrategie implementacyjne

�� Dla widokDla widokóóww

�� przez serwletprzez serwlet

�� przez JSPprzez JSP

�� Dla obiektu pomocniczegoDla obiektu pomocniczego

�� przez komponenty EJBprzez komponenty EJB

�� przez przez custom tagscustom tags

Komponenty widoku mogą być implementowane w technologii serwletów albo jako strony JSP.

W pierwszym przypadku obiekty pomocnicze są implementowane jako komponenty EJB, a w drugim przez

znaczniki uŜytkownika (custom tags).

Page 21: 11 Wzorce projektowe warstwy aplikacji - freeshell.demaciek/studia/7/par/wyklady/11...Projektowanie Aplikacji Rozproszonych Wzorce projektowe warstwyaplikacji 2/31 Wzorce projektowe

21

Projektowanie Aplikacji

Rozproszonych 21/31Wzorce projektowe warstwy aplikacji

Strategia "przekaStrategia "przekaźźnik w nik w

sterowniku"sterowniku"Client

«JSP»

ViewDispatcher Helper

1: Request

1.1: Dispatch

1.1.1: Retrieve

1.1.1.1: Get Data

1.1.2: Get Property

Value

Object

Business

Service

Wzorzec Dispatcher View i Front Controller mogą być zaimplementowane w jednym komponencie.

Page 22: 11 Wzorce projektowe warstwy aplikacji - freeshell.demaciek/studia/7/par/wyklady/11...Projektowanie Aplikacji Rozproszonych Wzorce projektowe warstwyaplikacji 2/31 Wzorce projektowe

22

Projektowanie Aplikacji

Rozproszonych 22/31Wzorce projektowe warstwy aplikacji

Strategia "przekaStrategia "przekaźźnik w nik w

widoku"widoku"Client

«JSP»

View

«JSP»

ViewDispatcher Helper

1: Request1.1: Delegate

1.1.1: Dispatch

1.1.1.1: Retrieve

1.1.1.1.1: Get Data

1.1.1.2: Get Property

Value

Object

Business

Service

Wzorzec Dispatcher View moŜe być teŜ zaimplementowany w komponencie widoku w technologii JSP.

Page 23: 11 Wzorce projektowe warstwy aplikacji - freeshell.demaciek/studia/7/par/wyklady/11...Projektowanie Aplikacji Rozproszonych Wzorce projektowe warstwyaplikacji 2/31 Wzorce projektowe

23

Projektowanie Aplikacji

Rozproszonych 23/31Wzorce projektowe warstwy aplikacji

PrzykPrzykłład ad –– implementacja z implementacja z

kontrolerem w serwleciekontrolerem w serwleciepublic class Controller extends HttpServlet {

// Handles the HTTP GET method. protected void doGet(HttpServletRequest request, HttpServletResponse response) { processRequest(request, response); }

// Handles the HTTP POST method. protected void doPost(HttpServletRequest request,HttpServletResponse response) { processRequest(request, response); }

// Processes requests for both HTTP GET and POST methods. protected void processRequest(HttpServletRequest request, HttpServletResponse response) { String nextview; ... nextview = request.getParameter("nextview"); ... dispatch(request, response, nextview); }

// Dispatcher method protected void dispatch(HttpServletRequest request, HttpServletResponse response, String page) { RequestDispatcher dispatcher = getServletContext().getRequestDispatcher(page); dispatcher.forward(request, response);

W poniŜszym przykładzie wzorzec Dispatch View jest implementowany wraz ze wzorcem Front Controller

przez serwlet. Od poprzedniego przykładu implementację odróŜnia metoda processRequest, w której

nazwę następnego widoku (nextview) pobiera się z parametru Ŝądania.

//-----------------------------------------------------------------------

public class Controller extends HttpServlet {

// Handles the HTTP GET method.

protected void doGet(HttpServletRequest request, HttpServletResponse response) {

processRequest(request, response);

}

// Handles the HTTP POST method.

protected void doPost(HttpServletRequest request,HttpServletResponse response) {

processRequest(request, response);

}

// Processes requests for both HTTP GET and POST methods.

protected void processRequest(HttpServletRequest request, HttpServletResponse response) {

String nextview;

...

nextview = request.getParameter("nextview");

...

dispatch(request, response, nextview);

}

// Dispatcher method

protected void dispatch(HttpServletRequest request, HttpServletResponse response, String page) {

RequestDispatcher dispatcher = getServletContext().getRequestDispatcher(page);

dispatcher.forward(request, response);

}

}

Page 24: 11 Wzorce projektowe warstwy aplikacji - freeshell.demaciek/studia/7/par/wyklady/11...Projektowanie Aplikacji Rozproszonych Wzorce projektowe warstwyaplikacji 2/31 Wzorce projektowe

24

Projektowanie Aplikacji

Rozproszonych 24/31Wzorce projektowe warstwy aplikacji

PrzykPrzykłład ad –– implementacja implementacja

przez stronprzez stronęę JSPJSP<%@ taglib uri="/web-INF/corepatternstaglibrary.tld" prefix="corepatterns" %>

<html><head><title>AccountDetails</title></head><body>

<corepatterns:AccountQuery queryParams="custid,acctkey" scope="request" />

<h2><center> Account Detail for <corepatterns:Account attribute="owner" /></h2> <br><br>

<tr> <td>Account Number :</td> <td><corepatterns:Account attribute="number" /></td></tr>

<tr> <td>Account Type:</td> <td><corepatterns:Account attribute="type" /></td></tr>

<tr> <td>Account Balance:</td> <td><corepatterns:Account attribute="balance" /></td></tr>

<tr>

Implementacja przez stronę JSP, chociaŜ semantycznie równowaŜna, jest mniej popularna od

implementacji przez serwlet z dwóch powodów:

•PoniewaŜ kontroler frontowy przetwarza Ŝądania niekoniecznie związane z formatowaniem widoku, więc

implementacja tego komponentu przez stronę JSP wydaje się być nieporozumieniem.

•PoniewaŜ technologia JSP bazuje na znacznikach JSP w kodzie HTML, więc śledzenie wykonywania

programu jest mocno utrudnione.

//-----------------------------------------------------------------------

<%@ taglib uri="/web-INF/corepatternstaglibrary.tld" prefix="corepatterns" %>

<html>

<head><title>AccountDetails</title></head>

<body>

<corepatterns:AccountQuery queryParams="custid,acctkey" scope="request" />

<h2><center> Account Detail for <corepatterns:Account attribute="owner" /></h2> <br><br>

<tr>

<td>Account Number :</td>

<td><corepatterns:Account attribute="number" /></td>

</tr>

<tr>

<td>Account Type:</td>

<td><corepatterns:Account attribute="type" /></td>

</tr>

<tr>

<td>Account Balance:</td>

<td><corepatterns:Account attribute="balance" /></td>

</tr>

<tr>

<td>OverDraft Limit:</td>

<td><corepatterns:Account attribute="overdraftLimit" /></td>

</tr>

<table border=3>

Page 25: 11 Wzorce projektowe warstwy aplikacji - freeshell.demaciek/studia/7/par/wyklady/11...Projektowanie Aplikacji Rozproszonych Wzorce projektowe warstwyaplikacji 2/31 Wzorce projektowe

25

Projektowanie Aplikacji

Rozproszonych 25/31Wzorce projektowe warstwy aplikacji

Zalety wzorcaZalety wzorca

�� Centralizuje sterowanie i uCentralizuje sterowanie i ułłatwia powtatwia powtóórne rne

uuŜŜycie kodu i utrzymanie koduycie kodu i utrzymanie kodu

�� UUłłatwia podziaatwia podziałł aplikacji na warstwyaplikacji na warstwy

�� UUłłatwia podziaatwia podziałł rróól mil mięędzy projektantdzy projektantóóww

Centralizuje sterowanie i ułatwia powtórne uŜycie kodu i utrzymanie kodu

Centralizacja sterowania, wykorzystanie wspólnego kodu w wydzielonym komponencie oraz ułatwienie

pielęgnacji kodu to te same zalety, co w przypadku wzorca Front Controller.

Ułatwia podział aplikacji na warstwy

Wykorzystanie obiektów pomocniczych jasno oddziela warstwę prezentacji od przetwarzania w warstwie

aplikacji. Stanowi lepsze rozwiązanie od skrypletów, które w większych projektach przestają być

wystarczające.

Ułatwia podział ról między projektantów

Wydzielenie logiki aplikacji z warstwy prezentacji ułatwia podział ról między projektantów na tych, którzy

zajmują się wizualną stroną projektu i tych, którzy zarządzają logiką aplikacji.

Page 26: 11 Wzorce projektowe warstwy aplikacji - freeshell.demaciek/studia/7/par/wyklady/11...Projektowanie Aplikacji Rozproszonych Wzorce projektowe warstwyaplikacji 2/31 Wzorce projektowe

26

Projektowanie Aplikacji

Rozproszonych 26/31Wzorce projektowe warstwy aplikacji

Service To WorkerService To Worker

Page 27: 11 Wzorce projektowe warstwy aplikacji - freeshell.demaciek/studia/7/par/wyklady/11...Projektowanie Aplikacji Rozproszonych Wzorce projektowe warstwyaplikacji 2/31 Wzorce projektowe

27

Projektowanie Aplikacji

Rozproszonych 27/31Wzorce projektowe warstwy aplikacji

Service To WorkerService To Worker

�� Podobnie jak wzorzec Podobnie jak wzorzec Dispatcher ViewDispatcher View łąłączy czy

wzorce wzorce Front ControllerFront Controller i i View HelperView Helper w w

komponencie przekakomponencie przekaźźnika.nika.

�� PrzekaPrzekaźźnik monik moŜŜe bye byćć bardziej zaawansowany.bardziej zaawansowany.

�� MoMoŜŜe wywoe wywołływaywaćć ususłługi biznesowe dla ugi biznesowe dla

okreokreśślenia, ktlenia, któóry widok jest najbardziej ry widok jest najbardziej

odpowiedni.odpowiedni.

Wzorzec Service To Worker spełnia tę samą rolę co Dispatcher View. RóŜnica polega na tym, Ŝe rola

przekaźnika moŜe być duŜo większa niŜ we wzorcu Dispatcher View. Przekaźnik sam określa, do którego

widoku wysłać Ŝądanie klienta. W tym celu moŜe wykorzystywać usługi biznesowe.

Page 28: 11 Wzorce projektowe warstwy aplikacji - freeshell.demaciek/studia/7/par/wyklady/11...Projektowanie Aplikacji Rozproszonych Wzorce projektowe warstwyaplikacji 2/31 Wzorce projektowe

28

Projektowanie Aplikacji

Rozproszonych 28/31Wzorce projektowe warstwy aplikacji

Struktura wzorcaStruktura wzorca

Clientrequests

«servlet»

Front

Controller

«JSP»

ViewDispatcher

delegates dispatches

1 1..*

Helper

uses

1

*

1

1

**

usesuses

RóŜnica w strukturze wzorca Service To Worker w stosunku do Dispatcher View polega na tym, Ŝe nie

tylko komponent widoku korzysta z obiektów pomocniczych, ale równieŜ przekaźnik i kontroler frontowy.

Page 29: 11 Wzorce projektowe warstwy aplikacji - freeshell.demaciek/studia/7/par/wyklady/11...Projektowanie Aplikacji Rozproszonych Wzorce projektowe warstwyaplikacji 2/31 Wzorce projektowe

29

Projektowanie Aplikacji

Rozproszonych 29/31Wzorce projektowe warstwy aplikacji

WspWspóółłdziadziałłanie komponentanie komponentóóww

Client

«servlet»

Front

Controller

«JSP»

ViewDispatcher Helper

1: Request

1.2: Delegate

1.1: Retrieve

1.2.1.1: Get Data

1.2.2.1: Get Property

Value

Object

Business

Service

1.1.1: Get Data

1.2.2: Dispatch

1.2.1: Choose View

Przy współdziałaniu komponentów we wzorcu Service To Worker:

1. Klient przesyła Ŝądanie do kontrolera frontowego

1.1 Kontroler odtwarza obiekt pomocniczy (np. poprzez zapamiętany identyfikator)

1.1.1 Obiekt pomocniczy pobiera dane z komponentu usługowego

1.2 Kontroler przekazuje Ŝądanie klienta wraz z danymi z komponentu usługowego do przekaźnika

1.2.1 Ten wykorzystuje obiekt pomocniczy do ustalenia, który widok będzie najbardziej odpowiedni

1.2.1.1 Obiekt pomocniczy moŜe potrzebować więcej danych z komponentu usługowego

1.2.2 Przekaźnik przekazuje Ŝądanie do wybranego widoku, który

1.2.2.1 pobiera dane z obiektu transferowego zwróconego przez komponent usługowy

Page 30: 11 Wzorce projektowe warstwy aplikacji - freeshell.demaciek/studia/7/par/wyklady/11...Projektowanie Aplikacji Rozproszonych Wzorce projektowe warstwyaplikacji 2/31 Wzorce projektowe

30

Projektowanie Aplikacji

Rozproszonych 30/31Wzorce projektowe warstwy aplikacji

Strategie i zaletyStrategie i zalety

�� jak dla wzorca jak dla wzorca Dispatcher ViewDispatcher View

Strategie implementacyjne wzorca oraz zalety jego stosowania są takie same jak dla wzorca Dispatcher

View.

Page 31: 11 Wzorce projektowe warstwy aplikacji - freeshell.demaciek/studia/7/par/wyklady/11...Projektowanie Aplikacji Rozproszonych Wzorce projektowe warstwyaplikacji 2/31 Wzorce projektowe

31

Projektowanie Aplikacji

Rozproszonych 31/31Wzorce projektowe warstwy aplikacji

LiteraturaLiteratura

PrzykPrzykłłady i rysunki pochodzady i rysunki pochodząą z nastz nastęępujpująących cych źźrróódedełł::

�� http://java.sun.com/blueprints/corej2eepatterns/Patterns/FrontCohttp://java.sun.com/blueprints/corej2eepatterns/Patterns/FrontController.htmlntroller.html

�� http://java.sun.com/blueprints/corej2eepatterns/Patterns/Dispatchttp://java.sun.com/blueprints/corej2eepatterns/Patterns/DispatcherView.htmlherView.html

�� http://java.sun.com/blueprints/corej2eepatterns/Patterns/Servicehttp://java.sun.com/blueprints/corej2eepatterns/Patterns/ServiceToWorker.htmlToWorker.html