ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 학원 day87. 폼 입력값 전달하기, 예외처리
    기록 2023. 1. 5. 17:03

     

    1.컨트롤러, 서비스, 매퍼 연동하기

    2.폼입력값을 전달받는 방법 (클래스를 통해서)

    3.예외처리하는 방법 


    Web Project Settings에서 context root / 로 바꿔주기

    tags.jsp
    web.xml

    web.xml에 위와 같은 코드 추가하기. 

    모든 jsp의 첫부분에 tag.jsp가 포함되는 것이다.

    navbar.jsp
    home.jsp

    c:set을 이용해서 속성을 추가한다. PageContext객체에 menu라는 이름으로 home이라는 값을 담았다.

    navbar.jsp는 home.jsp에 코드가 그대로 들어가기 때문에 menu라는 이름으로 값을 찾을 수 있는 것이다.

    * navbar.jsp는 지정된 위치가 있기 때문에 tags.jsp처럼 넣지 않는다.

     

    매퍼는 테이블당 하나씩 만드는게 편한데 

    서비스는 UserService랑 UserRoleService를 따로 만들 필요 없다. 

    UserService에 종속되어 있으니까

     

    화면에서 제공하는 버튼, 메뉴마다 요청 핸들러 메소드가 하나 있다고 생각하면 된다. 스크립트로 처리되는건 필요없겠지만, 서버쪽으로 요청이 넘어가는 건 요청핸들러 메소드가 있다.

    요청핸들러 메소드가 있으면 서비스가 하나 있다고 생각하면 된다.  home처럼 페이지만 보여주는 경우는 없는경우도 있지만

    일반적으로 요청핸들러메소드는 반환값이 String이다.

    HomeController를 제외한 나머지 Controller는 보통  앞에 @RequestMapping("")이 있다.

    RequestMapping과 GetMapping의 URL이 더해져서 URL이 만들어진다.

    get방식의 요청핸들러메소드라서 오류

    post방식의 요청핸들러메소드를 만들어줘야 한다.

    input, select, check박스의 name하고 똑같은 이름으로 매개변수에 변수를 넣으면 값이 들어온다.

    값이 여러개일 경우, 배열로 적으면 된다. String[] roleName

    값이 많을 경우, 따로 클래스를 만들어준다.

     

    com.sample.web.request라는 폴더에 UserRegisterForm 클래스를 만든다.
    입력폼의 name하고 똑같이 멤버변수를 적는다.

    ~Form, ~Request, ~Command 등의 이름을 보통 붙인다. 

    사용자가 웹 화면에 입력하는 값을 한번에 전달받기 위해 사용된다.  

    스프링은 매개변수에 클래스를 적어놓으면 폼입력값 담을 클래스라고 생각한다. 
    클래스 안에 있는 멤버변수를 조사한다.

    User는 테이블을 표현하는거지 입력폼을 표현하는게 아니다.
    그리고 User는 접속권한 정보를 담는게 없다.
    입력폼하고 닮게, 온전히 나타내는 객체를 만들고 싶었던 것이다.
    클래스에 어노테이션을 붙여서 입력폼의 유효성체크도 담을 수 있다. (@NotBlank, @Length(min="6", max="20"))

     

    Q. vo객체나 UserRegisterForm같은 객체 생성할 때 기본생성자도 꼭 작성해줘야 하나요?

    A. 안만들어도 된다. 다만, 다른생성자를 만들면 기본생성자가 안만들어진다. 그래서 기본생성자 안만들고 다른 생성자 만들까봐 기본생성자도 만들어주는 것이다.

    한글 인코딩처리를 지원하는 필터 설정을 web.xml에 적어준다.

     

    위의 코드를 아래 코드처럼 작성할 수 있다.

    User user = new User();
    BeanUtils.copyProperties(userRegisterForm, user);

    userRegisterForm과 user의 변수명이 같은건 userRegisterForm에 있는게 user로 복사된다. (타입도 일치해야 함)

    변수명이 많을 때는 BeanUtils를 사용하면 좋지만,

    변수명이 다를 경우, 복사되지 않는다.

    따라서, 변수가 적을 때는 아래처럼 작성하면 된다.

    UserRole userRole = new UserRole(userRegisterForm.getId(), userRegisterForm.getRoleName());

    userRoleMapper.insertUserRole(userRole);

    또는 set으로 값을 넣는다.  (예시 -> post.setNo(postModifyForm.getPostNo());)

     

    또는 아래와 같이 표현할 수 있다.

    오류가 발생하면 무조건 오류페이지로 보내는 방법

     

    스프링 MVC의 예외처리

     

    @ControllerAdvice 어노테이션

        - 모든 컨트롤러에서 공통으로 사용하는 기능이 구현된 클래스에 적용하는 어노테이션이다.

        - 대표적인 공통기능

           * 예외처리

           * 파라미터값 변환 (서버에 값을 보내줄건데 입력필드에 입력하는 것중 숫자는 int나 long은 자동으로 바꿔주는데 날짜는 자동으로 변환되지 않는다. 그래서 파라미터값 변환을 해줘야 한다. 하지만 어노테이션으로 변환하는 경우가 많음)

     

    @ExceptionHandler 어노테이션

         - 예외처리를 담당하는 핸들러 메소드에 적용하는 어노테이션이다.

         - 예시

             @ExceptionHandler(예외클래스.class)

             public String handle 예외클래스(예외클래스 변수명) {

                  return "오류페이지이름"

             }

             * 컨트롤러에서 요청을 처리하다가 @ExceptionHandler에 지정한 예외가 발생하면 예외처리 메소드가 자동으로 실행된다. 

             * 예외처리 메소드는 매개변수로 발생한 예외처리를 전달 받을 수 있다.

             * 예외처리 메소드가 반환하는 오류페이지(JSP)로 사용자의 요청을 내부이동시킨다.

         - 예외처리 규칙

             * 발생한 예외클래스와 일치하는 @ExceptionHandler(예외클래스.class) 정의가 있으면 해당 예외처리 메소드가 실행된다. 

             * 발생한 예외클래스와 일치하는 @ExceptionHandler(예외클래스.class) 정의가 없고, 

                                                                 @ExceptionHandler(부모예외클래스.class) 정의가 있으면 해당 예외처리 메소드가 실행된다.  

            * 발생한 예외클래스와 일치하는 @ExceptionHandler(예외클래스.class) 정의도 있고,
                                                                @ExceptionHandler(부모예외클래스.class) 정의도 있으면 더 구체적인 예외클래스가 지정된 예외처리 메소드가 실행된다.

     

     

    댓글

Designed by Tistory.