Spring MVC – 01 – Hello MVC World & Application Layering

Hamd alemlerin Rabbi olan, insana bilmedigini ogreten Allah’a mahsustur.

“Ve ma tevfîkî illa billah aleyhi tevekkeltü ve ileyhi ünîb”
Hûd suresi /88

Bilmediklerimi ayağımın altına koysam başım arşa değerdi.
İmamÂzam Ebû Hanîfe (radıyallahu anh)

Spring MVC egitim yazi dizisinden herkese merhaba. Bu yazilar boyunca Spring MVC konusunu inceleyecegiz. Spring MVC yi daha rahat ogrenebilmek icin oncelikle su bilgiler gereklidir;

  • Java SE
  • Servlet&JSP
  • Spring Framework Core bolumu

Tum bu konulari diger yazilarimda bulabilirsiniz. Burada Spring MVC konusuna odaklanacagiz.
Bu bolum giris niteliginde olacak , su konulari anlamaya calisacagiz ;

  • MVC Pattern
  • Application Layering
  • Spring MVC Application Layers

MVC Pattern

MVC , Model View Controller anlamina gelen bir Architectural_pattern dir.

Trygve Reenskaug tarafindan 1970’li yillarda gelistirilmistir. Yani MVC design pattern’i Java’dan cok daha once var olan bir kavramdir! Tabi 1970 li yillarda  MVC , masaustu uygulamalari hedefliyordu.

MVC design pattern’in yaklasimini “separation of concerns” , bunu iliskilerin/etkilerin/ilgilerin ayrilmasi her component’in kendine ozgu gorevi olmasi olarak anlayabiliriz.
“Separation of concern” , temiz bir mimari ( clean architecture ) ve surdurulebilir(maintainable) kod icin katki saglayacaktir.

Simdi de Model View Controller kavramlarini inceleyelim;

Model
Business logic ve state’i tutar. Model gorevini reusable/tekrar kullanilabilir Plain Old Java Object dedigimiz POJO siniflarimiz ustlenecektir.

Ornegin bir alisveris sitesi dusunelim burada Shopping Cart kavrami bizim POJO sinifimiz olabilir. ShoppingCart sinifinin sahip olacagi instance variable’lar state’i tutacaktir.
Boylelikle state’i kolayca guncelleme sansina sahip olabiliriz.

Ya da bir kutuphane uygulamasi yaptigimizi dusunelim Book , Author , Publisher gibi kavramlar Model kavramina uygun dusecektir.

View
View , presentation/sunumdan sorumludur. Controller’dan Model’in state/instance variable alir ve bunu render ederek gosterir. View JSP , Facelets (xhtml ) , XML , JSON , PDF , Velocity , FreeMarker gibi..
Onemli olan sunum isini yapmasidir!

Controller
Controller , form submit ya da link click sonucu ortaya cikan action/request i karsilama isini yapar. Controller , model’i gunceller ve servis metotlarini cagirir.

MVC design pattern’in arti/eksilerini ozetleyecek olursak

  • separation of concerns
  • loose coupling
  • Her bir component icin + Cohesion saglar
  • Degisiklik sonrasi etkiyi minimize eder. Katmanlar birbirinden minimum olarak etkilenir.
  • Uygulamanin complexity degerini arttirir. Her bir component kendi icerisinde daha fazla cohesion ozelligine sahip olsa da uygulamanin complexity’si artar.

MVC pattern’inin 2 tane versiyonu bulunmaktadir.

MVC model1

MVC model1

  • Bir user action sonrasi (submit form , click link) Controller tetiklenir.
  • Controller model’i gunceller.
  • View, guncellenen model’i kullanarak kendini gunceller.

MVC pattern’in bu modeli desktop uygulamalari icin uygundur. Web uygulamalari icin ise uygun degildir.

MVC Model2
Web uygulamalari icin uygun olani MVC Model2 patterni olacaktir. Bu modelde “front controller” componenti yer almaktadir. Front Controller gelen istegi karsilar. (handle request)

MVC model2 frontcontroller

Front Controller, istegi karsilayacak uygun Controller’a yonlendirme/devretme/delegate islemini gerceklestirir. Controller isini tamamlayip model’i guncelledikten sonra , Front Controller hangi View’in bu Modeli render edecegine karar verir.

FrontController gorevini farkli frameworklerde gormekteyiz. Ornegin JSF te FrontController olarak javax.faces.webapp.FacesServlet gorev yapar.

public final class FacesServlet implements Servlet {
..
}

Spring MVC icin FrontController org.springframework.web.servlet.DispatcherServlet gorev yapar.

public class DispatcherServlet extends FrameworkServlet {
...
}

Hiyerarsilerine baktigimizda FrontController nihayetinde Servlet arabirimini implements eder.
Dolayisiyla FrontController isin IS-A Servlet onermesi dogru olacaktir.

Application Layering

Bir uygulama birden fazla layer/tier/katmandan olusabilir. Layer’lari uygulama icerisindeki bolunmus/ayrilmis etki alani olarak dusunebiliriz. Bunedenle Layer’lar “Separation of concern” yaklasimini saglamak icin kullanilir.

Ornegin View’de, business ya da data access logic yer almamalidir. Buna basit bir ornek olarak JSP icerisinden veritabanina baglanti acilmamalidir.

Tipik bir Application layer yapisi ;

application layering typical

Layer’lar konsept olarak sinirli olmalidir, fiziksel makine olarak birbirinden ayrilmis/isole edilmis olmak zorunda degildir.

Presentation
Presentation katmani mumkun oldugunce thin/hafif olmalidir. Presentation Layer’inda kullanici arayuzune ait dosyalar bulunur.

Service
Business logic’in yer aldigi/ulasildigi katmandir. Uygulamizin asil is yaptigi kisimdir. Projemize ozgudur.

Data Access
Bu katmanda veritabanina dair isler yapilir. Bu katman asil isi yapan framework’un bir soyutlamasidir. Asagida asil calisan JDBC , Hibernate, EclipseLink gibi frameworkler olacaktir.
Bu katmanda business logic yer almamalidir.

Bu katmanlar arasinda iletisim yukaridan asagiya dogru olmalidir. Service layer , data access layer’a ulasabilmelidir fakat data access layer service layer’a ulasmamalidir.
Eger uygulamimizda asagidan yukariya dogru bir ulasim soz konusuysa bir yerlerde dizayni yanlis yapmis olabiliriz.

Cogu zaman layer ve tier kavrami birbirinin yerine kullanilmaktadir. Layer kavrami uygulama mimarisini konsept olarak ayirmak icin kullanilan bir kavramdir.

Tier kavrami ise layerlarin fiziksel olarak farkli makinelerde ayrilmasidir.

Software developer gozunden layer kavrami , System Administrator gozunden ise Tier kavrami kullanilmasi daha dogru bir yaklasim olacaktir.

Presentation Layer icerisinden User Interface Layer ayrilabilir. Bununla birlikte Domain Layer da tum layer’larda kullanildigi icin cross cutting yapisinda olacaktir.

application layering detailed

Spring MVC Application Layers

Spring MVC icin Application Layer’lar su isimler ve gorevlerle gruplanmistir.

  • Domain Layer
  • User Interface Layer
  • Web Layer
  • Service Layer
  • Data Access Layer

Domain Layer
Domain Layer’da Domain Model objelerimiz yer alacaktir. Domain Model objelerimiz state(instance variable) ve behavior (instance methods)lara sahip olacaktir.

Domain Modellerimiz bir isme/noun’a karsilik gelir. Ornegin Account, Transaction , Customer ..

User Interface Layer
User Interface Layer uygulamayi son kullaniciya sunar. Bu Layer , client’in istegine gore response’u gosterir. Istek HTML dokumani , XML , PDF , JSF ya da baska bir dosya formati da olabilir.

  • JSP
  • PDF
  • Excel
  • Freemarker
  • Velocity
  • JasperReports
  • Tiles 2
  • XML
  • JSON

Web Layer
Web Layer ‘in 2 tane sorumlulugu vardir.

Kullanicinin sayfalar arasinda gecisini URL mapping ile saglamak. Navigation sadece web layer’a baglidir. Bir baska layerda navigation logic yer almamalidir.

Web Layer’in bir diger gorevi Service Layer ile HTTP arasinda entegrasyonu saglamaktir.
Gelen HTTP request’ini almali (handle request) ve asil isin Service Layer tarafindan yapilmasini saglayacak sekilde Service Layer’a yonlendirmelidir.
Web Layer mumkun oldugunca thin/hafif olmalidir. Web Layer’da business logic yer almamalidir.
Bunun icin Service Layer kullanilmalidir.

Web Layer’da cookie , HTTP headers, HTTP session a dair yonetimler yapilabilir.

2 tip Web Layer implementation vardir ;

  • Component Based ( JSF , Tapestry)
  • Request/Response Based (Spring MVC)

Component Based modeli Swing’in web uygulamasi gibidir. Bunun icin JSF yazilarina bakabilirsiniz.

Spring MVC de , Web layer org.springframework.web.servlet.mvc.Controller arabirimi ve org.springframework.stereotype.Controller annotation’ini kullanarak tanimladigimiz Controller siniflarimiz olacaktir.

Uyari : @Controller annotation’ini , Controller interface’ini implements eden siniflar icin kullanmayalim. Farkli 2 yaklasimi birlestirmek problemlere neden olabilir.

Interface-based yaklasimi Spring Framework’un baslangicindan beri vardir , artik modasi gecmis durumdadir.

Yeni Annotation-based yaklasim daha guclu, esnek bir yapiya sahiptir.

NOT: Controller annotation ile Controller arabirimi ayni sinif icin kullanildiginda istenmeyen sonuclara neden olur.

Service Layer
Service Layer uygulama mimarisinde en onemli kisim olacaktir. Uygulamamizin kalbi olarak nitelendirebiliriz. Service Layer’i business logic’i gerceklestirmek icin Domain Layer’dan destek alir.Bununla birlikte Data Access Layer’dan destek alarak calisir.

Spring Framework’unde Service Layer icin herhangi bir arabirim yoktur! Service Layer bizim uygulamamizin yaptigi seydir , dolayiyisla uygulamamiz icin ozellesmis kodumuzdur.
Bununla birlikte Spring Framework’unun bize sagladigi Dependency Injection , transaction gibi kavramlari Service Layer’da kullanabiliriz.

....
public interface BookstoreService {
	List<Book> findBooksByCategory(Category category);
	Book findBook(long id);
	Order findOrder(long id);
	List<Book> findRandomBooks();
	List<Order> findOrdersForAccount(Account account);
	Order store(Order order);
	List<Book> findBooks(BookSearchCriteria bookSearchCriteria);
	Order createOrder(Cart cart, Account account);
	List<Category> findAllCategories();
}

Data Access Layer
Data Access Layer veritabani ile iliskilidir. Bu layer , Service Layer’dan ayri olarak kullanilir.
Service Layer , veritabani ile direkt bir iliskiye girmemelidir. Spring Framework’u data Access Layer icin iyi bir destek saglamaktadir. JDBC, JPA , Hibernate, JDO , IBatis gibi farkli frameworklerle birlikte uyumlu sekilde calismamizi saglayacaktir.

....
public interface AccountRepository {
	Account findByUsername(String username);
	Account findById(long id);
	Account save(Account account);
}

Tipik olarak Spring MVC web application’ini su sekilde layer’lar seklinde ifade edebiliriz.

Github kaynak kodlar / source folder
Injavawetrust-springmvc-tutorial

Yazimi burada sonlandiriyorum.
Herkese Bol Javali Gunler dilerim.
Be an oracle man , import java.*;
Levent Erguder
OCP, Java SE 6 Programmer
OCE, Java EE 6 Web Component Developer

Print Friendly, PDF & Email

Leave a Reply

Your email address will not be published.