Mapping Root File

  • Spring Framework에서 New Project를 생성하면 top-level-package의 이름을 설정해야 하며, 이는 반드시 3 구역으로 설정
  • 3 구역의 마지막 부분은 root 페이지의 이름이 됨 (이는 불변)
@Controller
public class HomeController {

	@GetMapping("/")
	public String start() {
		return "test"; //servlet-context.xml의 설정에 따라 WEB-INF/data/test.jsp
	}
}
  • 또한 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"; //return "form"
	}
	
	@GetMapping("/spring/form") //실제 root주소
	public String form() {
		return "form"; // WEB-INF/data/form.jsp
	}
}
  • Controller에 따라 root(/) 주소는 그대로 ‘test/’이지만, 해당 매핑 주소는 ‘WEB-INF/data/form.jsp’의 파일을 호출하며, 그 주소는 ‘test/spring/’의 form 파일인 셈 (test/spring/test)

Passing Over Values by

  • 위에서 설정한 변경된 root 주소에서 <form>을 이용해 값을 넘기는 방법
  • 값을 넘겨 받을 파일의 매핑 주소는 ‘test/spring/read’이며, 호출할 파일은 ‘WEB-INF/data/result’
@Controller
public class HomeController {

//root주소 설정 생략

	@GetMapping("/spring/read")
		public String process(Model model,@RequestParam(value = "myid") String id,@RequestParam(value = "mypass") String pass) {
			//form이랑 똑같은 변수명으로 받으면 @RequestParam(value=)도 생략가능
			
			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>
	<!--<img src="../res/02.png" align="left">-->
	<div>
		로그인한 아이디: ${id }<br>
		<b>${msg }</b>
	</div>
</body>
  • ‘WEB-INF/data/form’에서 입력한 값을 이 파일에서 사용 가능

Ways Taking Over Values

  • 우선, 값을 넘겨줄 몇 가지 방법을 시도하기 위한 <form>태그 작성
<!--WEB-INF/data/myforms-->
<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 속성과 같은 이름으로 변수 생성하여 받아오는 방법
<!--WEB-INF/data/read1-->
<body>
	<!--1번 폼으로부터 입력한 값_get-->
	<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); //DTO 객체의 참조변수명은 임의 지정
		
		return mv;
	}
}
  • @ModelAttribute 어노테이션은 전달하는 값을 Object 자료형으로 변환하는 기능
  • <form>에서 action으로 전달된 값이 자동으로 DTO 객체에 저장 (<input>의 name 속성과 같은 이름의 변수에 자동 저장)
<!--WEB-INF/data/read1-->
<body>
	<!--2번폼으로쿠터 입력한 값_dto_post-->
	<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를 통해 전달
<!--WEB-INF/data/read1-->
<body>
	<!--3번폼으로부터 입력한 값_map_post-->
	<div>
		${data }
	</div>
</body>
profile
초보개발자

0개의 댓글