### Spring MVC Mimarisi
Spring MVC (Model-View-Controller), web uygulamaları geliştirmek için kullanılan bir mimaridir. Bu mimari, uygulamanın farklı bileşenlerini ayırarak modüler ve esnek bir yapı sağlar.
#### Spring MVC Bileşenleri
1. **Model**: Uygulama verilerini temsil eder ve genellikle bir Java sınıfı veya POJO (Plain Old Java Object) olarak tanımlanır. Model, veritabanı ile etkileşimde bulunur ve uygulama mantığını içerir.
2. **View**: Kullanıcı arayüzünü temsil eder ve kullanıcıya verileri gösterir. Spring MVC'de bu genellikle JSP, Thymeleaf veya başka bir şablon motoru kullanılarak yapılır.
3. **Controller**: Kullanıcı isteklerini alır, iş mantığını çağırır ve uygun verileri görünüme iletir. Controller, istekleri işleyip uygun yanıtları üretir.
#### Spring MVC Akış Şeması
1. **İstek (Request)**: Kullanıcı bir HTTP isteği gönderir.
2. **DispatcherServlet**: Gelen isteği alır ve uygun `Controller`'a yönlendirir.
3. **Controller**: İsteği işler, gerekli iş mantığını uygular ve model verisini oluşturur.
4. **View Resolver**: Controller tarafından döndürülen model verilerini uygun görünüme yönlendirir.
5. **View**: Veriyi kullanıcıya gösterir.
6. **Yanıt (Response)**: Kullanıcıya uygun yanıt döner.
---
### Spring MVC ile Web Uygulaması Geliştirme
Spring MVC ile web uygulaması geliştirmek için aşağıdaki adımları takip edebilirsiniz:
1. **Bağımlılıkların Eklenmesi**
**`pom.xml`** (Maven)
```xml
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
</dependencies>
```
2. **Model Sınıfı**
**`User.java`**
```java
public class User {
private String name;
private String email;
// Getter ve Setter metodları
}
```
3. **Controller Sınıfı**
**`UserController.java`**
```java
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
public class UserController {
@GetMapping("/user")
public String showForm(Model model) {
model.addAttribute("user", new User());
return "userForm";
}
@PostMapping("/user")
public String submitForm(User user, Model model) {
model.addAttribute("user", user);
return "userResult";
}
}
```
- **`@Controller`**: Bu sınıfın bir Spring MVC Controller olduğunu belirtir.
- **`@GetMapping`**: HTTP GET isteklerini işler.
- **`@PostMapping`**: HTTP POST isteklerini işler.
- **`Model`**: Controller'dan View'e veri geçişi sağlar.
4. **View Şablonları**
**`src/main/resources/templates/userForm.html`** (Thymeleaf ile)
```html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>User Form</title>
</head>
<body>
<form th:action="@{/user}" th:object="${user}" method="post">
<label>Name:</label>
<input type="text" th:field="*{name}" />
<label>Email:</label>
<input type="text" th:field="*{email}" />
<button type="submit">Submit</button>
</form>
</body>
</html>
```
**`src/main/resources/templates/userResult.html`**
```html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>User Result</title>
</head>
<body>
<h1>User Information</h1>
<p>Name: <span th:text="${user.name}"></span></p>
<p>Email: <span th:text="${user.email}"></span></p>
</body>
</html>
```
- **`th:object`**: Formun bağlı olduğu model nesnesini belirtir.
- **`th:field`**: Form alanlarını model özelliği ile bağlar.
- **`th:text`**: Model verisini View'e yerleştirir.
---
### Form İşlemleri ve Validasyon
Spring MVC, form işleme ve validasyon işlemlerini destekler. Validasyon için genellikle JSR-303/JSR-380 (Bean Validation) standardı kullanılır.
#### Form Validasyon
1. **Model Sınıfında Validasyon Anotasyonları**
**`User.java`**
```java
import javax.validation.constraints.Email;
import javax.validation.constraints.NotEmpty;
public class User {
@NotEmpty(message = "Name is required")
private String name;
@Email(message = "Email should be valid")
private String email;
// Getter ve Setter metodları
}
```
- **`@NotEmpty`**: Alanın boş olmamasını sağlar.
- **`@Email`**: Alanın geçerli bir e-posta adresi olmasını sağlar.
2. **Controller'da Validasyon**
**`UserController.java`**
```java
import org.springframework.validation.BindingResult;
import javax.validation.Valid;
@Controller
public class UserController {
@GetMapping("/user")
public String showForm(Model model) {
model.addAttribute("user", new User());
return "userForm";
}
@PostMapping("/user")
public String submitForm(@Valid User user, BindingResult result, Model model) {
if (result.hasErrors()) {
return "userForm";
}
model.addAttribute("user", user);
return "userResult";
}
}
```
- **`@Valid`**: Model nesnesini doğrular.
- **`BindingResult`**: Validasyon hatalarını içerir.
3. **Hata Mesajları**
**`src/main/resources/templates/userForm.html`**
```html
<form th:action="@{/user}" th:object="${user}" method="post">
<label>Name:</label>
<input type="text" th:field="*{name}" />
<span th:if="${#fields.hasErrors('name')}" th:errors="*{name}"></span>
<label>Email:</label>
<input type="text" th:field="*{email}" />
<span th:if="${#fields.hasErrors('email')}" th:errors="*{email}"></span>
<button type="submit">Submit</button>
</form>
```
- **`th:if`**: Hata mesajını görüntüler.
- **`th:errors`**: Belirli bir alan için validasyon hatalarını gösterir.
---
### Özet
Spring MVC, web uygulamaları geliştirmek için kullanışlı bir mimaridir ve model, view, ve controller bileşenleri ile çalışır. Spring MVC ile form işlemleri ve validasyon, kullanıcıdan alınan verilerin doğruluğunu sağlamak için önemlidir. Spring Boot ve Thymeleaf gibi araçlar, bu süreci daha da kolaylaştırır. Bu bilgiler, Spring MVC ile etkili web uygulamaları geliştirmenize yardımcı olacaktır.