SPRING

Form Data

김쪼끼 2017. 2. 16. 15:49

HttpServletRequest, @RequestParam를 사용하기


HttpServletRequest 서블릿은 클라이언트로부터 전송된 데이터를 담고 있고, 컨트롤러에서는 파라미터로 객체를 설정하여 사용할 수 있다.


0) Controller.java

@Controller
@RequestMapping("/board")
public class BoardController {

	@RequestMapping("/test")
	public String test(HttpServletRequest httpServletRequest, Model model) {
		String id = httpServletRequest.getParameter("id");
		model.addAttribute("id", id);
		return "board/view";
	}
	@RequestMapping("/test2")
	public String test2(@RequestParam("id")String id, Model model) {
		model.addAttribute("id", id);
		return "board/view";
	}
}

@RequestParam() 어노테이션이 사용된 메서드는, 해당 파라미터가 존재하지 않으면 400 error가 발생함


localhost:8080/board/test     (정상 작동)

localhost:8080/board/test2     (400 Error)

localhost:8080/board/test2?id=spring     (정상 작동)




Data(Command) Object를 사용하기


위 방법은 데이터의 양이 많아질 수록 코드가 길어지고 가독성도 떨어지게 된다. 처리하고자 하는 데이터를 객체화하여 사용하는 방법은 코드가 간결해지고 효율적이다.


1) Member.java

public class Member {
	private String id;
	private String password;
	
	//getters and setters
	public String getId() {id;}
	public void setId(String id) {	this.id = id;}
	public String getPassword() {return password;}
	public void setPassword(String password) {password = password;}
}
2) Controller.java
@Controller
@RequestMapping("/member")
public class MemberController {

	@RequestMapping("/profile")
	public String test(Member member) {
		
		return "member/profile";
	}
}

3) Profile.jsp

<body>
	<p>Profile</p>
	<p>ID : ${member.id} </p>
	<p>E-mail : ${member.password} </p>
</body>


위 코드에서 test 메서드는 model객체조차 사용하지 않고 뷰 페이지에 데이터를 전달한다.



@PathVariable을 사용하기


@PathVariable을 사용하면 URI의 일부를 변수로 사용할 수 있다. REST API를 구현하는 방법 중 한 가지이다.


0) Controller.java

@Controller
@RequestMapping("/member")
public class MemberController {

	@RequestMapping("/profile/{id}")
	public String getProfile(@PathVariable String id, Member member) {
		System.out.println("pathvariable: " + id);
		return "member/profile";
	}
}

localhost:8080/member/profile/10    // 매핑 설정에 따라 숫자 부분이 변수로 지정됨

메서드를 보면, Member 객체를 파라미터로 받고 있다. 헌데, Member객체는 id 를 필드로 이미 갖고 있기 때문에 위 메서드에서는 PathVariable로 지정된 id값을 Member객체에 set하게 된다.

자동으로 데이터를 처리하기에 매우 편리할 수 있으나, 특정 상황에서는 의도치 않은 동작을 할 수 있으므로 변수명 설계 시 주의가 요망된다.