Computer Science/Spring

#6 Command 객체 이용한 Form 전송 처리

꿈꾸는어린이 2018. 5. 25. 22:38


// Spring MVC 구조 중 Controller

Command 객체를 이용한 Form 전송 처리

  • HTML Form에 입력된 데이터를 JavaBeans 객체를 통해 전달받음

  • JavaBeans class 정의(called command class)

  • DispatcherServlet은 command 객체를 생성하고 form 입력 값들을 대응되는 property들에 저장한 후 request handler method에 전달함 ( command 객체에 form 입력 값 저장 후 request method에 전달)

<br>

HTML Form

  게시글 쓰기 입력 폼:
<form method="post">
<input type="hidden" name="parentId" value="0" />
<!-- hidden : 웹상에서 보이지 않는 변수 처리 시 사용함 -->
제목: <input type="text" name="title" /><br/>
내용: <textarea name="content"></textarea><br/>
<input type="submit" value="전송"/>
</form>

<br>

Command Class

  public class NewArticleCommand {

private String title;
private String content;
private int parentId;

getter/setter 정의
}

★★ form의 각 항목 이름과 command class의 각 property 이름이 일치해야 함

<br>

Controller class - command 객체 이용

  
@Controller
@RequestMapping("/article/newArticle.do")
public class NewArticleController {
@Autowired
private ArticleService articleService;

@RequestMapping(method = RequestMethod.GET)
public String form() {
return "article/newArticleForm";
}

@RequestMapping(method = RequestMethod.POST)
public String submit(@ModelAttribute("command") NewArticleCommand command) {
    //command 객체를 파라미터로 지정
    //command.getTitle(); Request에서 전달된 title parameter 값 이용
articleService.writeArticle(command);
return "article/newArticleSubmitted";
}

public void setArticleService(ArticleService articleService) {
this.articleService = articleService;
}

}

<br>

Controller class - command 객체 미사용

  
@Controller
@RequestMapping("/article/newArticle.do")
public class NewArticleController {
@Autowired
private ArticleService articleService;

@RequestMapping(method = RequestMethod.GET)
public String form() {
return "article/newArticleForm";
}

@RequestMapping(method = RequestMethod.POST)
public String submit(@RequestParam(title) String title, @RequestParam(content) String content, @RequestParam(parentId) int pid) {

    NewArticleCommand article = new NewArticleCommand();
    article.setTitle(title);
    ...
         //command 객체를 정의하지 않으면 이런 과정을 거쳐야 함.
         //만약 수많은 parameter가 넘어오면 각각 따로따로 처리하기 어려움.
         //command 객체를 사용하면 이런 과정이 간단해짐.
return "article/newArticleSubmitted";
}

public void setArticleService(ArticleService articleService) {
this.articleService = articleService;
}

}

<br>

View에서 command 객체 접근

  • command 객체는 controller에서 view로 자동 전달됨

  • 객체의 이름은 class이름과 동일(첫글자는 소문자로 변환됨)

    ex ) NewArticleCommand class -> newArticleCommand

  • @ModelAttribute 를 이용하여 다른 이름 지정 가능

  
<body>
게시글 등록됨:
<br/>
제목: ${command.title}
 <!--객체 이름을 특별히 지정하지 않았을 경우에는 클래스 이름으로 사용 -->
 <!-- ${newArticleCommand.title}-->
내용: ${command.content}

<p><a href="<c:url value='/index' />">Go to index</a></p>

<br>

Command 객체에서 중첩 객체 및 List-type property 사용

model class

  
public class OrderItem {

private Integer itemId;
private Integer number;
private String remark;

//getter, setter 정의

}

command class

  
public class OrderCommand {

private List<OrderItem> 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;
}

}

<br>

order form.html

  
<body>
<form method="post">
상품1: ID - <input type="text" name="orderItems[0].itemId" size="5" />
개수 - <input type="text" name="orderItems[0].number" size="5" />
주의 - <input type="text" name="orderItems[0].remark" />
<br/>
상품2: ID - <input type="text" name="orderItems[1].itemId" size="5"/>
개수 - <input type="text" name="orderItems[1].number" size="5"/>
주의 - <input type="text" name="orderItems[1].remark" />
<br/>
상품3: ID - <input type="text" name="orderItems[2].itemId" size="5" />
개수 - <input type="text" name="orderItems[2].number" size="5" />
주의 - <input type="text" name="orderItems[2].remark" />
<br/><br/>

배송지:<br/>
주소1 - <input type="text" name="address.address1" />
주소2 - <input type="text" name="address.address2" /><br/>
우편번호 - <input type="text" name="address.zipcode" />
<br/><br/>
<input type="submit" value="전송" />
</form>
</body>

<br>

controller

  
@Controller
@RequestMapping("/order/order.do")
public class OrderController {

@RequestMapping(method = RequestMethod.GET)
public String form() {
return "order/orderForm";
}

@RequestMapping(method = RequestMethod.POST)
public String submit(OrderCommand orderCommand) {
return "order/orderCompletion";
}
}

<br>

orderCompletion.jsp

  
<body>
주문 완료
<br/>
주문 아이템
<ul>
<c:forEach var="item" items="${orderCommand.orderItems}">
<li>${item.itemId} / ${item.number} / ${item.remark}</li>
</c:forEach>
</ul>
배송지: ${orderCommand.address}

<p><a href="<c:url value='/index' />">Go to index</a></p>
</body>

<br>

View 설정 : Redirection

  • view를 지정하지 않고 특정 request URL로 redirection

  
@RequestMapping("/hello")
public ModelAndView hello(Model model) {
...
 return "redirection:/error.do"; //error.do로 redirection 처리
 
 return "redirection:form"; //hello/form 으로 redirection
}

'Computer Science > Spring' 카테고리의 다른 글

#8 Form 입력 값 검증  (0) 2018.06.16
#7 Model Data  (0) 2018.05.26
#5 Spring MVC 구조  (0) 2018.05.25
#4 Bean 객체의 life-cycle 관리  (0) 2018.05.14
#3 Spring DI : auto-wiring, annotation 기반  (0) 2018.05.14