Mapping Root File
- Spring Framework에서 New Project를 생성하면 top-level-package의 이름을 설정해야 하며, 이는 반드시 3 구역으로 설정
- 3 구역의 마지막 부분은 root 페이지의 이름이 됨 (이는 불변)
@Controller
public class HomeController {
@GetMapping("/")
public String start() {
return "test";
}
}
- 또한 Controller를 통해서 매핑을 하여 주소를 ‘/’로 설정하면 주소는 root 페이지의 이름을 따르며 매핑 메서드의 반환 값에 해당하는 파일을 호출
- 그러나 root 페이지의 기능에 따라 후속 매핑 주소를 추가하고 싶다면 어떻게 해야할까? (root 주소는 test/이지만 이를 test/spring/이 되도록)
Redirect Root File
- 전술했듯 root 페이지의 주소는 불변
- 따라서 root 페이지로 이동했을 시 이를 redirect하여, 마치 root 페이지의 주소가 달라진 것 같은 효과를 줄 수 있음
@Controller
public class HomeController {
@GetMapping("/")
public String start() {
return "redirect:/spring/form";
}
@GetMapping("/spring/form")
public String form() {
return "form";
}
}
- Controller에 따라 root(/) 주소는 그대로 ‘test/’이지만, 해당 매핑 주소는 ‘WEB-INF/data/form.jsp’의 파일을 호출하며, 그 주소는 ‘test/spring/’의 form 파일인 셈 (test/spring/test)
- 위에서 설정한 변경된 root 주소에서 <form>을 이용해 값을 넘기는 방법
- 값을 넘겨 받을 파일의 매핑 주소는 ‘test/spring/read’이며, 호출할 파일은 ‘WEB-INF/data/result’
@Controller
public class HomeController {
@GetMapping("/spring/read")
public String process(Model model,@RequestParam(value = "myid") String id,@RequestParam(value = "mypass") String pass) {
model.addAttribute("id", id);
String msg="";
if(pass.equals("1234"))
msg="로그인 성공";
else
msg="로그인 실패";
model.addAttribute("msg", msg);
return "result";
}
}
- jsp와 마찬가지로 <form> 내의 <input>태그의 name 속성을 기준으로 값을 넘기기 때문에 넘어온 값을 저장할 변수명은 앞의 name 속성과 같아야 함
- @RequestParam 어노테이션으로 값을 받으며 변수명은 변경 가능 (<input>의 name 속성 그대로 받으면 어노테이션 생략 가능)
// WEB-INF/data/form
<body>
<form action="read">
<table>
<tr>
<th>아이디</th>
<td><input type="text" name="myid" class="form-control"></td>
</tr>
<tr>
<th>비밀번호</th>
<td><input type="password" name="mypass" class="form-control"></td>
</tr>
<tr>
<td colspan="2" align="center">
<button type="submit">데이터전송</button>
</td>
</tr>
</table>
</form>
</body>
- <form>태그는 jsp와 동일
- action 속성 값은 ‘read’만 입력 (위의 기본 설정에 따라 root 페이지가 ‘test/spring/’이 되었으므로 호출할 파일의 매핑 주소는 ‘read’이기 때문)
// WEB-INF/data/result
<body>
<div>
로그인한 아이디: ${id }<br>
<b>${msg }</b>
</div>
</body>
- ‘WEB-INF/data/form’에서 입력한 값을 이 파일에서 사용 가능
Ways Taking Over Values
- 우선, 값을 넘겨줄 몇 가지 방법을 시도하기 위한 <form>태그 작성
<body>
<h2>get방식폼</h2>
<form action="read1" method="get">
이름: <input type="text" name="myname" size="6"><br>
나이: <input type="text" name="myage" size="5"><br>
<button type="submit">get방식 전송</button>
</form>
<h2>post방식폼_dto읽기</h2>
<form action="read2" method="post">
상품: <input type="text" name="sang" size="10"><br>
가격: <input type="text" name="price" size="10"><br>
<button type="submit">post방식 전송</button>
</form>
<h2>post방식폼_map읽기</h2>
<form action="read3" method="post">
상품: <input type="text" name="sang" size="10"><br>
가격: <input type="text" name="price" size="10"><br>
<button type="submit">post방식 전송</button>
</form>
</body>
- 입력 폼이 있는 파일로 이동하기 위한 매핑 주소 설정
@Controller
public class FormController {
@GetMapping("/data/myform")
public String myforms() {
return "myforms";
}
}
Get Method_Basic
@Controller
public class FormController {
@GetMapping("/data/read1")
public ModelAndView read1(@RequestParam(value = "myname") String name,@RequestParam int myage,
@RequestParam(value = "msg",defaultValue = "HappyDay") String msg) {
ModelAndView mv=new ModelAndView();
mv.setViewName("process1");
mv.addObject("name", name);
mv.addObject("age", myage);
mv.addObject("msg", msg);
return mv;
}
}
- <form>태그 <input>의 name 속성과 같은 이름으로 변수 생성하여 받아오는 방법
<body>
<div>
이름: ${name }<br>
나이: ${age }<br>
메시지: ${msg }
</div>
</body>
Post Method_Deliver through DTO
public class FormDto {
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;
}
}
- setter와 getter를 포함한 DTO 생성
- 반드시 <form>의 <input>태그의 name 속성과 같은 이름으로 변수를 설정해야 값 전달 가능
@Controller
public class FormController {
@PostMapping("/data/read2")
public ModelAndView read2(@ModelAttribute FormDto dto) {
ModelAndView mv=new ModelAndView();
mv.setViewName("process2");
mv.addObject("dto", dto);
return mv;
}
}
- @ModelAttribute 어노테이션은 전달하는 값을 Object 자료형으로 변환하는 기능
- <form>에서 action으로 전달된 값이 자동으로 DTO 객체에 저장 (<input>의 name 속성과 같은 이름의 변수에 자동 저장)
<body>
<div>
삼품명: ${dto.sang }<br>
가격: ${dto.price }<br>
</div>
</body>
- DTO 객체를 Controller에서 임의 지정한 참조변수를 통해 호출
- 각 변수는 클래스 생성 후 호출하는 것과 같이 getter로 호출
Post Method_Save in Map
@Controller
public class FormController {
@PostMapping("/data/read3")
public ModelAndView read3(@RequestParam Map<String, String> map) {
ModelAndView mv=new ModelAndView();
mv.setViewName("process3");
String sang=map.get("sang");
String price=map.get("price");
String data=sang+"의 가격은 "+price+"입니다";
mv.addObject("data", data);
return mv;
}
}
- @RequestParam 어노테이션을 통해 Map 객체를 생성하여 인수로 지정
- 자동으로 <input>의 name 값과 동일한 이름으로 Key와 Value에 저장 (<Key, Value>)
- 이를 get() 하여 ModelAndView를 통해 전달
<body>
<div>
${data }
</div>
</body>