본문 바로가기
Spring

230201 Spring @Controller, @RequestMapping 2와 @RequestParam

요청 파라미터 (request)

메서드에서 파라미터 값의 처리
스프링에서는 메서드 안에서 사용할 기능을 매개변수로 선언해서 사용한다.

전통적 방식

-HttpServletRequest request을 사용하려면 단순히 매개변수에 넣기만 하면 됨.

@RequestMapping(value="/doAction", method = RequestMethod.POST)
public String doAction(HttpServletRequest request) {
	//name파람
	String name=request.getParameter("name");
	//age파람
	String age=request.getParameter("age");
	//inter-checkbox
	String[] inter=request.getParameterValues("inter");

	System.out.println(name);
	System.out.println(age);
	System.out.println(Arrays.toString(inter));

	return "request/ex02_ok";
}

어노테이션 : (@RequestParam("id") String id) 

-폼태그의 id값을 속성으로 받는다. 마찬가지로 매개변수에 넣기만 하면 됨.
-반드시 넘어와야 하는 값에 사용. required=true가 기본이라 값이 없으면 화면이 넘어가지 않음.
-단일값에 적용해서 사용할 때 좋다.
-자동형변환을 해준다는 장점이 있다. 

단, @RequestParam은 아무런 값을 넘기지 않으면, 화면으로 이동하지 않는다.
반드시 필수로 전달해야 함을 기본으로 한다. 자동으로 잘못된 요청이라고 거절하는 것.

@RequestParam의 추가 속성

  1. required- 해당 파라미터가 필수가 아닌 경우 지정한다. 기본값이 required-true다. 이걸 false로 하면 공백이나 null값이라도 전달하지만,
    에러가 발생할 확률이 높아진다.(넘어오는것에 .을 찍어 사용하는 등(객체면 null이 되는데 이때 NullPointException이 발생))
  2. defaultValue-required가 false일 때 기본값을 설정해준다.
    ->에러발생을 막을 수 있음 
@RequestMapping("/doAction")
public String doAction(@RequestParam(value="name",required=false) String name
		,@RequestParam("age") int age
		,@RequestParam(value="inter", required=false, defaultValue = "") List<String> inter) {
	
	//requestParam은 공백과 null데이터가 전달되면 요청을 거절하게 됩니다.
	//필수가 아닌 파라미터는 required=false속성을 지정하면 됩니다.
	//필수가 아닌 파라미터인 경우에는 null or ""을 지정하게 되는데 defaultValue으로 기본값을 줄 수 있다.
	
	
	
	System.out.println(name);
	System.out.println(age);
	System.out.println(inter.toString());
	return "request/ex02_ok";
}

VO나 DTO 객체

폼 태그의 값을 받아 처리할 수 있는 Class생성
메서드 매개변수에 그냥 적어주면 됨.
MemberVO vo를 그냥 적으면 된다.

단,getter setter가 있으니 변수명을 폼태그의 이름들과 동일하게 만든다.

 

@RequestMapping("/doAction")
public String doAction(ReqVO vo) {
	System.out.println(vo.toString());
	return "request/ex02_ok";
}

 


ex02.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	ex02화면
	
	<form action="doAction" method="post">
		이름:<input type="text" name="name" />
		나이:<input type="number" name="age"/>
		
		<input type="checkbox" name="inter" value="1" />java
		<input type="checkbox" name="inter" value="2" />spring
		<input type="checkbox" name="inter" value="3" />boot
		
		<input type="submit" value="확인"/>
	</form>
	
</body>
</html>

 

 

 

RequestController.java

package com.simple.controller;

import java.util.Arrays;
import java.util.List;

import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import com.simple.command.ReqVO;

@Controller
@RequestMapping("/request") //메서드 앞에 공통으로 들어가는 요청경로
public class RequestController {

	//ex02화면요청
	@RequestMapping("/ex02")
	public String ex02() {
		return "request/ex02";
	}
	
	//1st
//	@RequestMapping(value="/doAction", method = RequestMethod.POST)
//	public String doAction(HttpServletRequest request) {
//		//name파람
//		String name=request.getParameter("name");
//		//age파람
//		String age=request.getParameter("age");
//		//inter-checkbox
//		String[] inter=request.getParameterValues("inter");
//		
//		System.out.println(name);
//		System.out.println(age);
//		System.out.println(Arrays.toString(inter));
//		
//		return "request/ex02_ok";
//	}
	
	//2nd
//	@RequestMapping("/doAction")
//	public String doAction(@RequestParam(value="name",required=false) String name
//			,@RequestParam("age") int age
//			,@RequestParam(value="inter", required=false, defaultValue = "") List<String> inter) {
//		
//		//requestParam은 공백과 null데이터가 전달되면 요청을 거절하게 됩니다.
//		//필수가 아닌 파라미터는 required=false속성을 지정하면 됩니다.
//		//필수가 아닌 파라미터인 경우에는 null or ""을 지정하게 되는데 defaultValue으로 기본값을 줄 수 있습니다.
//		
//		
//		
//		System.out.println(name);
//		System.out.println(age);
//		System.out.println(inter.toString());
//		return "request/ex02_ok";
//	}

	//3rd - 커맨드 객체를 통해서 맵핑(넘어오는 데이터의 name과 setter명이 같아야 한다)
	@RequestMapping("/doAction")
	public String doAction(ReqVO vo) {
		System.out.println(vo.toString());
		return "request/ex02_ok";
	}

	
	
}

 

 

ReqVO.java

package com.simple.command;

import java.util.List;

public class ReqVO {
	
	private String name;
	private int age;
	private List<String> inter;
	
	
	//기본생성자
	public ReqVO() {}
	
	//생성자
	public ReqVO(String name, int age, List<String> inter) {
		super();
		this.name = name;
		this.age = age;
		this.inter = inter;
	}

	//getter setter
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public List<String> getInter() {
		return inter;
	}
	public void setInter(List<String> inter) {
		this.inter = inter;
	}

	@Override
	public String toString() {
		return "ReqVO [name=" + name + ", age=" + age + ", inter=" + inter + "]";
	}
	
	
	
	
}

ex02.jsp의 name과 setter명이 같도록.

 

 

ex02_ok.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	결과페이지

	
</body>
</html>

 

 

콘솔출력창

ReqVO [name=aaa, age=53, inter=[1]]

 

 

※이 경우 @RequestParam을 사용할 때,  null이 넘어올 수 있는데 sysout에서 null.toString이 발생할 수도 있다.

따라서 필수가 아닌 파라미터에는 required=false속성과 defaultValue속성으로 기본값을 주어 에러를 피해야 한다.

 

+)required=false와 defaultValue는 같이 쓰는데, 에러가 발생할 일이 없을 경우 required=false만 써도 되긴 하다.

그래도 같이 쓰는 편이 좋을 듯.