겉바속촉
[Spring] 폼 만들어서 데이터 받아오기 본문
우선 전체적인 틀을 이해하고 시작해볼게요
index.jsp에서 실행을 하면
우리가 제일 처음 접하는 화면이라고 생각해봅시다
그리고 다음 그림으로 이해해주세요:)
그럼 index.jsp로 가주세요
다음과 같이 만들었습니다:)
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script src="https://code.jquery.com/jquery-3.5.1.js"></script>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css">
<title>Insert title here</title>
</head>
<body>
<h1>매핑주소로 이동</h1>
<ul>
<li><a href="happy">happy로 이동</a></li>
<li><a href="hello">hello로 이동</a></li>
<li><a href="hello.do">hello.do로 이동</a></li>
<li><a href="nice.do">nice.do로 이동</a></li>
</ul>
</body>
</html>
그리고 컴파일 해보시면 다음과 같이 뜹니다 ---> 주소창 계속 확인해주세요!!
이제 저기서 각각 눌렀을 때 이동해야하기 때문에
매핑주소들을 각각 넣어준 거에요:)
다음 그림에서 표시해준것처럼요!!
그리고 폼을 눌렀을 때 실행이 되기 위해 controller를 만들어주셔야 합니다:)
Hellocontroller.java
package spring.day0626.ex1;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class HelloController {
@RequestMapping(value = "/happy", method=RequestMethod.GET)
public String hello(Model model)
{
//Model은 request에서 데이터를 저장하기 위한 인터페이스
//서블릿에서 코딩했던 request.setAttribute와 같다
model.addAttribute("name", "보라돌이");
model.addAttribute("addr", "서울구로");
return "result"; //포워드(WEB-INF/day0626/result.jsp)가 생략되어 있는 것
}
@RequestMapping(value = "/hello", method=RequestMethod.GET)
//@GetMapping("/hello.do") --> 이럴 경우 무조건 hello.do만 가능
public ModelAndView hello2()
{
ModelAndView model=new ModelAndView();
//모델에 데이터 저장
model.addObject("sangpum","딸기");
model.addObject("price",10000);
//jsp로 포워드
model.setViewName("result2");
return model;
}
}
Nicecontroller.java
package spring.day0626.ex1;
import java.util.Date;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
public class NiceController implements Controller{
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
ModelAndView model=new ModelAndView();
model.addObject("today",new Date());
model.addObject("weather", "아주맑음");
model.setViewName("result3");
return model;
}
}
이렇게까지 하신 후에 컴파일해보세요
happy로 이동 클릭
hello로 이동 클릭
hello.do로 이동 클릭
nice.do로 이동 클릭
이제는 입력폼을 눌렀을 때 폼 여러가지가 뜨도록 해볼게요:)
index.jsp에서 아까 만들어둔 부분에 대해서 추가로 만들어주는 것이에요
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script src="https://code.jquery.com/jquery-3.5.1.js"></script>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css">
<title>Insert title here</title>
</head>
<body>
<h1>매핑주소로 이동</h1>
<ul>
<li><a href="happy">happy로 이동</a></li>
<li><a href="hello">hello로 이동</a></li>
<li><a href="hello.do">hello.do로 이동</a></li>
<li><a href="nice.do">nice.do로 이동</a></li>
</ul>
<h1>폼 전송-get방식</h1>
<b><a href="myform">입력폼</a></b>
</body>
</html>
우리가 지금 경로에 myform 즉, 대왕폼의 이름을 myform이라고 해주었어요
이제 작동하려면
FormDataController를 만들어주세요
그리고 작업순서는 다음과 같습니다:)
1. 가장먼저 @Controller 적용해주기
2. @GetMapping ("대왕폼이름") 해주기 ---> index에서 경로 지정해줄 때 썼던 대왕폼 이름이랑 동일해야함
3. ModelAndView 만들고 @RequestParam으로 받기
4. model 객체 생성한 후에 model.addObject로 넣어주기
5. 포워드로 값 보내기
6. return model;
src/main/java에서 만들었던 패키지에서 클래스 하나 생성해주시구요
다음과 같이 코드 작성해주세요
package spring.day0626.ex1;
import java.util.Map;
import org.springframework.stereotype.Controller;
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.servlet.ModelAndView;
@Controller
public class FormDataController {
@GetMapping("myform") //매핑주소는 index에서 링크하므로 이름이 동일해야 함
public String form1()
{
return "form1";
}
@GetMapping("/read1")
//@RequestMapping("/read1") --> 생략하면 get매핑
//get방식 폼 전송
public ModelAndView read1(@RequestParam("name") String name,
@RequestParam int age,
@RequestParam(value="msg",defaultValue = "Happy~")String msg)
{
ModelAndView model=new ModelAndView();
model.addObject("name", name);
model.addObject("age", age);
model.addObject("msg", msg);
//포워드
model.setViewName("process1");
return model;
}
@PostMapping("read2")
public ModelAndView read2(@ModelAttribute TestDTO dto) //dto를 한 번에 모두 받아옴=@
{
ModelAndView model=new ModelAndView();
//request받은 값을 dto로 받아온다
model.addObject("dto", dto);
//포워드
model.setViewName("process2");
return model;
}
//3번 폼 -> Map으로 폼 데이터 읽기
@PostMapping(value = "/read3")
public ModelAndView read3(@RequestParam Map<String, String>map)
{
ModelAndView model = new ModelAndView();
String blood=map.get("blood");
String star=map.get("star");
String data="혈액형은"+blood+", 별자리는"+star+"자리입니다";
model.addObject("data", data);
model.setViewName("process3");
return model;
}
}
여기서 포인트는
Controller에서 액션을 주실 때 쓰는 이름과 form1에서 액션의 이름과 동일해야하겠죠?
그래야 작동이 가능합니다
그리고 컴파일
각각의 input창에다가 데이터 입력하고 전송 버튼을 눌러주면
다음 표시한 부분의 매핑 주소로 값이 출력되는 겁니다:)
그리고 각각 포워드 해준 것의 코드는 밑에 작성해두었습니다
dto로 해준 경우
TestDTO.java
package spring.day0626.ex1;
public class TestDTO {
private String sang;
private int price;
public String getSang() {
return sang;
}
public void setSang(String sang) {
this.sang = sang;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
}
process1.jsp
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script src="https://code.jquery.com/jquery-3.5.1.js"></script>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css">
<title>Insert title here</title>
</head>
<body>
<h1>1번 폼에서 전달받은 값-get방식</h1>
<h2>이름: ${name }<br>
나이: ${age }<br>
메세지: ${msg }</h2>
</body>
</html>
process2.jsp
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script src="https://code.jquery.com/jquery-3.5.1.js"></script>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css">
<title>Insert title here</title>
</head>
<body>
<h1>2번폼으로부터 입력받은 값_post방식</h1>
<h2>상품명: ${dto.sang }<br>
가격: ${dto.price }<br></h2>
</body>
</html>
process3.jsp
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script src="https://code.jquery.com/jquery-3.5.1.js"></script>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css">
<title>Insert title here</title>
</head>
<body>
<h1>3번폼으로부터 입력된값_Map_Post</h1>
<h2>${data }</h2>
</body>
</html>
각각 보내고 받는 방식을 3가지로 했기 떄문에
하나씩 살펴봐주세요!^^!
그리고 post랑 get 방식의 차이점은
다음과 같습니다
post는 뒤에 입력값이 노출이 되지않고
get은 입력값까지 모두 주소창에 노출이 됩니다:)
'IT일기(하반기) > SPRING' 카테고리의 다른 글
[spring] MyBatis 깔고 setting해주기 (2) | 2020.06.29 |
---|---|
[spring] 이미지 띄우기 (0) | 2020.06.26 |
[spring] 확장자 변경해서 이동해보기 (0) | 2020.06.26 |
[spring] 확장자명 연습하기 (0) | 2020.06.26 |
[spring] MVC (0) | 2020.06.26 |