Simple MVC ile Java Üzerinde MVC uygulamaları

2

Tarih : 09-07-2010 | Yazan : Hüseyin Bora | Kategori : Framework, Java, MVC, Mahsullerim, Tasarım Kalıpları

Bundan önceki yazıda da belirtiğim gibi java ile ufak bir  mvc pattern uygulaması geliştirdim. Adında da anlaşılacağı üzere basit mvc kolay kullanıma yönelik bir çalışma oldu 7 kb hacmi ile hızlı mvc uygulamaları için ideal.

Öncelikle  http://code.google.com/p/javabasicmvc/downloads/list adresini ziyaret edip simplemvc.jar dosyasını indiriyosunuz  ve projenizin lib klasörüne yerleştiriyosunuz.

projenin ana dizini altına views altında bir klasör oluşturuyoruz *.jsp dosyalarımız burada olacak. index.jsp ve 404.jsp dosyalrını buraya yerleştiriyoruz.

XML Yapılandırması mvc paketi içerisindeki frontcontroller sınıfı bir servlet olarak web.xml  dosyamızda tanıtıyoruz ve gelen istekleri frontcontroller sınıfına iletiyoruz artık biz aradan çekiliyoruz.

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<servlet>
<servlet-name>FrontController</servlet-name>
<servlet-class>mvc.FrontController</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>FrontController</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>FrontController</welcome-file>
</welcome-file-list>
</web-app>

kontrolcu sınıflarımızda app.controller paketinde bulunduruyoruz.

package app.controllers;
import mvc.*;
class mycontroller implements Controller {
    public View Controller() {
        return new View("myview");
    }
}

views klasörüne myview.jsp dosyasını ekledikten sonra
adres satırına uygulama adı controller adı şeklinde uygulamamızı çalıştırıyoruz
http://localhost:8084/uygulama/mycontroller

View e veri göndermek. aşağıdaki gibi bir sınıfımız olsun.

User.java

package app.models;
public class User {
    private String name;
    private String mail;
    public User() {
    }
    public User(String name, String mail) {
        this.name = name;
        this.mail = mail;
    }
    public String getMail() {
        return mail;
    }
    public void setMail(String mail) {
        this.mail = mail;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

userview.jsp dosyamızda

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
    </head>
    <body>
        <h2>User</h2>
        Adi : ${user.name}
        <br>
        Mail : ${user.mail}
    </body>
</html>

Controller sınıfımız @WebMethod annotation ile birlikte da yeni bir metod ekliyoruz
@WebMethod annotation ile eklenmiş methodlar frontcontroller tarafından işletilirler.
mycontroller.java

package app.controllers;
import app.models.User;
import mvc.*;
class mycontroller implements Controller {
    public View Controller() {
        return new View("myview");
    }
    @WebMethod
    public View user() {
        return new View("userview", new User("bora", "bora@webmahsulleri.com"));
    }
}

tekrar adres satırına
http://localhost:8084/yourapp/mycontroller/user

yazdığımızda mycontroller sınfının user metodu işletiliyor ve user metodu userview.jsp dosyasınıişletilmek üzere frontcontroller a bildiriyor.

Digg This
Reddit This
Stumble Now!
Buzz This
Vote on DZone
Share on Facebook
Bookmark this on Delicious
Kick It on DotNetKicks.com
Shout it
Share on LinkedIn
Bookmark this on Technorati
Post on Twitter
Google Buzz (aka. Google Reader)

Java Servlet ve JSP ile MVC Kalıbı Tasarımı

0

Tarih : 08-07-2010 | Yazan : Hüseyin Bora | Kategori : Framework, Java, MVC, Yazılım Mimarileri

Java’nın Doğası MVC Kalıbı
Java da malum pek çok mvc çatısı var struct,jsf,spring velhasıl kelam bu yazıda java servlet kullanarak kendi mvc kalıbımızı oluşturup Java’nın doğasındaki mvc yi dışarı çıkaracağız.

Öncelikle Controller sınıfımız HttpServlet sınıfından türetmeliyiz. Bir özet sınıf olarak tanımladığımız controller sınıfı Controller() adında bir özet metot tanımlar ki bu özet metodu kontrolcümüzü genişleten sınıflar uygulamak zorundadırlar.

HttpServletRequest objesinin getRequestDispatcher metodu kendisine argüman olarak verilen dosyayla ilişkili bir RequestDispatcher nesnesi getirir. Görüldüğü gibi servletin doğasında MVC yatmakta Controller servletimize dispatch adında bir method ekliyorum Conrollerden türetilen diğer sınıflar bu metoda başvurarak dispacth işlemini gerçekleştirecekler.

package mvc;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public abstract class Controller extends HttpServlet {
    protected HttpServletRequest request;
    protected HttpServletResponse response;
    abstract public void Controller();
    public void dispatch(String file, Object data) {
        try {
            RequestDispatcher dispatcher = request.getRequestDispatcher(file);
            getServletContext().setAttribute(data.getClass().getName(), data);
            dispatcher.include(request, response);
        } catch (Exception ex) {
        }
    }
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        this.request = request;
        this.response = response;
        this.Controller(); //genişleten sınıfların controller metodu çağrılıyor.
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }
}

getServletContext().setAttribute(String key,Object o) metodu ile yönlendirdiğimiz jsp sayfasına veri taşıyoruz.

Model kısmını ufak bir bean ile hallediyoruz burada her hangi bir veri katmanı kullanılabilir.

package model;
public class User {
private String name;
private String email;
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

View(Görünüm) tarfında JSP kullanıyoruz.

anasayfa.jsp varsayılan durumda controller anasyfa.jsp yi görüntüleyecek

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Ana Sayfa</title>
</head>
<body>
<h2>Hoşgeldiniz</h2>
<a href=”?sayfa=”uye”> Uye </a>
</body>
</html>

Uye.jsp page parametresine uye değeri verildiğinde Kontrolcümüz uye.jsp sayfasını görüntüleyecek

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<jsp:useBean class="model.User" scope="application"/>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP Page</title>
</head>
<body>
<h2>Hello World!</h2>
User name :<% out.print(User.getName());  %>
<br>
User name :<% out.print(User.getEmail());  %>
</body>
</html>

User.jsp de ile user sınıfını bir global olarak jsp sayfamızda belirtiyoruz

Evet artık sıra kontrolcümüzü türetmeye geldi.

package mvc;
import java.io.IOException;
import model.User;
public class Test  extends Controller {
public void Controller() {
{
String page = (String) request.getParameter("page");
if (page == null) {
this.dispatch("views/anasayfa.jsp", null);
} else if (page.equals("user")) {
User u = new User();
u.setName("hbora");
u.setEmail("hborat@email.com");
this.dispatch("views/user.jsp", u);
}
}
}
}

Servletimiz için web XML yapılandırması aşağıdaki gibi olmalı

<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<servlet>
<servlet-name>Controller</servlet-name>
<servlet-class>mvc.Controller</servlet-class>
</servlet>
<servlet>
<servlet-name>test</servlet-name>
<servlet-class>mvc.test</servlet-class>
</servlet>
>
<servlet-mapping>
<servlet-name>Controller</servlet-name>
<url-pattern>/Controller</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>test</servlet-name>
<url-pattern>/test</url-pattern>
</servlet-mapping>
</web-app>

Şimdilik bukadar yakında basit mvc adını verdiğim bir mvc aplikasyonunu yayınlayıp yine burada kullanımından ve mvc den bahsedeceğim.

Digg This
Reddit This
Stumble Now!
Buzz This
Vote on DZone
Share on Facebook
Bookmark this on Delicious
Kick It on DotNetKicks.com
Shout it
Share on LinkedIn
Bookmark this on Technorati
Post on Twitter
Google Buzz (aka. Google Reader)

Yeni PHP Faces dan Ufak bir MVC örneği

0

Tarih : 30-06-2010 | Yazan : Hüseyin Bora | Kategori : Framework, PHP, PHP Faces, Yazılım Mimarileri

Controller artık bir sınıf değil zarif bir arayüz.

<?php
use mvc\Controller;
use mvc\View;
class PF2 implements Controller
{
    public function Controller() {
        return new View("view",array("name"=>"bora"));
    }
}
?>

Kodlardan da anlaşılacağı üzere PF2 PHP5.3 ve üzerine yönelik bir çalışma.

Digg This
Reddit This
Stumble Now!
Buzz This
Vote on DZone
Share on Facebook
Bookmark this on Delicious
Kick It on DotNetKicks.com
Shout it
Share on LinkedIn
Bookmark this on Technorati
Post on Twitter
Google Buzz (aka. Google Reader)

Sihirli PHP __set ve __get metotları

2

Tarih : 18-11-2009 | Yazan : Hüseyin Bora | Kategori : PHP, Yazılım Mimarileri

Bu makalede PHP de edindiğim bazı kolaylık ve deneyimleri aktarmaya çalışacağım
Profesyonel PHP programcılarının çoğu farklı bir dil üzerinde çalışıp PHP ye geçmiş kişiler olarak nitelendirdiğimizde örneğin Java, C# olabilir PHP yine de bu diller gibi düşünmeye başlar hâlbuki PHP tam anlamıyla bir betik dilidir ve benzer neyse yönelimli dillerden ayıran belirgin özellikleri vardır.

Ben ve çalışma arkadaşlarımın PHP üzerinde nesne yönelimli projeler geliştirirken ilk başlardaki PHP üzerindeki acemiliğimizden dolayı bir takım kodları Java da ya C# da yazarcasına geliştirmişiz. Bu günde pek çok PHP programcısının benzer hatalara düştüğünü görüyorum.

PHP’nin NYP yapısı diğer NYP dillerden ayrılan ve programcının işini kolaylaştıran bir yapıya sahip.
Örneğin NYP temellerinden Kılıflama(Encapsulation) bu prensip Java da Set ve Get metotları C# da ise set ve get propertyleri yazılarak gerçekleştirilir. PHP de de Set ve Get yaklaşımı kabul edilebilirse de bu konuda PHP de __get ___set isimlerinde iki sihirli metot tanımlanmıştır. Örneğin bir sınıfın içerisinde 5 adet private üye olsun Get ve Set metotlarını kullanmak istersek sadece Get ve Set için sınıfımız da 10 adet metot bulunması gerekir. PHP nin sihirli metotları ile bu iş basit 2 metot içerisinde halledilebilir.

Örnek

Class urun
{

private $id,$name,$prince,$paytyep,$order;

public function __set($n,$v)
{
$this->$n=$v;
}

public function __get($n)
{

return $this->$n;
}
}

Örnekte de görülebileceği gibi 10 metot ile yapılacak bu iş iki sihirli metot sayesinde basit ve sistem kaynaklarını daha verimli kullanır bir şekilde tasarlanmıştır.

Digg This
Reddit This
Stumble Now!
Buzz This
Vote on DZone
Share on Facebook
Bookmark this on Delicious
Kick It on DotNetKicks.com
Shout it
Share on LinkedIn
Bookmark this on Technorati
Post on Twitter
Google Buzz (aka. Google Reader)

RMI Nedir Uzaktan Metot Çağrımı (RMI – Remote Method Invocation)

2

Tarih : 05-11-2009 | Yazan : Hüseyin Bora | Kategori : Java, Yazılım Mimarileri

RMI nedir ?

Bir cihaz üzerinde çalışan Java nesnelerinin, başka bir cihaz üzerinde çalışan diğer Java nesnesinin metodunu çağırmasını sağlar. Bu önemli özellik dağıtık uygulamalar geliştirilmesine izin verir. Günümüzde SOAP, REST vb Web servislerinin gelişmesiyle RMI gibi benzer teknolojilerin kullanımı Web servisleri yönüne kaymaktadır.

RMI Sunucu, İstemci mimarisi üzerine kurulu olup, arabirimler ve serileştirme ile uzak metot çağrımı başarıya ulaşır.

rmi

RMI’ uygulamak genellikle 4 adım kullanılır

1- Sunucu tarafından sağlanan uzak arabirim

2- Uzak Arabirimi uygulayan uzak sınıf

3- Sunucu cihazın ana programı

4- İstemci cihaz tarafı

Buradaki örnek sunucu tarafında List arabirimini uygulayan bir List nesnesini istemci tarafına uzak metot çağırımı ile Gerçekleştireceğiz. Yani sunucu tarafında oluşturduğumuz bir listeyi istemciye göndericeğiz.

Adım 1- Sunucu tarafından sağlanan uzak arabirimi gerçekleştirmek. Tüm uzak arabirimler Remote Arabirimini genişletmek zorundadır Remote üye tanımlamaz, tüm uzak metotlar bir RemoteException fırlatabilir.

 
/** 
* ServerIntf.java 
* @author Hüseyin Bora
*/
import java.rmi.*;
import java.util.*;
public interface ServerIntf extends Remote {
public List getList()throws RemoteException;
 }

Adım 2 – ServerIntf uzak arabirimi uygulayıp uzak nesnelere uygunluğu sağlayan UnicastRemoteObject sınıfını genişletmek zorundadır.

 
/**
 * ServerImpl.java
 * @author Hüseyin Bora
 */
import java.rmi.*;
import java.rmi.server.*;
import java.util.*;
public class ServerImpl extends UnicastRemoteObject
implements ServerIntf{
    public ServerImpl()throws RemoteException{
    }
 
public List getList() throws RemoteException {
        ArrayList al = new ArrayList();
        for(int i= 1 ; i<10; i++)
        al.add(i);
        return al;
    }

}

Adım 3- Sunucu ana programının yazılması ana program şu adımları takip eder.

1- ServerImpl nesnesi oluşturmak.

2- RMI kayıdını güncellemek.

Kayıt işlemi Naming sınıfının rebind() metodu kullanılarak gerçekleştirilir. Bu metot bir adı bir nesne referansı ile ilişkilendirir.ilk parametre sunucuyu , ikinci parametre nesne referansını alır.

/**
 * Main.java
 * @author Hüseyin Bora
 */
import java.rmi.*;
import java.net.*;
public class Main{
    public static void main(String[] args) {
        try
        {
            ServerImpl serverobject = new ServerImpl();
            Naming.rebind("Main", serverobject);
        } 
        catch (Exception ex) {
           ex.printStackTrace();
        }
    }

Adım 4- İstemci tarafının gerçekleştirilmesi istemci tarafı rmi protokolünü kullanır Naming sınıfının lookup() metodunu çağırır bu metot bir rmi URL’si alır ve uzak nesneye bir referans döndürür.

/**
 * Client.java
 * @author Bora
 */
 
import java.rmi.*;
import java.util.*;
public class Client {
    public static void main(String[] args) {
        try {
            String rmiUrl = "rmi://localhost/Main";
            ServerIntf remote = (ServerIntf) Naming.lookup(rmiUrl);
            ArrayList al = (ArrayList) remote.getList();
            Iterator it = al.iterator();
            while (it.hasNext()) 
                System.out.println(it.next().toString());
            
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}

RMI uygulamasının çalıştırması

Adımlar

1- Javac kullanarak Java kaynak dosyalarının derlenmesi.

2- Rmic kullanarak İkame ve iskelet kodları üretmek. Java2 iskelet kodlara gerek duymaz. rmic ile ikame kod üretecekseniz classpath’te geçerli dizinin ekli olması gereklidir.

3- Rmiregistr servisini yürütmek : komut satırından : start rmiregistry

4- Uygulamayı yürütmek : istemci cihazda bulunacak class dosyaları Client.class Oluşturulmuşsa ServerImpl_Stub.class ve ServerIntf.class sunucu tarafında bulunacak dosyalar : Main.class , ServerIntf.class , ServerImpl.class oluşturmuşsa iskelet kod ServerImpl_Skel.class.

Uygulamanın istemci cihaz izerinde çalıştığında 1-9 arası sayıları ekrana yazacaktır.

 
 
 
 

 

Digg This
Reddit This
Stumble Now!
Buzz This
Vote on DZone
Share on Facebook
Bookmark this on Delicious
Kick It on DotNetKicks.com
Shout it
Share on LinkedIn
Bookmark this on Technorati
Post on Twitter
Google Buzz (aka. Google Reader)