2010-08-15 1 views
3

나는 Order라는 도메인 개체를 가지고 있으며 service-order m : m 연관 관계가있는 serviceOrders라는 컬렉션 특성을 가지고 있습니다. 보류.스프링 mvc, 컬렉션으로 해당 속성을 가진 도메인 개체를 바인딩하는 방법

public class Order implements Serializable { 

private Long id = null; 
private BigDecimal amountPaid; 
private BigDecimal accountReceivable; 
private User user; 
private Set serviceOrders = new HashSet(); 
private Date closed; 
private Date created = new Date(); 
private String status; 

또한, 나는 그것이 단지 그것의 get set 메소드를 호출 할 것이라고 생각

public void addServiceOrder(ServiceOrder serviceOrder) { 
    if (serviceOrder == null) 
    throw new IllegalArgumentException("Can't add a null serviceOrder."); 
    this.getServiceOrders().add(serviceOrder); 
} 

가 어떻게 "경로"로이 컬렉션을 설정하는 커맨드 이름을 사용해야합니다 addServiceOrder라는 협회를 추가하는 방법이있다 Command 객체. 이 명령 Object에 serviceOrder를 어떻게 추가해야합니까? 나는이 문제에 대해 전혀 모른다. 어떤 도움을 주시면 감사하겠습니다.

답변

0

ServiceOrder 인스턴스에 고유 한 ID가 있다고 가정하면 서비스 메소드는 #add (긴 ID) 여야합니다.

0

좋아, 이거 나에게 곰이 있지만 해결책은 동시에 간단하고 성가시다. 나는 이걸 두 달 전에 만났다. 나는 콜렉션을 다루기위한 나의 관점에서 jstl 라이브러리를 사용하여 나의 해결책을 보여 주려고한다.

<c:forEach items="${Questions}" var="quest" varStatus="itemsIndex"> 
     <fieldset> 
      <legend>${quest.section}</legend> 
      <form:form id="group${itemsIndex.index}" modelAttribute="ChoiceList" action="" method="POST" onsubmit="javascript:ajaxSave($(this).serialize()); return false;"> 
      <a id="Group${quest.id}"></a> 
      <c:forEach items="${quest.qisQuestionsCollection}" var="quest2" varStatus="itemsRow"> 
       <div style="font-weight: bold; margin: 10px 0px">${quest2.shortText}</div> 
       (${quest2.qisQuestionTypes.description})<br/> 
      (${quest2.helpText})<br/> 
       <a id="Question${quest2.id}"></a> 
       <c:choose> 
       <c:when test="${quest2.qisQuestionTypes.questionType == 'CHOOSEANY'}"> 
        <c:forEach items="${quest2.qisChoicesCollection}" var="quest3" varStatus="indexStatus"> 
        <c:forEach items="${ChoiceFields}" var="CField"> 
         <c:set scope="request" value="${quest3}" var="ChoiceData"/> 
         <c:set scope="request" value="${CField}" var="ChoiceProperty"/> 
         <% 
           answerMap = (HashMap<QisChoice, Answer>) request.getAttribute("AnswerList"); 
           choice = (QisChoice) request.getAttribute("ChoiceData"); 
           if (answerMap.containsKey(choice.getChoiceID())) { 
            Answer theAnswer = (Answer) answerMap.get(choice.getChoiceID()); 
            if (theAnswer != null) { 
            if (theAnswer.getChoiceValue() != null) { 
             request.setAttribute("itemValue", theAnswer.getChoiceValue()); 
             request.setAttribute("itemSelected", true); 
            } else { 
             request.setAttribute("itemSelected", false); 
             request.setAttribute("itemValue", getReflectedValue(
               (QisChoice) request.getAttribute("ChoiceData"), 
               (AccessorStruct) request.getAttribute("ChoiceProperty"))); 
            } 
            } 
           } else { 
            request.setAttribute("itemSelected", false); 
            request.setAttribute("itemValue", getReflectedValue(
              (QisChoice) request.getAttribute("ChoiceData"), 
              (AccessorStruct) request.getAttribute("ChoiceProperty"))); 
           } 
           request.setAttribute("itemValue2", getReflectedValue(
             (QisChoice) request.getAttribute("ChoiceData"), 
             (AccessorStruct) request.getAttribute("ChoiceProperty"))); 
         %> 
         <c:choose> 
         <c:when test="${CField.visible == 'HIDDEN'}"> 
          <form:hidden value="${itemValue2}" path="question[${itemsRow.index}].choice[${indexStatus.index}].${CField.beanName}" /> 
         </c:when> 
         <c:otherwise> 
          <c:choose> 
          <c:when test="${itemSelected}"> 
           <form:checkbox value="${itemValue}" label="${quest3.description}" path="question[${itemsRow.index}].choice[${indexStatus.index}].${CField.beanName}" checked="true" /><br/> 
          </c:when> 
          <c:otherwise> 
           <form:checkbox value="${itemValue}" label="${quest3.description}" path="question[${itemsRow.index}].choice[${indexStatus.index}].${CField.beanName}" /><br/> 
          </c:otherwise> 
          </c:choose> 

         </c:otherwise> 
         </c:choose> 
        </c:forEach> 
        </c:forEach> 
       </c:when> 

      <input type="submit" value="Save Section" 
        class="button-main" /> 
      </fieldset> 
     </form:form> 
     </c:forEach>` 

의 열쇠 비트는 스프링 경로의 일부로 요소의 indice을 제시해야 다시 게시에 대한 자사의 컬렉션 명령 개체를 연결하려면이 줄

<form:checkbox value="${itemValue}" label="${quest3.description}" path="question[${itemsRow.index}].choice[${indexStatus.index}].${CField.beanName}" checked="true" /><br/> 

입니다. 내 경우에는 내가

<c:forEach items="${quest.qisQuestionsCollection}" var="quest2" varStatus="itemsRow"> 

varStatus 당신이 당신의 이점에 사용할 수있는 인덱스 속성을 빈 개체에 액세스 할 수 있습니다 추적 컬렉션의 두 가지 수준이있다.

jsp에서 foreach jstl 함수의 index 속성을 사용하여 내가했던 것처럼 indice를 생성하고 명령 객체의 배열 인덱스 표기법에 추가 할 수 있습니다. 명령 객체는 물론 경로 컬렉션 이름과 동일한 흐름을 따라야합니다. 이것은 무한한 수의 레벨에서 작동하지만 우리가 갈수록 더 성가 시게됩니다.

이 예제는 대형 라이브 예제이므로 작은 크기가 필요하면 마크 업을 보여줘야합니다.