컨트롤러 구현
@Controller 애노테이션 이용을 권장하며,
@Controller & @RequestMapping 는 구현을 위한 필수 애노테이션이다.
@Controller Controller 클래스 정의
@RequestMapping HTTP요청 URL을 처리할 Controller 메소드 정의
@RequestParam HTTP 요청에 포함된 파라미터 참조 시 사용
@ModelAttribute HTTP 요청에 포함된 파라미터를 모델 객체로 바인딩
@ModelAttribute의 ‘name’으로 정의한 모델 객체를 다음 View에게 사용 가능
문법
1. 요청 URL만 선언할 경우
@RequestMapping("/요청url")
2. 요청방식을 지정한 경우
@RequestMapping( value="/요청url" method=RequestMethod.메서드방식(ex)get/post)
Controller의 처리 결과를 보여줄 View 지정 방법 / 메소드의 반환 값에 따른 view page지정 방법
1. ModelAndView인 경우
setViewName() 메소드 파라미터로 설정
2. String인 경우
메소드의 리턴 값
예제
RequestMapping 예제 - 요청방식 지정에 따른 경우
package com.aia.firstspring.controller;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
import com.aia.firstspring.member.domain.LoginRequest;
@Controller
@RequestMapping("/member/login")
public class memberLoginController {
//사용자의 요청 url 처리해야될 기능, 메서드를 바인딩 하는 것이 컨트롤러다.
// @RequestMapping(value = "/member/login", method = RequestMethod.GET)
@RequestMapping(method = RequestMethod.GET)
public ModelAndView getLoginForm() {
return new ModelAndView("member/loginForm"); // setViewName과 동일,
}
// @RequestMapping(value = "/member/login", method = RequestMethod.POST)
@RequestMapping(method = RequestMethod.POST)
public ModelAndView login() {
ModelAndView mav = new ModelAndView();
mav.setViewName("/member/login"); // 로그인 되었을 때 보이는 페이지 -> mapping에 밸류가 동일해서 오류 생김
return mav;
}
}
사용자의 파라미터값을 받는 방법
1. HttpServletRequest 객체 이용
2. @RequestParam(폼의 네임속성)
3. 커맨드 객체(Beans) 이용
@RequestParam 예제 = @RequestParam(폼의 네임속성)
package com.aia.firstspring.controller;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
import com.aia.firstspring.member.domain.LoginRequest;
@Controller
@RequestMapping("/member/login")
public class memberLoginController {
//사용자의 요청 url 처리해야될 기능, 메서드를 바인딩 하는 것이 컨트롤러다.
// @RequestMapping(value = "/member/login", method = RequestMethod.GET)
@RequestMapping(method = RequestMethod.GET)
public ModelAndView getLoginForm() {
return new ModelAndView("member/loginForm"); // setViewName과 동일,
}
// @RequestMapping(value = "/member/login", method = RequestMethod.POST)
@RequestMapping(method = RequestMethod.POST)
public ModelAndView login(
@RequestParam("uid") String uid,
@RequestParam("pw") String pw) {
//리퀘스트파람이 파라미터를 받아올 수 있게 해준다.
ModelAndView mav = new ModelAndView();
mav.setViewName("/member/login"); // 로그인 되었을 때 보이는 페이지 -> mapping에 밸류가 동일해서 오류 생김
mav.addObject("uid", uid);
mav.addObject("pw", pw);
return mav;
}
}
HttpServletRequest = HttpServletRequest 객체 이용
package com.aia.firstspring.controller;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
import com.aia.firstspring.member.domain.LoginRequest;
@Controller
@RequestMapping("/member/login")
public class memberLoginController {
//사용자의 요청 url 처리해야될 기능, 메서드를 바인딩 하는 것이 컨트롤러다.
// @RequestMapping(value = "/member/login", method = RequestMethod.GET)
@RequestMapping(method = RequestMethod.GET)
public ModelAndView getLoginForm() {
return new ModelAndView("member/loginForm"); // setViewName과 동일,
}
// @RequestMapping(value = "/member/login", method = RequestMethod.POST)
@RequestMapping(method = RequestMethod.POST)
public ModelAndView login(
HttpServletRequest request) {
String userId = request.getParameter("uid");
String userPw = request.getParameter("pw");
ModelAndView mav = new ModelAndView();
mav.addObject("userId", userId);
mav.addObject("userPw",userPw);
return mav;
}
}
커맨드 객체 = (Beans) 이용
이때 객체간의 파라미터 이름이 같아야 한다!!!!!!
package com.aia.firstspring.member.domain;
public class LoginRequest {
// 변수의 이름이 form에있는 name과 같아야 한다.
String uid;
String pw;
public String getUid() {
return uid;
}
public void setUid(String uid) {
this.uid = uid;
}
public String getPw() {
return pw;
}
public void setPw(String pw) {
this.pw = pw;
}
@Override
public String toString() {
return "LoginRequest [uid=" + uid + ", pw=" + pw + "]";
}
}
package com.aia.firstspring.controller;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
import com.aia.firstspring.member.domain.LoginRequest;
@Controller
@RequestMapping("/member/login")
public class memberLoginController {
//사용자의 요청 url 처리해야될 기능, 메서드를 바인딩 하는 것이 컨트롤러다.
// @RequestMapping(value = "/member/login", method = RequestMethod.GET)
@RequestMapping(method = RequestMethod.GET)
public ModelAndView getLoginForm() {
return new ModelAndView("member/loginForm"); // setViewName과 동일,
}
// @RequestMapping(value = "/member/login", method = RequestMethod.POST)
@RequestMapping(method = RequestMethod.POST)
public ModelAndView login(
HttpServletRequest request,
LoginRequest loginRequest) {
// login("cool","1111")
System.out.println(loginRequest);
String userId = request.getParameter("uid");
String userPw = request.getParameter("pw");
ModelAndView mav = new ModelAndView();
mav.addObject("userId", userId);
mav.addObject("userPw", userPw);
//mav.addObject("loginRequest", loginRequest);
//안해도 공유가 됨 변수이름은 클래스 이름의 앞글자를 소문자로 바꾼 것으로 됨
return mav;
}
}
MVC : List 타입의 프로퍼티 바인딩 처리하기 예제
아이템 목록 : OrderItem.java
package com.aia.firstspring.domain;
public class OrderItem {
private String itemId;
private String number;
private String remark;
public String getItemId() {
return itemId;
}
public void setItemId(String itemId) {
this.itemId = itemId;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
public String getRemark() {
return remark;
}
public void setRemark(String remark) {
this.remark = remark;
}
@Override
public String toString() {
return "OrderItem [itemId=" + itemId + ", number=" + number + ", remark=" + remark + "]";
}
}
주소 목록 : Address.java
package com.aia.firstspring.domain;
public class Address {
private String zipcode;
private String address1;
private String address2;
public String getZipcode() {
return zipcode;
}
public void setZipcode(String zipcode) {
this.zipcode = zipcode;
}
public String getAddress1() {
return address1;
}
public void setAddress1(String address1) {
this.address1 = address1;
}
public String getAddress2() {
return address2;
}
public void setAddress2(String address2) {
this.address2 = address2;
}
@Override
public String toString() {
return "Address [zipcode=" + zipcode + ", address1=" + address1 + ", address2=" + address2 + "]";
}
}
orderCommand.java
/ 커맨드는 이걸루 사용
/ 주소랑 상품 묶어줌
package com.aia.firstspring.domain;
import java.util.List;
public class orderCommand {
private List<OrderItem> orderItems;
private Address address;
public List<OrderItem> getOrderItems() {
return orderItems;
}
public void setOrderItems(List<OrderItem> orderItems) {
this.orderItems = orderItems;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
@Override
public String toString() {
return "orderCommand [orderItems=" + orderItems + ", address=" + address + "]";
}
}
컨트롤러 OrderControoler.java
GET / POST 타입 방식에 따른 리퀘스트맵핑
@ModelAttribute 애노테이션을 사용하여 모델명을 설정 (uo로 줄여줌)
package com.aia.firstspring.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import com.aia.firstspring.domain.orderCommand;
@Controller
@RequestMapping("/order/order")
public class OrderController {
@RequestMapping(method = RequestMethod.GET)
public String getOrderForm() {
return "order/orderForm";
}
@RequestMapping(method = RequestMethod.POST)
public String orderComplete(@ModelAttribute("uo") orderCommand order) {
System.out.println(order);
return "order/orderComplete";
}
}
[VIEW-1]
입력받을 폼 > orderForm.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>주문</title>
</head>
<body>
<h1>주문 폼</h1>
<form method="post">
<table border="1">
<tr>
<td rowspan="3">상품-1</td>
<td>ID</td>
<td><input type="text" name="orderItems[0].itemId"></td>
</tr>
<tr>
<td>개수</td>
<td><input type="number" name="orderItems[0].number"></td>
</tr>
<tr>
<td>주의</td>
<td><input type="text" name="orderItems[0].remark"></td>
</tr>
<tr>
<td rowspan="3">상품-2</td>
<td>ID</td>
<td><input type="text" name="orderItems[1].itemId"></td>
</tr>
<tr>
<td>개수</td>
<td><input type="number" name="orderItems[1].number"></td>
</tr>
<tr>
<td>주의</td>
<td><input type="text" name="orderItems[1].remark"></td>
</tr>
<tr>
<td rowspan="3">상품-3</td>
<td>ID</td>
<td><input type="text" name="orderItems[2].itemId"></td>
</tr>
<tr>
<td>개수</td>
<td><input type="number" name="orderItems[2].number"></td>
</tr>
<tr>
<td>주의</td>
<td><input type="text" name="orderItems[2].remark"></td>
</tr>
<tr>
<td rowspan="3">주소</td>
<td>우편번호</td>
<td><input type="text" name="address.zipcode"></td>
</tr>
<tr>
<td>주소1</td>
<td><input type="text" name="address.address1"></td>
</tr>
<tr>
<td>주소2</td>
<td><input type="text" name="address.address2"></td>
</tr>
<tr>
<td></td>
<td><input type="submit"></td>
<td></td>
</tr>
</table>
</form>
</body>
</html>
[VIEW-2]
결과출력 > orderComplete.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>주문정보</h1>
<h3>상품 주문 정보</h3>
<c:forEach items="${uo.orderItems}" var="oi">
<div>
상품 ID : ${oi.itemId} / 개수 : ${oi.number}개 / 주의사항 : ${oi.remark}
</div>
</c:forEach>
<h3>배송지</h3>
<div>
우편번호 : ${uo.address.zipcode}
주소1 : ${uo.address.address1}
주소2 : ${uo.address.address2}
</div>
</body>
</html>
'spring' 카테고리의 다른 글
[스프링] mybatis (0) | 2021.01.12 |
---|---|
[스프링] jdbc (0) | 2021.01.11 |
[스프링] 파일업로드 (0) | 2021.01.08 |
[스프링] MVC : 패턴 (0) | 2021.01.08 |
[스프링] DI / xml 설정파일 / 어노테이션 (0) | 2021.01.06 |
[스프링] 자바 프로젝트를 메이븐 기반의 프로젝트로 변환하기 (0) | 2021.01.06 |
[스프링] 기본 설정 (0) | 2021.01.05 |