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)

PHP Faces Pager Etiketi ile Sayfalama (Pagination)

0

Tarih : 09-11-2009 | Yazan : Hüseyin Bora | Kategori : PHP


Pager Etiketi sayfalama yapmak amacıyla kullanılır.İki farklı kullanım vardır birinci kullanım şeklinde entity niteliğine varlık sınıfının adı.
Limit niteliğine gösterilecek kayıt sayısı yazılır eğer FQL etiketinde olduğu gibi bir sonuc kümesi elde edilmek isteniyora resource niteliğine geri alınacak sounuc kümesinin adı yazılmalıdır.

Eğer php faces framework ü URI modunda kullanıyorsanız pager nesnesinin uri biçimde sayfalama oluşturması için pager etiketinin type niteliğine path değerini vermeniz gerekir.

Örnek Pager ve Grid bileşenlerinin birlikte kullanımı

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<faces>
<@import prefix="f" taglib="phpf.ui.*"/>
<@import prefix="db" taglib="phpf.db.*"/>
<f:grid id="grid" width="100%" bind="$liste" border="1">
<@item   key="no"  title="Urun no" />
<@item   key="ad" title="Urun adı"/>
<@item   key="fiyat" title="fiyat"/>
<@item  input="img"  key="resim" title="Resim"/>
<@item  input="link" title="Detay"  url="testet.php?edit=$no"/>
</f:grid>
<db:pager id="pager"  limit="3" entity="urun" resource="liste"
previous="Önceki" next="Sonraki"/>
</faces>
</body>
</html>

Pager etiketinin query niteliği FQL secim işleminden sonraki FQL cümlelerini kabul eder
Örnek Fiyat aralığı

<db:pager id="pager"  type="path" limit="3" entity="urun" resource="liste"
query="WHERE urun.fiyat >=50 AND urun.fiyat<=100"/>

Pager bileşeninin diğer kullanımı ise veritabanı sorgularını Kontrollcü içerisinde yapıp pager bileleşenine count niteliğne toplan kayıt sayısını ve limit niteliğinede sayfada gösterilecek kayıt sayısı verilmelidir.

Örnek
Görünüm

<html>
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<faces>
<@import prefix="c" taglib="phpf.core" type="static"/>
<@import prefix="db" taglib="phpf.db.*"/>
<table border="1" align="center">
<thead>
<th>Urun NO</th>
<th>Urun Adı</th>
<th>Fiyat</th>
<th>Resim</th>
</thead>
<c:foreach var="#{$this.list}" item="$urun">
<tr>
<td>#{$urun.no}</td>
<td>#{$urun.ad}</td>
<td>#{$urun.fiyat}</td>
<td><img src="#{$urun.resim}"/></td>
</tr>
</c:foreach>
</table>
<db:pager id="pager" limit="5" count="100"/>
</faces>
</body>
</html>

Facete  Controller tarafı

<?php

import("phpf.controllers.facete");

import("dbf.persistence");

import("entity.*",true);

import("phpf.db.pager");
class Urunler extends Facete {

protected $list;

public function Urunler() {

parent::Facete();
$this->render("urunler.html");
}

public function prerender() {
$em = EntityManager::getInstance();
$query= $em->createQuery("Select count(u.no) from urun u");
$this->pager->setCount($query->execute()->getSingle());
$query= $em->createQuery("Select u from urun u GROUP BY u.no ".$this->pager->getLimitQuery());
$this->list =$query->execute()->getResultList();
}
}
?>

Pager bileşeninin QueryString den aldığı p değişkeni istenirse değiştirile bilir bunun için bilşen tanımı view dosyasında yapılırken request niteliğne işlenecek değişken adı yazılır.

<db:pager id="pager" limit="3" count="10" request="sayfa" type="path"/>
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)

ORM Kütüphanesi ve Grid Table Kullanımı

0

Tarih : 09-11-2009 | Yazan : Hüseyin Bora | Kategori : FDL, Faces ORM, PHP, PHP Faces, PHP ORM

Grid bileşeni kendisine bind niteliği ile belirtilen Sınıf diziden bir HTML tablosu oluşturur. Oluşturulan tabloda hangi sutunların bulunacağı @item direktifi ile bildirilir. @item direktifinin key niteliğine Varlık sınıfının uye ismi title niteliğine ise sutunun başlığı yazılır.

Table

@item direktifi ile tabloya sınıf harici bilgi eklemek için input niteliği kullanılır.

<@item  input=”link” title=”Düzenle”  url=”testet.php?edit=$no”/>

Örneğin yukarıdaki @item direktifi ile düzenle başlıklı bir bağlantı oluşturulur ve bağlantı adresi url niteliği ile belirtilir.

Örnek Aşağıdaki gibi bir Varlık sınfımız olsun

<?php
/**
*  @Table(name = "urun")
*/
class Urun extends Entity
{
/**
* @Id
* @Column(name = "no")
*/

private $no;
/**
* @Column(name = "ad")
*/

private $ad;
/**
* @Column(name = "fiyat")
*/

private $fiyat;
/**
* @Column(name = "resim")
*/

private $resim;
function get($name) {

return $this->$name;
}
function set($name,$value) {
$this->$name = $value;
}
}
?>

Urunlerin listesini oluşturmak için aşağıdaki gibi bir kontrolcümüz olsun $list değişkenin içerisine veritabanından çektiğimiz bilgileri aktarıyoruz.

<?php

import("phpf.controllers.facete");

import("dbf.persistence");

import("entity.urun",true);
class UrunGrid extends Facete {

protected $list;

public function UrunGrid() {

parent::Facete();
$em = EntityManager::getInstance();
$query= $em->createQuery("Select u from urun u");
$query->execute();
$this->list = $q->getResultList();
$this->render("grid.html");
}
}
?>

Görünüm Dosyamız grid etiketinin bind niteliğine bind=”$this.list” eklememiz önemli

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<faces>
<@import prefix="f" taglib="phpf.ui.*"/>
<f:grid name="grid" height="30%" width="75%" bind="$this.list" border="1">
<@item   key="no"  title="Urun no" />
<@item   key="ad" title="Urun adı"/>
<@item   key="fiyat" title="fiyat"/>
<@item  input="img"  key="resim" title="Resim"/>
<@item  input="link" title="Detay"  url="testet.php?edit=$no"/>
</f:grid>
</faces>
</body>
</html>

            <@item   key="no"  title="Urun no" />
            <@item   key="ad" title="Urun adı"/>
            <@item   key="fiyat" title="fiyat"/>
            <@item  input="img"  key="resim" title="Resim"/>
            <@item  input="link" title="Detay"  url="testet.php?edit=$no"/>
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)

Header Nesnesi İle View Dosyasına Başlık etiketleri eklemek

0

Tarih : 09-11-2009 | Yazan : Hüseyin Bora | Kategori : PHP, PHP Faces

Header nesnesi FacesRenderer sınıfı faces dosyasını ayrıştırken <head> etiketi ile karşılaştığında otomatik olarak bir Header nesnesi oluştur render işleminin sonucunda da bu header nesnesini döndürür. Header nesnesi sayfanın <head> </head> aralığına ekleme yapmak için kullanılır.
Header sınıfının metotları şöyledir

  • addMeta(string name, string content) görüm’e bir meta etiketi ekler
  • addScript(string file) görüm’e file ile belirtilen dosya adı ile script etiketi ekler
  • addLink(string file) görüm’e file ile belirtilen dosya adı ile link etiketi ekler rel=”stylesheet” type=”text/css” niteliklerini kullanır
  • setTitle(string title) sayfa başlığını değiştirir
  • addText(string text)  text parametresini <head> </head> etiketleri arasına ekler.

Örnek

<?php

require_once ("config.php");

import("phpf.controllers.facete");
class Head extends Facete {

public function Head() {

parent::Facete();
$this->render("view.html");
}
function dugmeClicked($e) {
$head =FacesRenderer::getHeader();
$head->setTitle("Butona Tıklayınca Başlğı değiştirdim");
}

public function prerender() {
$head= FacesRenderer::getHeader();
$head->addMeta("description", "PHP Faces MVC Framework");
$head->addMeta("keywords", "PHP,ORM,MVC,AJAX");
$head->addScript("scritp.js");
$head->addLink("style.css");
}
}

Dispatcher::dispatchclass("head");
?>

Görünüm

<html>
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<faces>
<@import taglib="phpf.ui.button" prefix="f"/>
<f:button name="dugme" text="Tıkla1" onclick="actionevent"/>
</faces>
</body>
</html>

Header nesnesi

FacesRenderer sınıfı faces dosyasını ayrıştırken <head> etiketi ile karşılaştığında otomatik olarak bir Header nesnesi oluştur render işleminin sonucunda da bu header nesnesini döndürür. Header nesnesi sayfanın <head> </head> aralığına ekleme yapmak için kullanılır.

Header sınıfının metotları şöyledir

  • addMeta(string name, string content) görüm’e bir meta etiketi ekler
  • addScript(string file) görüm’e file ile belirtilen dosya adı ile script etiketi ekler
  • addLink(string file) görüm’e file ile belirtilen dosya adı ile link etiketi ekler rel=”stylesheet” type=”text/css” niteliklerini kullanır
  • setTitle(string title) sayfa başlığını değiştirir
  • addText(string text) text parametresini <head> </head> etiketleri arasına ekler.

Örnek

<?php
require_once ("config.php");
import("phpf.controllers.facete");
class Head extends Facete {
    public function Head() {
        parent::Facete();
        $this->render("view.html");
    }
    function dugmeClicked($e) {
        $head =FacesRenderer::getHeader();
        $head->setTitle("Butona Tıklayınca Başlğı değiştirdim");
    }
    public function prerender() {
        $head= FacesRenderer::getHeader();
        $head->addMeta("description", "PHP Faces MVC Framework");
        $head->addMeta("keywords", "PHP,ORM,MVC,AJAX");
        $head->addScript("scritp.js");
        $head->addLink("style.css");
    }
}
Dispatcher::dispatchclass("head");
?>
 
 

Görünüm

<html>
    <head>
    <title></title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<faces>
    <@import taglib="phpf.ui.button" prefix="f"/>
    <f:button name="dugme" text="Tıkla1" onclick="actionevent"/>
</faces>
</body>
</html>
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)