2017년 7월 18일 화요일

form:form 으로 list를 사용 할때.(보내고 받는 방법)



아래와 같이 list의 내용을 list로 담아서 바로 던지면
JSP form:form path 으로 해당 list에 있는 값들을 읽지 못한다.

1
2
3
4
5
6
// Controller
List<Exam1_order> list = dDAO.getOrderlist();
System.out.println(list.size());
model.addAttribute("list",list );    
cs


1
2
3
4
5
6
7
8
9
// JSP
<form:form action="d1_order_list" modelAttribute="list" method="post" enctype="multipart/form-data">
    <td>
        <form:input path="no" type="text" class="form-control" readonly="true"/>
    </td>
    <td><form:input path="item" type="text"  readonly="true"/></td>
    <td><form:input path="count" type="text" placeholder="물품수량" /></td>
    <td><form:input path="price" type="text" placeholder="물품가격" /></td>
</form:form>
cs

 실행해 보면 path의 값을 가져 오지 못한다는 에러가 뜬다.
prevented it from fulfilling this request.

















해결하는 방법은 두가지가 있다.

1. form:form 으로 받지 않고 forEach를 통해  받은 리스트를 풀어 준다.


1
2
3
4
5
6
7
8
9
// JSP
<c:forEach var="tmp" items="${list}">
  <tr>
    <th>${tmp.no}</th>
    <th>${tmp.item}</th>
    <th>${tmp.count}</th>
    <th>${tmp.price}</th>
  </tr>    
</c:forEach>
cs


2. form:form 으로 받으려면 새로운 Arraylist VO를 만들어 주어야 한다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
// Controller
@RequestMapping(value = "/listarray", method = RequestMethod.GET)
    public String listarr(Model model) {
        
         MemberList mlist = new MemberList();
         List<Member> list = new ArrayList<Member>();
        
         for (int i = 0; i < 5; i++) {
              Member mem = new Member();
              mem.setCustno(i + 1);
              mem.setCustname("a" + i);
              list.add(mem);
         }
         System.out.println(list.size());

             model.addAttribute("cmd1", list);
            
             mlist.setMemberlist(list);
             model.addAttribute("cmd2", mlist);
        
     return "exam/listarray";
}
 @RequestMapping(value = "/listarray", method = RequestMethod.POST)
    public String listarr(@ModelAttribute("cmd1") MemberList mlist) {
     List<Member> list = mlist.getMemberlist();
         for (int i = 0; i < list.size(); i++) {
          System.out.println(list.get(i).getCustno());
         }
     return "exam/listarray";
}
cs

기존 VO 이외의 새로운 ListVO를 만들어 준다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// ListVO
package com.ds.vo;
import java.util.ArrayList;
import java.util.List;
public class MemberList {
    private List<Member> memberlist = new ArrayList<Member>();
 public List<Member> getMemberlist() {
    return memberlist;
 }
 public void setMemberlist(List<Member> memberlist) {
     this.memberlist = memberlist;
 }
}
cs


그런 다음  일반 VO와 새로 만든 ListVO를 생성해 준다.
예제에서는 그냥 vo는 mlist 로 list vo는 list로 이름을 지정해 주었다.

         MemberList mlist = new MemberList();
         List<Member> list = new ArrayList<Member>();

ListVO에 일반 vo를 담은 후 JSP에 보낸다.

             mlist.setMemberlist(list);
             model.addAttribute("cmd2", mlist);

JSP에서 form:form 안에 forEach를 사용하여 list안에 있는 내용을 뽑아낸다.
path="memberlist[${i.index}].custno"
memberlist 안 i 번째 index의 custno를 path값으로 지정

1
2
3
4
5
6
7
8
9
10
11
12
// JSP
<form:form action="listarray" modelAttribute="cmd2" method="post">
  <c:forEach items="${cmd2.memberlist}" varStatus="i">
    <form:input type="text" path="memberlist[${i.index}].custno" />
    <form:input type="text" path="memberlist[${i.index}].custname" />
  </c:forEach>
  <input type="submit" />
</form:form>
cs


조금 path 값이 길어져서 가독률이 떨어지지만 jsp에서 list를 푸는 방법은 이렇다.







댓글 1개: