Spring MVC Form İşlemleri Form Validation @InitBinder Kullanımı

Spring MVC
Spring Dersleri

Spring MVC Dersleri‘ne devam ediyoruz.

Spring MVC ile arayüz işlemleri kullanarak form işlemlerinde doğabilecek hataları yönetme işleminin nasıl olduğunu inceleyeceğiz. Spring MVC ile yapacağımız projelerimizdeki entity beanlerimizdeki değişkenlerimize belirli kriter belirleyebiliriz.

Bir örnek ile açıklamaya çalışalım. Bir üye kayıt formu oluşturalım ve boş geçilemez olduğunu varsayarak valide etmeye çalışalım. Yazının sonunda bu projeyi Github sayfamdan indirebileceğiniz bağlantıyı bulabilirsiniz.

Projemiz bir maven projesi olacaktır. Bağımlılıklarımızı pom.xml imize ekleyelim.

 <dependencies>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>4.3.7.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>javax.servlet.jsp.jstl</groupId>
            <artifactId>javax.servlet.jsp.jstl-api</artifactId>
            <version>1.2.1</version>
        </dependency>
        <dependency>
            <groupId>taglibs</groupId>
            <artifactId>standard</artifactId>
            <version>1.1.2</version>
        </dependency>

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>javax.servlet.jsp-api</artifactId>
            <version>2.3.1</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>

Bağımlılıklarımızı ekledik.

Modelimizi oluşturalım. Bu modelimizde üye bilgilerini tutacağız.

public class User {

    private String name;
    private String surname;
    private String email;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSurname() {
        return surname;
    }

    public void setSurname(String surname) {
        this.surname = surname;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }


    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", surname='" + surname + '\'' +
                ", email='" + email + '\'' +
                '}';
    }
}

Modelimizi oluşturduk.

Şimdi yazımızın konusu olan valide etme işine girelim. Bir hata olduğunda vereceğimiz mesajları tutacağımız messeges.properties dosyası oluşturağız. bu dosya resources klasörünün içinde olmalı.

empty.name = Enter a valid name.
empty.surname = Enter a valid surname.
empty.email = Enter a valid empty.

Bu dosyanın içerisinde oluşturduğum format isteğinize göre değişebilir ama genellikle xxxx = bla bla şeklindedir. Beanlerimizden bu uyarılara xxx olarak erişeceğiz.

Şimdi User Validator isminde bir class oluşturalım ve hangi durumda hangi mesajın hangi değişkenimiz ile alakalı olduğunu belirtelim.

@Component
public class UserValidator implements Validator {


    public boolean supports(Class<?> aClass) {
        return User.class.equals(aClass);
    }

    public void validate(Object o, Errors errors) {

        ValidationUtils.rejectIfEmpty(errors, "name", "empty.name");
        ValidationUtils.rejectIfEmpty(errors, "surname", "empty.surname");
        ValidationUtils.rejectIfEmpty(errors, "email", "empty.email");

        User user = (User) o;

    }


}

User Validator classımızı Validator classını implement ettik. Validator classı org.springframework.validation paketi içerisindedir. Springin Validator özelliğinden faydalanacağız.

Validate classının Override etmemiz gereken iki adet metodu bulunmakta. Bunlar supports ve validate dir. Supports metodunda gelen class User classımız mı kontrol ediyoruz. User’den gelen bilgileri kontrol edeceğimiz için gelen doğru class mı ona bakmaktayız. Diğer metodumuz ise gelen hatalarda hangi değişkenimize gelirse ilgili hatanın gösterilmesini sağlayan metottur.

Kullanımı ise şu şekilde;

ValidationUtils.rejectIfEmpty(gelen_hata, "degisken", "hata_mesajı");

Gelecek olan hata ayrımlarını da bu sayede yapabilmekteyiz.

Şimdi User Controller’imizi oluşturalım.

@Controller
public class UserController {

    @Autowired
    private UserValidator userValidator;


    @InitBinder
    protected void initBinder(WebDataBinder binder) {
        binder.addValidators(userValidator);
    }

    @GetMapping("/")
    public String userForm(Locale locale, Model model) {
        model.addAttribute("user", new User());
        return "userForm";
    }

  
    @PostMapping("/saveUser")
    public String saveUser(@ModelAttribute("user") @Validated User user, BindingResult result,
                           Model model) {

        if (result.hasErrors()) {
            return "userForm";
        }
        return "success";
    }

}

Bu dersimizde kadar gördüğümüz Controller’dan farklı olan initBinder metodu ve anotasyonudur. Bu metod ve antasyon sayesinde kendi yaptığımız hata validasyonlarını kullanmamızı sağlamaktadır. Formumuzdan Post edeceğimiz metodumuzda User classımızın Validate işlemine bu metod üzerinden olması için @Validated anotasyonu kullanılmaktadır.

JSP Sayfalarımızı oluşturalım.

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
  pageEncoding="ISO-8859-1"%>
<%@taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
<!DOCTYPE html>
<html>
<head>
<title>Burak KUTBAY</title>
</head>
<body>
<center>
  <form:form action="saveUser" method="post" modelAttribute="user">
    <table>
      <tr>
        <th>Name</th>
        <td>
          <form:input path="name" /> 
          <form:errors path="name"/>
         </td>
      </tr> <tr>
        <th>Surname</th>
        <td>
          <form:input path="surname" />
          <form:errors path="surname"/>
         </td>
      </tr>
      <tr>
        <th>Email</th>
        <td>
            <form:input path="email" /> 
            <form:errors path="email"/>
         </td>
      </tr>
    </table>
    <button type="submit">Submit</button>
  </form:form>
</center>
</body>
</html>

Ve validate işlemi geçtikten sonra oluşacak sonuç sayfamızı oluşturalım.

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
  pageEncoding="ISO-8859-1"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Burak KUTBAY</title>
</head>
<body>
  <table>
    <tr>
      <th>Name</th>
      <td>${user.name}</td>
    </tr>
    <tr>
  </table>
  <th>Surname</th>
  <td>${user.surname}</td>
  </tr>
  <tr>
    <th>Email</th>
    <td>${user.email}</td>
  </tr>
</body>
</html>

Web Config classımızı oluşturalım.

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = { "com.burakkutbay.controller",
      "com.burakkutbay.validator" })
public class WebConfig extends WebMvcConfigurerAdapter{

   @Bean
   public InternalResourceViewResolver resolver() {
      InternalResourceViewResolver resolver = new InternalResourceViewResolver();
      resolver.setViewClass(JstlView.class);
      resolver.setPrefix("/WEB-INF/views/");
      resolver.setSuffix(".jsp");
      return resolver;
   }

   @Bean
   public MessageSource messageSource() {
      ResourceBundleMessageSource source = new ResourceBundleMessageSource();
      source.setBasename("messages");
      return source;
   }
}

Uygulamamızı ayağa kaldıracak Java classımızı oluşturalımç

package com.burakkutbay.config;

import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;


public class App extends AbstractAnnotationConfigDispatcherServletInitializer {

   @Override
   protected Class<?>[] getRootConfigClasses() {
      return new Class[] {};
   }

   @Override
   protected Class<?>[] getServletConfigClasses() {
      return new Class[] { WebConfig.class };
   }

   @Override
   protected String[] getServletMappings() {
      return new String[] { "/" };
   }
}

Ve çalıştıralım. Sonuç olarak submit butonuna basalım.

Spring hatayı yakaladı ve bizim oluşturduğumuz hata mesajı gözüktü.


Projenin Kaynak Kodlarını Github Üzerinden Görünlüte / İndir 

Önceki Ders: Form İşlemleri ModelAttribute Kullanımı Spring MVC Dersleri Sonraki Ders:

 

Leave a Reply

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Burak KUTBAY 2010 - 2019
%d blogcu bunu beğendi: