Spring MVC’ye Giriş
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 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.
DispatcherServletuygulamamızın giriş noktasıdır.*.htmlile biten tüm istekler Spring MVC tarafından karşılanacaktır.- Servlet uygulama açılırken yüklenmesi için
load-on-startupdeğeri1olarak 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.
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 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.htmladresine bir istek gelirse, bunuSampleControllersı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;
return new ModelAndView("index");
Spring bunu otomatik olarak aşağıdaki dosyaya çevirecektir.
/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.
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.
Map<String, Object> model = new HashMap<String, Object>();
Daha sonra mevcut tarihi modele ekliyoruz.
model.put("now", new Date());
Son olarak da görüntülenecek sayfayı döndürüyoruz.
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.
/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
<%@ 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.
${model.now}
Controller içerisinde modele eklediğimiz
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.
çalışmanız guzel, paylaşım için tşk fakat hangi ayarlarda çalıştırılacağı anlatılmamış.