Skip to content

16. 3 katmanlı mimaride MVC web uygulaması – Örnek 2

16.1. Introduction

Aşağıdaki yapıya sahip [personnes-01] uygulamasını yazdık:

[dao] katmanı, [ArrayList] nesnesi kullanılarak yönetilen kişi listesini hayata geçiriyordu. Bu sayede, [dao] ve [service] katmanları üzerinde fazla durmadan, [web] katmanına odaklanabildik. Uygulamayı, kişi listesinin bir veritabanı tablosunda depolandığı daha gerçekçi bir ortama taşımak istiyoruz. Bu, [dao] katmanını değiştirmemizi gerektirecek. Bu değişiklik, diğer iki katmanı da etkileyecektir. Spring IoC'in sağladığı katman bağımsızlığından yararlanmak için, [personnes-01] uygulamasını yeniden ele alıp Spring IoC ile yapılandıracağız:

Yeni uygulamanın adı [personnes-02] olacaktır. Uygulama yazıldıktan sonra, [web] katmanının kodunda herhangi bir değişiklik yapmadan [dao] ve [service] katmanlarını değiştirebileceğimizi biliyoruz. İşte aradığımız şey budur.

6.2. paragrafta açıklandığı gibi, [personnes-01] projesini kopyalayıp yapıştırarak yeni bir Eclipse projesi olan [personnes-02]'i oluşturuyoruz:

[1] içinde, [dao] ve [service] katmanlarının bean'lerini tanımlayacağımız yapılandırma dosyası görünür. İçeriği şöyledir:


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
    <!-- DAO sınıfı -->
    <bean id="dao" class="istia.st.mvc.personnes.dao.DaoImpl" init-method="init"/>
    <!-- hizmet sınıfı -->
    <bean id="service" class="istia.st.mvc.personnes.service.ServiceImpl">
        <property name="dao">
            <ref local="dao" />
        </property>
    </bean>
</beans>
  • 5. satır: [dao] adlı bean'i, [DaoImpl] sınıfının bir örneği olarak tanımlar. Örnek oluşturulduktan sonra, örneğin [init] yöntemi yürütülür.
  • 7-10. satırlar: [service] adlı bean'i, [ServiceImpl] sınıfının bir örneği olarak tanımlar.
  • 8-10. satırlar: [DaoImpl] örneğinin [dao] özelliği, 5. satırda oluşturulan [dao] katmanının referansı ile başlatılır. [ServiceImpl] sınıfının [dao] özelliğine ve buna ait setter'a sahip olduğunu hatırlayalım:
public class ServiceImpl implements IService {

     // [dao] katmanı
    private IDao dao;

    public IDao getDao() {
        return dao;
    }

    public void setDao(IDao dao) {
        this.dao = dao;
    }
...

Elbette bu dosya tek başına hiçbir şey yapmaz. [Application] denetleyicisi, [init] yönteminde bu dosyayı kullanarak [service] katmanını örneklendirecektir. Denetleyicinin [init] yönteminin önceki sürümünü hatırlayalım:

@SuppressWarnings("serial")
public class Application extends HttpServlet {
...
     // hizmet
    ServiceImpl service = null;

     // başlatma
    @SuppressWarnings("unchecked")
    public void init() throws ServletException {
...
         // [dao] katmanının örneklenmesi
        DaoImpl dao = new DaoImpl();
        dao.init();
         // [service] katmanının örneklenmesi
        service = new ServiceImpl();
        service.setDao(dao);
    }
  1. satırda, [service] katmanının uygulama sınıfını ve 12. satırda ise [dao] katmanının uygulama sınıfını açıkça belirtmek zorunda kalmıştık. Spring IoC ile [init] yöntemi şu şekilde olur:
@SuppressWarnings("serial")
public class Application extends HttpServlet {
     // örnek parametreleri
    ...

     // hizmet
    private IService service = null;

     // başlatma
    @SuppressWarnings("unchecked")
    public void init() throws ServletException {
    ...
         // [service] katmanının örneklenmesi
        service = (IService) new XmlBeanFactory(new ClassPathResource("spring-config.xml")).getBean("service");
    }
  • 7. satır: [service] özel alanı artık [ServiceImpl] türünde değil, [IService] ve c.a.d türündedir. [service] katman arayüzü türündedir. Dolayısıyla, [web] katmanı artık bu arayüzün belirli bir uygulamasına bağlı değildir.
  • 14. satır: [service] alanının [spring-config.xml] yapılandırma dosyasından başlatılması.

Yapılması gereken değişiklikler sadece bunlardır. Bu yeni uygulamayı Tomcat'e entegre edelim, Tomcat'i başlatıp [http://localhost:8080/personnes-02] URL'sini çağıralım:

Image

16.2. Web uygulamasının arşivlenmesi

3 katmanlı bir uygulama için bir Eclipse / Tomcat projesi geliştirdik:

Gelecek bir sürümde, kişi grubu bir veritabanı tablosuna yerleştirilecek.

  • Bu durum, [dao] katmanının yeniden yazılmasını gerektirecektir. Bu durum kolayca anlaşılabilir.
  • [service] katmanı da değiştirilecektir. Şu anda bu katmanın tek işlevi, [dao] katmanı tarafından yönetilen verilere senkronize erişim sağlamaktır. Bu amaçla, [service] katmanındaki tüm yöntemleri senkronize ettik. Bu senkronizasyonun neden [dao] katmanında değil de bu katmanda yer aldığını daha önce açıklamıştık. Yeni sürümde, [service] katmanının yine tek işlevi erişim senkronizasyonu olacak, ancak bu senkronizasyon Java yöntemlerinin senkronizasyonu yerine veritabanı işlemleri yoluyla sağlanacaktır.
  • [web] katmanı ise değişmeden kalacaktır.

Bir sürümden diğerine geçişi kolaylaştırmak amacıyla, önceki [mvc-personnes-02] projesinin bir kopyası olan yeni bir Eclipse projesi [mvc-personnes-02B] oluşturuyoruz; ancak bu projede [web, service, dao, entites] katmanları .jar arşivlerine yerleştirilmiştir:

[src] klasörü artık yalnızca [spring-config.xml] adlı Spring yapılandırma dosyasını içermektedir. Daha önce bu klasörde Java sınıflarının kaynak kodu da bulunuyordu. Bu öğeler kaldırılmış ve yerlerine [personnes-*.jar] arşivlerine yerleştirilen derlenmiş sürümleri geçmiştir; bunlar [1]'te gösterilmiştir:

[mvc-personnes-02B] projesi, [personnes-*.jar ] arşivlerini ClassPath dosyasına dahil edecek şekilde yapılandırılmıştır.

[mvc-personnes-02B] web projesini Tomcat ortamında devreye alıyoruz:

Projeyi test etmek için Tomcat'i başlatıp [http://localhost:8080/personnes02B] URL'sini çağırıyoruz:

Image

Okuyucunun ek testler yapması önerilir.

Veritabanlı sürümde, [service] ve [dao] katmanlarını değiştireceğiz. Böylece, uygulamamızın artık bir veritabanıyla çalışabilmesi için önceki projede [personnes-dao.jar] ve [personnes-service.jar] arşivlerini yeni arşivlerle değiştirmemizin yeterli olacağını göstermek istiyoruz. [web] ve [entites] katmanlarındaki dosyalara dokunmamız gerekmeyecektir.