[Spring] HTML 폼과 자바빈 객체


HTML 폼과 자바빈 객체


스프링 MVC는 HTML 폼에 입력한 데이터를 자바빈 객체를 이용해서 전달 받을 수 있도록 하고 있다.

예를 들어 HTML 폼의 항목과 이름과  자바빈 클래스의 프로퍼티 이름이 일치할 경우 폼에 입력한 값을 해당 자바빈 클래스의 프로퍼티 값으로 설정해주는 기능을 제공하고 있다.


<from method="post">

<input type="hidden" name="parantId" value="0" />

제목: <input type="text" name="title" />

내용: <textarea name="content"> </textarea>

<input type="submit"/>

</from>


public class NewArticleCommand{

private String title;

private String content;

private int parentId;


// 입력 항목의 이름과 일치하는 프로퍼티에 값이 저장

public void setTitle(String tilte){

this.title;

}

public void setContent(String content){

this.content;

}

public void setParentId(int parentId){

this.parentId = parentId;

}

}


@Controller

@RequestMapping("/article/newArticle.do")

public class NewArticleController{


@RequestMapping(method = RequestMethod.POST)

public String submit(NewArticleCommand command){

//command.getTitle(): title 파라미터 값 저장

//command.getContent(): content 파라미터의 값 저장

//comman.getParentId(): parentId 파라미터의 값 저장

return "article/newArticleSubmitted";

}

}

HTML 폼에 입력한 데이터를 자바빈 객체로 전달받는 방법은 매우 간단하다. 단지 @RequestMapping 어노테이션이 적용된 메서드의 파라미터로 자바빈 타입을 추가해주기만 하면 된다.

폼에 입력한 값을 NewArticleCommand 클래스로 전달 받고 싶다면 요청 처리 메서드에 NewArticleCommand 타입의 파라미터를 추가해주기만 하면 된다.


1. 뷰에서 커맨드 객체 접근하기

뷰 코드에서는 컨트롤러의 @RequestMapping 어노테이션 메서드에서 전달받은 command 객체에 접근할 수 있다. 예를 들어, 아래와 같이 NewArticleCommand 타입의 command 객체를 전달받는다고 하자.

@RequestMapping(method =ResquestMethod.POST)

public String submit(NewArticleCommand command){

}

 

이 경우 컨트롤러의 처리 결과를 보여주는 뷰 코드에서는 command 객체의 클래스 이름을 이용해서 command 객체에 접근할 수 있다. 즉, command 객체는 자동으로 모델에 추가된다.

<body>

제목:${newArticleCommand.title}


뷰에서 사용할 모델의 이름을 변경하고 싶다면 다음과 같이 @ModelAttribute 어노테이션을 이용해서 command 객체의 모델 이름을 지정할 수 있다.

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;


@Controller

@RequestMapping("/article/newArticle.do")

public class NewArticleController {


@RequestMapping(method = RequestMethod.POST)

public String submit(@ModelAttribute("command") NewArticleCommand command) {

articleService.writeArticle(command);

return "article/newArticleSubmitted";

}

}

@ModelAndView 어노테이션을 이용해서 command 객체의 모델 이름을 지정했다면, 뷰 코드에서는 다음과 같이 해당 모델 이름을 사용해서 command 객체에 접근할 수 있다.

제목:${command.title} <---  [기존의 제목:${newArticleCommand.title}]


2. 커맨드 객체로 List 받기

스프링 MVC는 List 타입의 프로퍼티에 대한 바인딩도 처리해준다. 예를 들어, 아래 코드는 OrderItem 목록을 갖는 List타입의 orderItems 프로퍼티를 갖고 있다.


public class OrderCommand {


private List<OrderItem> orderItems; //OrderItem 목록을 갖는 List타입의 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;

}

}


List 타입의 프로퍼티에 값을 전달하고 싶다면 폼에서 "프로퍼티명[index].프로퍼티" 같이 입력 폼의 이름을 구성하면 된다. 예를 들어, 위 코드의 orderItems 프로퍼티에 값을 전달하고 싶다면

아래 코드와 같이 폼을 구성하면 된다.

<form method="post">

상품1: ID - <input type="text" name="orderItems[0].itemId" /> 

개수 - <input type="text" name="orderItems[0].number" />

주의 - <input type="text" name="orderItems[0].remark" />

<br/>

상품2: ID - <input type="text" name="orderItems[1].itemId" /> 

개수 - <input type="text" name="orderItems[1].number" />

주의 - <input type="text" name="orderItems[1].remark" />

<br/>

......

<input type="submit" />

</form>



폼의 <input>이나 <select> 등의 name에 인덱스 값을 포함시키면 List 타입의 프로퍼티에 값을 전달받을 수 있다. 컨트롤러 코드에서는 다음과 같이 커맨드 객체를 @RequestMapping 메서드에 지정해주기만 하면 된다.

@Controller

@RequestMapping("/order/order.do")

public class OrderController {

@RequestMapping(method = RequestMethod.POST)

public String submit(OrderCommand orderCommand) {

return "order/orderCompletion";

}

}