본문 바로가기
백엔드/Spring Framework

Web Application(2) / 화면에서 전송한 데이터 자바로 받기

by maverick11471 2024. 7. 15.

2024.07.15 - [분류 전체보기] - Web Application(1) / 화면에서 자바로 데이터 전송(1. Form Data) / 요청 url 매핑 방식

 

Web Application(1) / 화면에서 자바로 데이터 전송(1. Form Data) / 요청 url 매핑 방식

[과제] 1. NameTelController 에서 '데이터 전송방식' 구현 (form submit 방식) 2. NAME_TEL 테이블 생성 3. name-tel.jsp 생성 (요청 url 매핑 방식 구현)  1. Spring Application 구동WAS 구동 시 web.xml 읽은 후 ServletConta

maverick11471.tistory.com

 

이전에 화면단으로 url을 맵핑하여 get, post, request 방식으로 화면을 구성해 보았다.

 

이번에는 화면에서 보내는 데이터를 받는 방법을 알아보겠다.

 

[과제]

1. NameTelController 수정 (데이터 받는 여러가지 방식 확인)  

2. name-tel.jsp 수정

 1. 화면단에서 전송한 데이터 받기
 1-1. HttpServletRequest 객체를 통해서 파라미터 받기
 1-2. @RequestParam 어노테이션을 통한 데이터 받기
 1-3. @RequestParam으로 전송된 데이터 모두를 Map 객체에 매핑
 1-4. Command 객체와 @ModelAttribute 어노테이션을 이용한 데이터 받기

< 다음 시간에 >
 2. 자바에서 화면단으로 데이터 전송
 2-1. Model 객체를 통한 데이터 전송, Model 객체의 addAttribute(키, 밸류)로 데이터 매핑해서 화면단으로 전송
 2-2. HttpServletRequest 객체를 통한 데이터 전송
 2-3. HttpSession 객체를 이용한 데이터 전송

 


[기본 공통사항]

 - NameTelController

@Controller
public class NameTelController {
    private NameTelService nameTelService;

    @Autowired
    public NameTelController(NameTelService nameTelService) {
        this.nameTelService = nameTelService;
    }

 1-1. HttpServletRequest 객체를 통해서 파라미터 받기

        ① NameTelController 수정(Command 객체)

    // Controller 객체의 메소드의 파라미터들은 객체를 생성하는 특수한 기능을 하게 되는데
    // 이 기능으로 만들어진 객체를 Command 객체라고 부른다.
    @GetMapping("/name-tel.do")
    public String nameTelGet(HttpServletRequest request) {
        System.out.println("name: " + request.getParameter("name"));
        System.out.println("tel: " + request.getParameter("tel"));
        return "name-tel";
    }

 

         ② name-tel.jsp 수정 : get 방식으로 수정

    <form action="/name-tel.do" method="get">
        <input type="text" name="name">
        <input type="text" name="tel">
        <input type="submit" value="전송">
    </form>

 

 - 주소창에 입력한 값이 쿼리스트링식으로 구현

    * 쿼리스트링 표현식: 주소창?key값=value&key값2=value2....

 


 1-2. @RequestParam 어노테이션을 통한 데이터 받기

        ① NameTelController 수정

            - 'required = false' 로 설정하지 않으면 오류가 난다. (이유: @RequiredParam의 required 속성이 'true'가

              기본값이기 때문에 데이터를 전송하지 않으면 에러 발생)

            - 'defaultValue = "test"' 는 기존 console창에 null 값이 나오는데 이를 test로 바꾸는 기능이다.

@GetMapping("/name-tel.do")
public String nameTelGet(@RequestParam(value = "name", required = false, defaultValue = "test") String n,
                         @RequestParam(value = "tel", required = false, defaultValue = "test") String t,
                         HttpServletRequest request) {
    System.out.println("name: " + n);
    System.out.println("tel: " + t);

    return "name-tel";
}

 

       ② name-tel.jsp 수정 : 동일

 

 

 

 

그런데 parameter가 지금은 2개라 괜찮지만, 10개, 20개 등..  너무 많아지면 일일이 작성하기가 너무 귀찮다....

 

이를 위해 1-3번의 방법이 시행된다.

 


 1-3. @RequestParam으로 전송된 데이터 모두를 Map 객체에 매핑

 

      ① NameTelController 수정

    // Map<String, String> ==> 지정했을 때 화면에서 넘겨준 키&밸류 형식의 데이터가 그대로 Map에 매핑이된다.
    @GetMapping("/name-tel.do")
    // @RequestParam의 required 속성은 true가 기본값이라 데이터를 전송하지 않으면 에러가 발생한다.
    public String nameTelGet(@RequestParam Map<String, String> paramMap) {
        System.out.println("name: " + paramMap.get("name"));
        System.out.println("tel: " + paramMap.get("tel"));
        return "name-tel";
    }

 

       ② name-tel.jsp 수정 : 동일


 1-4. Command 객체와 @ModelAttribute 어노테이션을 이용한 데이터 받기

 

        ① NameTelController 수정

    // Controller 객체의 메소드의 매개변수로 클래스 타입의 변수를 선언하면 자동으로 객체를 생성하고
    // 전송된 데이터의 키와 클래스의 멤버변수명이 같으면 자동으로 해당 변수의 setter 메소드가 동작해서
    // 전송된 데이터의 밸류 값이 멤버변수에 담긴다.
    // setter 메소드가 구현되어 있지 않으면 값이 담기지 않는다.
    // @ModelAttribute 어노테이션은 생략할 수 있다.
    // 조회 기능
    @GetMapping("/name-tel.do")
    public String nameTelPost(@ModelAttribute NameTelDto nameTelDto) {
        System.out.println("name: " + nameTelDto.getName());
        System.out.println("tel: " + nameTelDto.getTel());
        return "name-tel";
    }

 

 - NameTelDto : setter 메소드 구현되어 있음

package com.bit.springboard.dto;

public class NameTelDto {
    private String name;
    private String tel;

    public String getName() {
        return name;
    }

    public String getTel() {
        return tel;
    }

    public void setName(String name) {
        System.out.println("setName 메소드 실행");
        this.name = name;
    }

    public void setTel(String tel) {
        System.out.println("setTel 메소드 실행");
        this.tel = tel;
    }
}

 

       ② name-tel.jsp 수정 : 동일