요청 파라미터 (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의 추가 속성
- required- 해당 파라미터가 필수가 아닌 경우 지정한다. 기본값이 required-true다. 이걸 false로 하면 공백이나 null값이라도 전달하지만,
에러가 발생할 확률이 높아진다.(넘어오는것에 .을 찍어 사용하는 등(객체면 null이 되는데 이때 NullPointException이 발생)) - 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만 써도 되긴 하다.
그래도 같이 쓰는 편이 좋을 듯.
'Spring' 카테고리의 다른 글
230201 Spring 화면 보내기 Model객체, ModelAndView 객체 (0) | 2023.02.01 |
---|---|
230201 Spring @Controller, @RequestMapping 실습 (0) | 2023.02.01 |
230201 Spring MVC Controller 객체 구현. @Controller와 @RequestMapping (0) | 2023.02.01 |
230201 Spring Spring Legacy Project 생성하기 (0) | 2023.02.01 |
230201 Spring mvc모듈과 @Controller, @RequestMapping (0) | 2023.02.01 |