Vaadin Web Framework ile Java MVC

Batuhan Düzgün tarafından yayınlanmıştır 23. December 2012 01:13

Vaadin Web Framework ile Java MVC

 

Herkese merhaba arkadaslar, bu yazida sizlerle birlikte Java MVC tasarim deseni projesi gercelestirecegiz. Vaadin Web Framework ile MVC yazilim gelistirme konseptini aciklayacagim.

 

Vaadin Web Framework ?

 

Vaadin Web Framework, kurumsal web uygulamalari gelistirmek icin ortaya cikmis Java tabanli bir bilesen kutuphanesidir. Vaadin Web Framework gelistiricilere HTML,CSS ve Javascript gibi ugras ve zaman isteyen unsurlardan soyutlar. Fakat, ayni zamanda HTML,CSS ve Javascript duzenlemesinde esnektir ve duzenleme, yeniden yazma gibi imkanlar vermektedir.

 

Java MVC ?

 

MVC yazilim gelistirme dizayni, arayuz ile arayuz icinde yurutulen algoritmanin birbirinden ayrilmasini saglar, ayni zamanda bir kontrol modulu ile arayuz ve model arasindaki iletisim ve etkilesim kontrol edilir. 

 

View : Arayuzde yer alacak olan her turlu bilesen ve unsur view olarak nitelendirilir. Ornegin : Bir web sayfasinda TextField'lar, Button'lar gibi bilesenlerle birlikte o sayfa view olarak nitelendirilebilir.

 

Model : Arayuzde yer alan bilesenler araciligiyle, yurutulecek, calistirilacak olan algoritmanin ve verinin kendisidir. Ornegin : web sayfasi uzerindeki TextField'lardan gelen veriler Model icinde saklanacaktir. View herhangi bir veriye ihtiyac duydugunda bunu Controller araciligiyla Model'den talep edecektir. Baska bir ornek vermek gerekirse, web sayfasi uzerinde yer alan Button'a tiklandiginda satis bilgilerinin goruntulenmesi istenildiginde, satis bilgileri Model'den Controller araciligiyla alinacaktir.

 

Controller : View ile Model arasindaki iletisimi ve etkilesimi yonlendiren moduldur. Bu modul icinde yer alan elemanlar genellikle, Button tiklama olaylari (Java Listener'lar kastedilmektedir), Combobox'tan eleman secme olaylari (Java Listener'lar kastedilmektedir) seklindedir. Web ekrani uzerinde bir bilesene tiklanildiginda ne maydana gelecek?, Combobox uzerinden bir eleman secince baska bir sayfayimi gidilecek? Gibi sorulara cevap veren ve kontrol eden kisimlara Controller olarak nitelendirilebilir. 

 

MVC mimarisi ile birlikte View, Model ve Controller icinde yer alan tum unsurlar kendi islerini yapmaktadir. Ornegin : Button bileseni Model icinde yer alan satis bilgilerinden haberdar degildir. Onunla ilgilenmez, cunku o bilgilerin isletilmesi sorumlulugu Model uzerindedir. Button bileseni sadece Controller'a gidip ilgili olayin gerceklesmesini talep eder. Donen sonuctanda haberdar degildir, Controller gerekli islemleri yapar ve View uzerinde gerceklesmesi gereken degisiklikleri meydana getirir. 

 

Java MVC Projesi konusu nedir ?

 

Java MVC projesinde basit bir Vaadin Web ekrani yer alacaktir. Bu ekran uzerinde 2 adet TextField, 1 adet Button bulunacaktir. Girilen isim ve soyisim bilgileri ekranda bir popup penceresinde goruntulenecektir.

 

View  Modulu

 

/**

 *  Bu sinif uzerindeki butun bilesenler View'a aittir.

 *  View uzerinde Model olarak 'MainViewContainer' turunden bir nesne vardir.

 *  View uzerinde Controller olarak 'MainViewListeners' turunden bir nesne vardir.

 */

@SuppressWarnings("serial")

public class MainView extends VerticalLayout{

 

// Model nesnesidir

private MainViewContainer container = null;

// Controller nesnesidir.

private MainViewListeners listeners = null;

// View'a ait olan gorsel bilesenler

private TextField txtName = null;

private TextField txtLastName = null;

private Button submitButton = null;

public MainView() {

//Singleton tasarim desenine gore Model ve Controller nesneleri bir kereligine yaratiliyor.

if(container == null) {

container = new MainViewContainer();

}

if(listeners == null){

listeners = new MainViewListeners(this, container);

}

// `setSizeFull' metodu ile VerticalLayout'un ekrani tamamen kaplamasi saglanir.

this.setSizeFull();

// Ekran uzerindeki bilesenler arasinda bosluk bulunmasini saglar.

this.setSpacing(true);

// HorizontalLayout ile bilesenler yatay sirada ard arda eklenir.

HorizontalLayout hlName = new HorizontalLayout();

// Sadece width olarak ekrana tamamen uzanir.

hlName.setWidth("100%");

HorizontalLayout hlNameLabel = new HorizontalLayout();

Label lblName = new Label();

hlNameLabel.addComponent(lblName);

hlName.addComponent(hlNameLabel);

// Bilesenin eklenmesinden sonra ekran uzerinde saga dogru dayali olmasi saglanir.

hlName.setComponentAlignment(hlNameLabel, Alignment.MIDDLE_RIGHT);

// Gorsel bilesenler yaratilir ve ekran uzerine yerlestirilir.

txtName = new TextField();

txtName.setCaption("Isim : ");

hlName.addComponent(txtName);

hlName.setComponentAlignment(txtName, Alignment.MIDDLE_LEFT);

this.addComponent(hlName);

HorizontalLayout hlLastNameLabel = new HorizontalLayout();

hlLastNameLabel.setWidth("100%");

Label lblLastName = new Label();

hlLastNameLabel.addComponent(lblLastName);

hlLastNameLabel.setComponentAlignment(lblLastName, Alignment.MIDDLE_RIGHT);

txtLastName = new TextField();

txtLastName.setCaption("Soyisim : ");

hlLastNameLabel.addComponent(txtLastName);

hlLastNameLabel.setComponentAlignment(txtLastName, Alignment.MIDDLE_LEFT);

this.addComponent(hlLastNameLabel);

submitButton = new Button();

submitButton.setCaption("Submit");

// Button'a tiklama olayinda Controller sinifindan 'ClickListener' alinir.

submitButton.addListener(this.listeners.getClickListener());

this.addComponent(submitButton);

this.setComponentAlignment(submitButton, Alignment.MIDDLE_CENTER);

}

// Conroller'in sagladigi ''message' verisiyle birlikte'

// yeni bir pencerece acma sorumlulugu View uzerindedir.

public void showPopupWindow(String message){

Window window = new Window();

Label lblMessage = new Label();

lblMessage.setCaption(message);

window.addComponent(lblMessage);

MacvaadinApplication.get().getMainWindow().addWindow(window);

}

public VerticalLayout getContent() {

return this;

}

public Button getSubmitButton(){

return this.submitButton;

}

public TextField getNameTextField(){

return this.txtName;

}

public TextField getLastNameField(){

return this.txtLastName;

}

}

 

Model Modulu

 

// ''MainViewContainer' sinifi View icin Model olarak kullanilacaktir.

// View'in ihtiyac duydugu tum veriler ve akis buradan saglacaktir.

// Boylece View uzerindeki bilesenler ile veriyi birbirinden ayirmis olundu.

public class MainViewContainer {

 

private String name = null;

private String lastName = null;

public MainViewContainer() {

this.name = "";

this.lastName = "";

}

// Yeni bir deger setleme islemi olacagi zaman gerekli kontroller yapilmaktadir.

public void setName(Object name) {

if(name != null) {

String value = String.valueOf(name);

if(value.length() > 0){

this.name = value;

}

}

}

public void setLastName(Object lastName) {

if(lastName != null){

String value = String.valueOf(lastName);

if(value.length() > 0){

this.lastName = value;

}

}

}

public String getName() {

return this.name;

}

public String getLastName() {

return this.lastName;

}

public String toString() {

return "Isim : " + this.name + " , " + this.lastName;

}

}

 

Controller Modulu

 

 

// Bu sinif View ile Model arasindaki etkilesimi ve iletisimi kontrol eder.

// Bu sinif Controller sinifi olarak adlandirilmaktadir.

public class MainViewListeners {

 

private MainViewContainer container = null;

private MainView view = null;

private Button.ClickListener clickListener = null;

@SuppressWarnings("serial")

public MainViewListeners(MainView view, MainViewContainer container) {

this.view = view;

this.container = container;

// Tiklama olayi meydana geldiginde yapilacaklari belirleyen Controller parcasi,

// asagidaki ClickListener nesnesidir.

if(this.clickListener == null){

this.clickListener = new Button.ClickListener() {

public void buttonClick(ClickEvent event) {

showPopupWindow();

}

};

}

}

// Isim bilgisi degisikligini kontrol eden kod blogudur.

public void changeNameValue(String value) {

this.container.setName(value);

}

// SoyIsim bilgisi degisikligini kontrol eden kod blogudur.

public void changeLastNameValue(String value) {

this.container.setLastName(value);

}

public void showPopupWindow(){

this.container.setName(this.view.getNameTextField().getValue());

this.container.setLastName(this.view.getLastNameField().getValue());

String message = this.container.toString();

// Bu kod blogu onemlidir. Cunku, dikkat edilirse Controller yeni bir pencere acma islemini yapmaz.

// Model'den aldigi verilerle birlikte yeni bir pencere acma islemini View'a paslar.

// Cunku bu Controller'in gorevi degildir. Onun gorevi pencere acilmasi icin gerekli olaran veriyi Model'den talep etmektir.

this.view.showPopupWindow(message);

}

public Button.ClickListener getClickListener() {

return this.clickListener;

}

}

 

Vaadin uygulamasinin calismasi icin Application sinifindan kalitim almis olan bir sinif yaratilir. Asagida ornegi verilmistir.

 

// Vaadin uygulamasinin baslatildigi Application sinifidir.

// Her Vaadin uygulamasi mutlaka bir Application sinifindan ''init' metodu ile baslatilmalidir.

@SuppressWarnings("serial")

public class MacvaadinApplication extends Application implements HttpServletRequestListener{

private static ThreadLocal<MacvaadinApplication> threadLocal = new ThreadLocal<MacvaadinApplication>();

private Window mainWindow = null;

private VerticalLayout content = null;

private static MacvaadinApplication application = null;

@SuppressWarnings("static-access")

@Override

public void init() {

this.application = this;

mainWindow = new Window("Java MVC Application");

setMainWindow(mainWindow);

content = (VerticalLayout)mainWindow.getContent();

content.setMargin(false);

content.setSpacing(false);

content.addComponent(new MainView());

}

public static MacvaadinApplication get(){

return application;

}

public Window getMainWindow() {

return mainWindow;

}

public void onRequestStart(HttpServletRequest request, HttpServletResponse response) {

threadLocal.set(this);

}

 

public void onRequestEnd(HttpServletRequest request, HttpServletResponse response) {

threadLocal.remove();

}

}

 

Uygulamayi Tomcat 7 uzerinde calistirdiktan sonra asagidaki gibi sonuc elde edilmesi gerekmektedir.

   

 

Java MVC tasarim deseniyle ilgili temel niteliginde bahsedeceklerim bunlardan ibarettir. Umarim yararli bir yazi olmustur. Bir sonraki makalemde gorusmek dilegiyle ...

 

Batuhan Duzgun

Bilgisayar Muhendisi

Endustri Muhendisi 

Currently rated 5.0 by 5 people

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Etiketler:

Vaadin

Comments

Add comment


(Will show your Gravatar icon)  

  Country flag

biuquote
  • Comment
  • Preview
Loading





Bu site BlogEngine.NET 1.4.5.0 ile oluşturulmuştur. Türkçe çevirisi BlogEngine TR ekibi tarafından yapılmıştır.

Batuhan Düzgün

Sakarya Üniversitesi 

Bilgisayar Mühendisi

Endüstri Mühendisi

Yeditepe Üniversitesi

Bilgisayar Mühendisliği Yüksek Lisans 

 sahibinden.com

   Kıdemli Uzman Yazılım Mühendisi  

E-Mail 

   batuhan.duzgun@sahibinden.com

   batuhan.duzgun@windowslive.com

  github.com/batux

 

Sayfalar

Calendar

<<  September 2018  >>
MoTuWeThFrSaSu
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

Yazıları geniş takvimde göster