ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 에러 메시지 커스터마이징
    웹페이지 제작을 위한 스프링공부 2020. 5. 12. 13:47

    에러 메시지

    유효성 검사에서 오류가 있다고 판단되는 항목에 대해서 jsp에서 메시지를 출력 하였습니다

     

    우리가 출력한 메시지는 JSR-303에서 정의한 메시지가 그대로 나오는 것이며 우리가 설정한 문자열은 아닙니다.

     

    JSR-303 과 Hibernate에서 제공하는 어노테이션중 일부는 새로운 메시지를 셋팅 할 수 있고 일부를 셋팅하지 못합니다.

     

    properties를 이용한 메시지 설정

    유효성 검사를 통과하지 못하며 jsp에 오류 관련된 정보가 전달됩니다

     

    이때 codes[0]으로 값을 가져오면 다음 양식으로 문자열을 가져올 수 있습니다

     

    에러종류.빈이름.프로퍼티이름

     

    우리가 properties 파일에 위와 같은 양식의 이름으로 메시지를 등록해주면 properties 파일에 작성한 문자열을 가져와 출력할 수 있고 다국어 처리까지 가능해집니다.

     

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%@ taglib prefix='c' uri="http://java.sun.com/jsp/jstl/core" %>
    <%@ taglib prefix='spring' uri="http://www.springframework.org/tags" %>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    	<h1>input_data</h1>
    	<form action='input_pro' method='post'>
    		data1 : <input type='text' name='data1'/><br/>
    		<spring:hasBindErrors name="dataBean1">
    			<c:if test="${errors.hasFieldErrors('data1') }">
    				${errors.getFieldError('data1').codes[0] }<br/>
    			</c:if>
    		</spring:hasBindErrors>
    		data2 : <input type='text' name='data2'/><br/>
    		<spring:hasBindErrors name="dataBean1">
    			<c:if test="${errors.hasFieldErrors('data2') }">
    				${errors.getFieldError('data2').codes[0] }<br/>
    			</c:if>
    		</spring:hasBindErrors>
    		<button type='submit'>확인</button>
    	</form>
    </body>
    </html>
    

     

    error내용에 codes를 넣어 에러가 발생한 에러종류.빈이름.프로퍼티이름를 출력해보았다

     

    다음 에러 문자열을 jsp에서 받아내서 사용할 수 있기떄문에 이 이름으로 property값을 등록하고 그것을 message로 등록해주면 jsp에서 사용가능하다

     

    Size.dataBean1.data1=data1은 2~10글자를 입력해야됩니다
    Max.dataBean1.data2=data2는 100이하의 정수를 넣어햐 합니다

    이렇게 Size.dataBean1.data1, Max.dataBean1.data2=data2 두개의 문자열을 다음과 같이 정의해놓는다. 이렇게 함으로써 다음과 같은 문자열을 오른쪽의 값이 출력된다.

     

     

     

     

    하지만 이방법은 입력한 데이터들을 다 새로고침을 함으로써 기존에 제대로 입력한 값들도 다 날라간다

     

    이제 그 데이터들을 유지해보도록 하겠습니다

     

    FORM태그를 활용함(spring mvc를 이용하여 사용자 입력값에 대한 유효성검사를 시행)

     

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%@ taglib prefix='c' uri="http://java.sun.com/jsp/jstl/core" %>
    <%@ taglib prefix='spring' uri="http://www.springframework.org/tags" %>
    <%@ taglib prefix='form' uri="http://www.springframework.org/tags/form" %>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    	<h1>input_data</h1>
    	
    	<form:form action="input_pro" modelAttribute="dataBean1" method="post">
    		data1:<form:input path="data1" type='text'/></br> <!-- dataBean1의 data1이라는 변수에 들어가있는 값을 여기 input태그의 value에 넣어줌 -->
    		
    		data2:<form:input path="data2" type='text'/></br> <!-- dataBean1의 data2이라는 변수에 들어가있는 값을 여기 input태그의 value에 넣어줌 -->
    		<form:button type="submit">확인</form:button>
    	</form:form>
    	
    </body>
    </html>
    
    
    

     

     

     

    다음과 같은 에러 발생 이유는

    package kr.co.softcampus.controller;
    
    import javax.validation.Valid;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.validation.BindingResult;
    import org.springframework.validation.ObjectError;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PostMapping;
    
    import kr.co.softcampus.beans.DataBean1;
    
    @Controller
    public class TestController {
    	
    	@GetMapping("/input_data")
    	public String input_data() {
    		
    		return "input_data";
    	}
    	
    	@PostMapping("/input_pro")
    	public String input_pro(@Valid DataBean1 dataBean1, BindingResult result) {
    		
    		
    		
    		// 유효성 검사에서 위반된 부분이 있다면..
    		if(result.hasErrors()) {
    			// 유효성 위반 결과들 모두 가져온다.
    		
    			
    			return "input_data";
    		}
    		
    		return "input_success";
    	}
    }
    
    

     input_data메소드에서 input_data를 반환하는데 input_data에는 dataBean1의 데이터가 들어가있지 않기때문에 값을 불러올 수 가없음.

     

    package kr.co.softcampus.controller;
    
    import javax.validation.Valid;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.validation.BindingResult;
    import org.springframework.validation.ObjectError;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PostMapping;
    
    import kr.co.softcampus.beans.DataBean1;
    
    @Controller
    public class TestController {
    	
    	@GetMapping("/input_data")
    	public String input_data(DataBean1 dataBean1) {
    		
    		return "input_data";
    	}
    	
    	@PostMapping("/input_pro")
    	public String input_pro(@Valid DataBean1 dataBean1, BindingResult result) {
    		
    		
    		
    		// 유효성 검사에서 위반된 부분이 있다면..
    		if(result.hasErrors()) {
    			// 유효성 위반 결과들 모두 가져온다.
    		
    			
    			return "input_data";
    		}
    		
    		return "input_success";
    	}
    }
    

     

    다음과 같이 수정후 결과 출력시 입력한 데이터값이 새로고침 현상후 삭제되지않고 계속 유지되는것을 볼 수 있음

    '웹페이지 제작을 위한 스프링공부' 카테고리의 다른 글

    JSR-308  (0) 2020.05.12
    JSR-303  (0) 2020.05.12
    유효성 검사  (0) 2020.05.10
    message  (0) 2020.05.09
    properties  (0) 2020.05.09
Designed by Tistory.