// 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 객체 이용
"/article/newArticle.do") (
public class NewArticleController {
private ArticleService articleService;
(method = RequestMethod.GET)
public String form() {
return "article/newArticleForm";
}
(method = RequestMethod.POST)
public String submit( ("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 객체 미사용
"/article/newArticle.do") (
public class NewArticleController {
private ArticleService articleService;
(method = RequestMethod.GET)
public String form() {
return "article/newArticleForm";
}
(method = RequestMethod.POST)
public String submit( (title) String title, (content) String content, (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
"/order/order.do") (
public class OrderController {
(method = RequestMethod.GET)
public String form() {
return "order/orderForm";
}
(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
"/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 |