İçeriğe geç
← Blog

Spring MVC’ye Giriş

22 Mayıs 2012, 23:16 Java 7 dk 9.9k 1

Spring Framework, Servlet API üzerine inşa edilmiş güçlü bir uygulama geliştirme çatısıdır (framework). Özellikle web uygulamalarında sunduğu Spring MVC mimarisi sayesinde gelen HTTP isteklerini yönetmek, controller katmanına yönlendirmek ve uygun view’ları döndürmek oldukça kolay hale gelir.

Bu yazıda MVC tasarım deseninin detaylarına girmeyeceğiz. Amacımız, Spring MVC’nin XML tabanlı klasik yapısını kullanarak ilk uygulamamızı çalıştırmak ve isteklerin nasıl işlendiğini anlamaktır.

Yazının sonunda oluşturduğumuz proje Tomcat üzerinde çalışabilecek durumdadır.


1. DispatcherServlet Tanımlama

Spring MVC’nin kalbinde DispatcherServlet bulunur.

Tarayıcıdan gelen tüm HTTP istekleri ilk olarak bu servlet’e ulaşır. DispatcherServlet daha sonra isteğin hangi Controller tarafından işleneceğini belirler ve gerekli yönlendirmeyi gerçekleştirir.

Bu nedenle ilk yapmamız gereken işlem web.xml içerisinde DispatcherServlet’i tanımlamaktır.

XML
<?xml version="1.0" encoding="UTF-8"?>

<web-app
    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"
    version="2.5">

    <display-name>spring-mvc</display-name>

    <servlet>
        <servlet-name>spring</servlet-name>

        <servlet-class>
            org.springframework.web.servlet.DispatcherServlet
        </servlet-class>

        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>

        <servlet-name>spring</servlet-name>

        <url-pattern>*.html</url-pattern>

    </servlet-mapping>

</web-app>

Burada yaptığımız işlem oldukça basittir.

  • DispatcherServlet uygulamamızın giriş noktasıdır.
  • *.html ile biten tüm istekler Spring MVC tarafından karşılanacaktır.
  • Servlet uygulama açılırken yüklenmesi için load-on-startup değeri 1 olarak verilmiştir.

Artık uygulamaya gelen istekler doğrudan Spring Framework’e yönlendirilmektedir.


2. Spring Bean Konfigürasyonu

Spring, temel olarak Bean Container mantığı üzerine kuruludur.

DispatcherServlet çalışmaya başladığında varsayılan olarak aşağıdaki dosyayı arar.

XML
WEB-INF/spring-servlet.xml

Dosya ismine dikkat edin.

spring, web.xml içerisindeki <servlet-name> değeridir.

Spring otomatik olarak bunun sonuna -servlet.xml ekleyerek konfigürasyon dosyasını yükler.

Şimdi bu dosyayı oluşturalım.

XML
<?xml version="1.0" encoding="UTF-8"?>

<beans
    xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

    <bean
        name="/index.html"
        class="org.sample.controller.SampleController"/>

    <bean
        id="viewResolver"
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">

        <property
            name="viewClass"
            value="org.springframework.web.servlet.view.JstlView"/>

        <property
            name="prefix"
            value="/WEB-INF/jsp/"/>

        <property
            name="suffix"
            value=".jsp"/>

    </bean>

</beans>

Burada iki önemli tanım bulunmaktadır.

İlk bean tanımı şunu ifade eder:

Eğer /index.html adresine bir istek gelirse, bunu SampleController sınıfı karşılasın.

İkinci bean ise View Resolver tanımıdır.

Controller içerisinde yalnızca sayfa adını döndüreceğiz.

Örneğin;

Java
return new ModelAndView("index");

Spring bunu otomatik olarak aşağıdaki dosyaya çevirecektir.

Java
/WEB-INF/jsp/index.jsp

Bu işlem prefix ve suffix ayarları sayesinde yapılmaktadır.


3. Controller Oluşturma

Artık istekleri karşılayacak Controller sınıfımızı yazabiliriz.

Bu örnekte annotation yerine klasik Controller interface’ini kullanacağız.

Java
package org.sample.controller;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

public class SampleController implements Controller {

    @Override
    public ModelAndView handleRequest(
            HttpServletRequest request,
            HttpServletResponse response) throws Exception {

        Map<String, Object> model = new HashMap<String, Object>();

        model.put("now", new Date());

        return new ModelAndView(
                "index",
                "model",
                model
        );
    }

}

Bu sınıf içerisinde Spring, gelen isteği otomatik olarak handleRequest() metoduna yönlendirecektir.

Burada yaptığımız işlem oldukça basittir.

Önce modelimizi oluşturuyoruz.

Java
Map<String, Object> model = new HashMap<String, Object>();

Daha sonra mevcut tarihi modele ekliyoruz.

Java
model.put("now", new Date());

Son olarak da görüntülenecek sayfayı döndürüyoruz.

Java
return new ModelAndView("index", "model", model);

Buradaki "index" değeri dikkat çekicidir.

Biz yalnızca sayfa adını yazıyoruz.

Spring ise biraz önce tanımladığımız View Resolver sayesinde bunu aşağıdaki adrese dönüştürüyor.

Java
/WEB-INF/jsp/index.jsp

4. JSP Sayfası

Son olarak Controller’dan gelen modeli gösterecek JSP dosyamızı hazırlıyoruz.

WEB-INF/jsp/index.jsp
Java
<%@ page session="false" %>

<%@ taglib
    prefix="c"
    uri="http://java.sun.com/jsp/jstl/core" %>

<html>

<head>
    <title>Hello Spring MVC</title>
</head>

<body>

<h2>Hello Spring MVC</h2>

<p>

Current Time :

<strong>

<c:out value="${model.now}" />

</strong>

</p>

</body>

</html>

Burada dikkat edilmesi gereken tek nokta aşağıdaki satırdır.

Java
${model.now}

Controller içerisinde modele eklediğimiz

Java
model.put("now", new Date());

değeri artık JSP tarafından kullanılabilmektedir.


Sonuç

Bu örnekte Spring MVC’nin en temel çalışma mantığını incelemiş olduk.

İstek akışı şu şekilde gerçekleşmektedir.

Browser
      │
      ▼
DispatcherServlet
      │
      ▼
SampleController
      │
      ▼
ModelAndView
      │
      ▼
ViewResolver
      │
      ▼
index.jsp
      │
      ▼
Browser

Her ne kadar günümüzde Spring Boot ve annotation tabanlı geliştirme çok daha yaygın olsa da, Spring MVC’nin temelinde hâlâ aynı mimari bulunmaktadır. DispatcherServlet, Controller, Model, ViewResolver ve View kavramlarını iyi anlamak, modern Spring uygulamalarını öğrenirken de büyük kolaylık sağlayacaktır.

📝 Arşiv Notu

Bu yazı ilk olarak 2011 yılında hazırlanmıştır. Örnekler Spring Framework 2.5/3.x dönemindeki XML tabanlı Spring MVC yapısını anlatmaktadır. Günümüzde Spring Boot, annotation tabanlı konfigürasyon ve Java Configuration çok daha yaygın olarak kullanılmaktadır. Ancak DispatcherServlet, Controller, ViewResolver ve MVC mimarisinin temel çalışma mantığı günümüzde de aynıdır.

1 yorum

  1. çalışmanız guzel, paylaşım için tşk fakat hangi ayarlarda çalıştırılacağı anlatılmamış.