input 값이나 select value값으 전송하고 싶을때 parameter이용해 값을 전달 한다.
스프링에는 방법이 3가지가 존재한다 .
더있을수도있습니다.
1. HttpServletRequest
2. @RequestParam
3. @ModelAttribute
이방식으로 사용가능합니다.
1. HttpServletRequest
jsp/servlet 방식과 비슷한방식
포워딩했을때 파라미터가져오는방법
request.getParameter("name명") 으로 가져오는방식 으로 사용이 가능하다.
하지만 스프링사용시 이방법은 사용하지않는다
알아만둘것!
클릭시 아래 페이지로 이동한다 .
input의 값입력후 등록하기를 누르게되면 menuResult.jsp으로 포워딩 된다.
파라미터 값을 어떤식으로 가져오는지 알아보자!
등록하기 버튼 클릭시 post 방식의 regist url로 요청하면 아래의 메소드가 실행된다.
메뉴 이름 : name, 메뉴 가격 : price, 카테고리 :categoryCode 로 값이 전송된다.
그후 저장된값을 String으로 저장하여 model 이용하여 날리고 messageReult.jsp 으로 포워딩하여 값을출력한다.
위와 같은 형식으로 출력된다.
2. @RequestParam 이용하여 파라미터 전달 받기
이방식은 Controller의 메소드 매개변수에서 파라미터를 받는 방식이다.
1번방식보다 훨씬간단하다.
MenuController.java
// 2. @RequestParam 이용하여 파라미터 전달 받아오기
@GetMapping("modify")
public void getModify() {}
@PostMapping("modify1")
public String postModify(Model model, @RequestParam String name, @RequestParam("price") String menuPrice) {
String message = name + "의 가격을 " + menuPrice + "원 으로 가격을 변경하였습니다.";
model.addAttribute("message", message);
return "first/messageResult";
}
위의 postModify() 확인하면된다.
매개변수에 @RequestParam String name << input name값이 name인 파라미터의 값을가져오는것이
@RequestParam("price") String menuPrice 의 뜻은 input name값이 price인 값을 가져오라는 뜻이다
여기서 주의할점은 애너테이션에 name값을 작성안하면 매개변수명으로 판단하여 값을가져온다.
그리고 @RequestParam에는 2가지의 옵션이 존재한다 .
@RequestParam(required = [true(default) or false])
가져올 파라미터가 존재하지않을시 required가 true면 오류가발생한다.
true일시 무조건 파라미터값을 가져오라는 명령어 인셈이다.
만약 false로 지정하면 가져와야할 파라미터가 없다면 null로 반환하여 에러가발생하지않는다.
아래의 방식으로 설정이 가능하다.
두번째 옵션은 파라미터의 값을 기본값을 설정하는 방법이다.
만약 가져와야할 파라미터의 값이없다면 아래의 방식으로 기본값 지정이 가능하다.
또한 Map형식으로도 가져올수있다.
Map 으로 가져왔을시 저장되는 방식은
Map<name명, value> 이런식으로 저장이된다.
사용방법은 아래와같다.
@RequestParam의 매개변수 타입을 Map으로지정후
key값을 이용해 값을 뽑아내는 방식을 사용하였다.
꺼내야할 매개변수가 많으면 Map 을 이용해 뽑아내는것도 코드를 깔끔하게하는 방식인것같다.
3. @ModelAttribute를 이용하여 파라미터 전달 받기
@ModelAttribute 방식은 매개변수에 VO/DTO 클래스를 명시해 VO로 전달받는 방법이다.
많이 쓰일것같은방식이다.
위 사진처럼 파라미터로 가져야와할 값이 4가지이고
name명은 아래와같다
name, price, categoryCode, orderableStatus
그리고 Menu VO는 아래와같다
@ModelAttribute를 사용할려면 name의 값과 VO의 필드명이 동일해야 사용이가능하다.
선언방식은 이렇다.
매개변수를 VO객체 형식으로 가져오면된다.
실습에 사용한 코드
main.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>parameter main</title>
</head>
<body>
<h1>핸들러 메소드의 파라미터와 애너테이션</h1>
<h2>1. HttpServletRequest로 요청 파라미터 전달 받기</h2>
<button onclick="location.href='${pageContext.servletContext.contextPath}/first/regist'">파라미터 전달하기</button>
<h2>2. @RequestParam 이용하여 파라미터 전달 받기</h2>
<button onclick="location.href='${pageContext.servletContext.contextPath}/first/modify'">파라미터 전달하기</button>
<h2>3. @ModelAttribute를 이용하여 파라미터 전달 받기</h2>
<button onclick="location.href='${pageContext.servletContext.contextPath}/first/search'">파라미터 전달하기</button>
</body>
</html>
regist.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>
<h1 align="center">파라미터 값 전송하기</h1>
<h3>신규 메뉴 등록하기</h3>
<form action="regist" method="post">
등록할 메뉴 이름 : <input type="text" name="name"> <br>
등록할 메뉴 가격 : <input type="number" name="price"> <br>
등록할 메뉴의 카테고리 :
<select name="categoryCode">
<option value="1">식사</option>
<option value="2">음료</option>
<option value="3">디저트</option>
</select>
<br>
<button type="submit">등록하기</button>
</form>
</body>
</html>
modify.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>
<h1>@RequestParam을 이용하여 전달 된 파라미터 꺼내기</h1>
<h3>메뉴 수정하기_1</h3>
<form action="modify1" method="post">
수정할 메뉴 이름 : <input type="text" name="name"> <br>
수정할 메뉴 가격 : <input type="number" name="price"> <br>
<button type="submit">수정하기</button>
</form>
<h3>메뉴 수정하기_2</h3>
<form action="modify2" method="post">
수정할 메뉴 이름 : <input type="text" name="name"> <br>
수정할 메뉴 가격 : <input type="number" name="price"> <br>
<button type="submit">수정하기</button>
</form>
<h3>메뉴 수정하기_3</h3>
<form action="modify3" method="post">
수정할 메뉴 이름 : <input type="text" name="name"> <br>
수정할 메뉴 가격 : <input type="number" name="price"> <br>
<button type="submit">수정하기</button>
</form>
<h3>메뉴 수정하기_4(Map이용)</h3>
<form action="modify4" method="post">
수정할 메뉴 이름 : <input type="text" name="name"> <br>
수정할 메뉴 가격 : <input type="number" name="price"> <br>
<button type="submit">수정하기</button>
</form>
</body>
</html>
search.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>
<h1>@RequestParam을 이용하여 전달 된 파라미터 꺼내기</h1>
<h3>메뉴 수정하기_1</h3>
<form action="modify1" method="post">
수정할 메뉴 이름 : <input type="text" name="name"> <br>
수정할 메뉴 가격 : <input type="number" name="price"> <br>
<button type="submit">수정하기</button>
</form>
<h3>메뉴 수정하기_2</h3>
<form action="modify2" method="post">
수정할 메뉴 이름 : <input type="text" name="name"> <br>
수정할 메뉴 가격 : <input type="number" name="price"> <br>
<button type="submit">수정하기</button>
</form>
<h3>메뉴 수정하기_3</h3>
<form action="modify3" method="post">
수정할 메뉴 이름 : <input type="text" name="name"> <br>
수정할 메뉴 가격 : <input type="number" name="price"> <br>
<button type="submit">수정하기</button>
</form>
<h3>메뉴 수정하기_4(Map이용)</h3>
<form action="modify4" method="post">
수정할 메뉴 이름 : <input type="text" name="name"> <br>
수정할 메뉴 가격 : <input type="number" name="price"> <br>
<button type="submit">수정하기</button>
</form>
</body>
</html>
MenuController.java
package com.memory.parameter1;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.SessionAttributes;
import org.springframework.web.bind.support.SessionStatus;
@Controller
@RequestMapping("/first/*")
@SessionAttributes("id")
public class MenuController {
// 1. Httpservlet의 request 활용해 파라미터 받아오기
@GetMapping("regist")
public void getRegist() {}
@PostMapping("regist")
public String postRegist(Model model, HttpServletRequest request) {
String name = request.getParameter("name");
int price = Integer.parseInt(request.getParameter("price"));
int categoryCode = Integer.parseInt(request.getParameter("categoryCode"));
String message = "신규 메뉴의 이름은 " + name + ", 가격은 " + price + "원, 카테고리 코드는 " + categoryCode + "입니다.";
model.addAttribute("message", message);
return "first/messageResult";
}
// 2. @RequestParam 이용하여 파라미터 전달 받아오기
@GetMapping("modify")
public void getModify() {}
@PostMapping("modify1")
public String postModify(Model model, @RequestParam String name, @RequestParam("price") String menuPrice) {
String message = name + "의 가격을 " + menuPrice + "원 으로 가격을 변경하였습니다.";
model.addAttribute("message", message);
return "first/messageResult";
}
@PostMapping("modify2")
public String postModify2(Model model, @RequestParam(required = false) String nadme, @RequestParam("price") String menuPrice) {
String message = nadme + "의 가격을 " + menuPrice + "원 으로 가격을 변경하였습니다.";
model.addAttribute("message", message);
return "first/messageResult";
}
@PostMapping("modify3")
public String postModify3(Model model, @RequestParam String name, @RequestParam(value="price", defaultValue = "0") String menuPrice) {
String message = name + "의 가격을 " + menuPrice + "원 으로 가격을 변경하였습니다.";
model.addAttribute("message", message);
return "first/messageResult";
}
@PostMapping("modify4")
public String postModify4(Model model, @RequestParam Map<String, String> mapParam) {
String name = mapParam.get("name");
int menuPrice = Integer.parseInt(mapParam.get("price"));
String message = name + "의 가격을 " + menuPrice + "원 으로 가격을 변경하였습니다.";
model.addAttribute("message", message);
return "first/messageResult";
}
// 3. @ModelAttribute를 이용하여 파라미터 전달 받아오기
@GetMapping("search")
public void getSearch() {}
@PostMapping("search")
public String postSearch(Model model, @ModelAttribute Menu menu) {
model.addAttribute("menu", menu);
return "first/menuResult";
}
}
Menu.java
package com.memory.parameter1;
public class Menu {
private String name;
private int price;
private int categoryCode;
private String orderableStatus;
public Menu() { }
public Menu(String name, int price, int categoryCode, String orderableStatus) {
super();
this.name = name;
this.price = price;
this.categoryCode = categoryCode;
this.orderableStatus = orderableStatus;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
public int getCategoryCode() {
return categoryCode;
}
public void setCategoryCode(int categoryCode) {
this.categoryCode = categoryCode;
}
public String getOrderableStatus() {
return orderableStatus;
}
public void setOrderableStatus(String orderableStatus) {
this.orderableStatus = orderableStatus;
}
@Override
public String toString() {
return "Menu [name=" + name + ", price=" + price + ", categoryCode=" + categoryCode + ", orderableStatus="
+ orderableStatus + "]";
}
}
'프로그래밍 > Spring' 카테고리의 다른 글
Spring - 16. 파일 업로드(단일, 다중) (4) | 2021.10.29 |
---|---|
Spring - 16. session 사용하기 (0) | 2021.10.28 |
Spring - 14. MVC mapping (0) | 2021.10.27 |
Spring - 14. Web MVC Project 기본설정(어노테이션 버전) (0) | 2021.10.27 |
Spring - 13. MVC 프로젝트 (0) | 2021.10.26 |