Spring MVC Validation İşlemleri

23-01-2015
Spring MVC'de validator kullanmak için gereken adımlar aşağıdaki gibidir:

  1. Maven projesinde resources klasöründe .properties isimli bir dosya yaratılır.
  2. Model sınıfında @NotEmpty, @Range gibi annotasyonlar kullanılır.
  3. Controller sınıfında @Valid annotasyonu ve BindingResult sınıfı kullanılır.
  4. Spring konfigürasyon dosyasında .properties isimli mesaj dosyasını tanıtmak için ResourceBundleMessageSource bean eklenir
  5. Hibernate Validator jar dosyasını projeye dahil etmek
  6. Form Sayfası

Bu adımları sırasıyla yapalım:

messages.properties İsimli Dosya Yaratılması

NotEmpty.admin.name = Ad kısmı boş bırakalımaz!
NotEmpty.admin.surname = Soyad kısmı boş bırakılamaz

Varsayılan olarak @NotEmpty annotasyonu "may not be empty" mesajını dönderirken, @Range annotasyonu "must be between 1 and 150" mesajını dönderir. messages.properties dosyası sayesinde bu değerleri override etmiş oluruz.

Model Sınıfı

@Entity
public class Admin {
    @Id
    @GeneratedValue(strategy= GenerationType.AUTO)
    private int adminId;
    @NotEmpty
    @Range(min = 4, max =20)
    private String username;
    @NotEmpty
    @Range(min = 4, max =20)
    private String password;
    @NotEmpty
    @Range(min = 3, max =60)
    @Pattern(regexp="[\\p{L}{3,}]", message="Ad sadece harflerden oluşabilir")
    private String name;
    @NotEmpty
    @Range(min = 3, max =60)
    @Pattern(regexp="[\\p{L}{3,}]", message="Soyad sadece harflerden oluşabilir")
    private String surname;
    @NotEmpty
    @Range(min = 6, max =254)
    private String email;
    //getter ve setter metodlari cikarildi
}

@NotEmpty annotasyonu ile bu alanın boş bırakılamayacağını ifade ederiz.

@Range annotasyonu ile minimum ve maksimum karakter sayılarını ifade ederiz.

@Pattern annotasyonu ile dilediğimiz regex ifadesini yazarak istediğimiz kontrolün yapılmasını sağlayabiliriz. Örneğin yukarıdaki model sınıfında [\\p{L}{3,}] regex ifadesi ile unicode harflerinin kullanılacağını belirttik. Çünkü Türkçe karakterleri unicode karakterleridir.

Not: Pattern annotasyonu ve diğer annotasyonlarda message attribute'si kullanılabilir. Bu attribute ile messages.properties dosyasının yaptığı işlemi yapmış oluruz, yani varsayılan hata mesajlarını override etmiş oluruz.

Controller Sınıfı

@Controller
public class AdminController {
    @ExceptionHandler(CustomGenericException.class)
    @RequestMapping(value = "home/addAdmin")
    public ModelAndView addAdmin(
    @RequestParam(value = "passwordAgain",required = false) String passwordAgain,
    @ModelAttribute("admin") @Valid Admin admin, BindingResult result) {
        ModelAndView modelAndView=new ModelAndView("/admin/home/addAdmin");
        if(admin!=null &&result.hasErrors()){
            
            adminService.add(admin);
            String message="Yeni kullanıcı başarıyla eklendi";
            modelAndView.addObject("admin",admin);
            modelAndView.addObject("message",message);
        }else{
            modelAndView.addObject("admin",new Admin());
            modelAndView.addObject("message","");
        }
        
        return modelAndView;
    }
}

7. satırda @Valid annotasyonu ile BindingResult sınıfının kullanım şekli gösterilmiştir.
9. satırda BindingResult sınıfının hasErrors() metodu kullanılarak form uygulamasında hata olup olmadığı kontrol edilmiştir.

ResourceBundleMessageSource Sınıfı

Aşağıdaki gibi spring konfigürasyon dosyasında bu sınıfı kullanarak messages.properties dosyasının bulunduğu path belirtilir:
<!--  messages.properties dosyasının baglanmasi-->
<bean class="org.springframework.context.support.ResourceBundleMessageSource"
      id="messageSource">
    <property name="basename" value="messages" />
</bean>

Hibernate Validator Jar Dosyasını Eklemek

Hibernate validator dependency'i maven projemize dahil etmek için aşağıdaki dependency kullanılır:
<!--Hibernate validator-->
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>5.1.3.Final</version>
</dependency>

Form Sayfası

<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
 <style type="text/css">
    .error {
      color: #ff0000;
    }

    .error-block {
      color: #000;
      background-color: #ffEEEE;
      border: 3px solid #ff0000;
      padding: 8px;
      margin: 16px;
    }
  </style>
</head>
<body>
<h2>Yönetici Ekleme Sayfası</h2>

<form:form method="POST" commandName="admin">
  <form:errors path="*" cssClass="error-block" element="div" />
  <table>
    <tr>
      <td>Ad :</td>
     <td><form:input path="name" /></td>
      <td><form:errors path="name" cssClass="error" /></td>
    </tr>
    <tr>
      <td>Soyad :</td>
      <td><form:input path="surname" /></td>
      <td><form:errors path="surname" cssClass="error" /></td>
   </tr>
    <tr>
      <td colspan="3"><input type="submit" /></td>
   </tr>
  </table>
</form:form>

</body>
</html>
23. satırdaki <form:errors> elementindeki path attribute'sinin aldığı değer sayesinde hataların topluca yazdırılmasını sağlarız.

Sonuç

Bu yazıda Spring MVC'de, Hibernate Form Validator kullanarak form sayfalarında validator kullanımının nasıl yapıldığından bahsettik. Validator işlemlerini if-else yapıları ile de yapmak mümkündür. Fakat bu tarz kontrol işlemlerinde kod karmaşıklaşır. Bunun yerine form validator kütüphanesini kullanmak en mantıklı yoldur.

© 2019 Tüm Hakları Saklıdır. Codesenior.COM