2013-05-23 5 views
0

복합 데이터 입력 양식에서 양식의 양식을 편집해야 할 수도 있습니다. JSF2에서는 이것이 가능하지 않기 때문에이 문제에 대해 더 나은 해결책이 무엇인지 궁금합니다. 다음은 내가 필요한 것의 예입니다.jsf2 form with ajax

  • 두 콩 : OuterBean과 HobbyBean; HobbyBeans의 목록
  • OuterBean이 (SessionScope 단위) ManagedBean은
  • HobbyBean은 두 개의 필드 취미가 들어있다 OuterBean에 사용 같다
  • 내가 OuterBean에 사용자의 이름을 추가하는 형태에 HobbyBeans을 추가 할

OuterBean을 제출하지 않고 새 값을 제출하여 목록을 채우지 않아도됩니다. 다음 코드 예제는 다음과 같습니다

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
    <html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:h="http://java.sun.com/jsf/html"> 
    <h:head> 
    </h:head> 
    <h:body> 
     <h:form> 
     <h:panelGrid columns="2"> 
      <h:outputText value="Name" /> 
      <h:inputText value="#{outerBean.name}" required="true" /> 
      <h:outputText value="Hobbies" /> 
      <h:dataTable id="ht" value="#{outerBean.hobbies}" var="h"> 
       <h:column> 
        <h:outputText value="#{h.hobby}" /> 
        <f:facet name="footer"> 
         <h:inputText value="#{outerBean.hobby}" required="true" /> 
        </f:facet> 
       </h:column> 
       <h:column> 
        <h:outputText value="#{h.like}" /> 
        <f:facet name="footer"> 
         <h:inputText value="#{outerBean.like}" required="true" /> 
         <h:commandButton action="#{outerBean.addHobby}" value="+" immediate="true"> 
          <f:ajax render="ht" /> 
         </h:commandButton> 
        </f:facet> 
       </h:column> 
      </h:dataTable> 
     </h:panelGrid> 
     </h:form> 
    </h:body> 
    </html> 

예, 외부 형태에 대한 명령 단추가없는,하지만 여기에 질문이 아니다. commandButton은 내부 양식을위한 것이므로 속성 immediate = true를 설정합니다. 이렇게하면 모든 필드가 비어 있지 않음이 검사됩니다 (필수 태그는 무시됩니다). 또한이 필드의 내용은 무시되고 ajax 요청으로 설정되지 않습니다. 어떻게 이것을 피하고 아우 쳐스 요청 내에서 h.hobby와 h.like의 필드 값을 OuterBean으로 보냅니 까? 여기

콩 :

@ManagedBean 
    @SessionScoped 
    public class OuterBean 
    { 
     private List<HobbyBean> hobbies; 
     private String name; 
     private String hobby; 
     private Integer like; 

     public OuterBean() 
     { 
      hobbies = new ArrayList<HobbyBean>(); 
     } 

     public String addHobby() 
     { 
      hobbies.add(new HobbyBean(hobby, like)); 
      System.out.println("hobbies: " + hobbies.toString()); 
      return ""; 
     } 

     public String submit() 
     { 
      System.out.println("name is " + name); 
      return ""; 
     } 
    // + getter & setter 
    } 

    /* ------------------------------------------------------------------------ */ 

    public class HobbyBean 
    { 
     private String hobby; 
     private Integer like; 

     public HobbyBean(String hobby, Integer like) 
     { 
      this.hobby = hobby; 
      this.like = like; 
     } 

     public String toString() 
     { 
      return hobby == null ? "" : hobby.concat(",").concat(like == null ? "" : like.toString()); 
     } 
    // + getter & setter 
    } 

나는 빈에 취미가 빈 취미 필드 있기 때문에 어떤 취미가 추가되지 있다는 것입니다 추가하면 이제 어떻게됩니까과 같은 설정되지 않은 (목록이 비어 로그 입니다 : "취미 : []"). 어떻게 작동시킬 수 있습니까?

+0

중첩 양식이 유효한 HTML이 아니라는 사실을 알고 있습니까? 한 페이지에 두 개 이상의 양식을 넣을 수 있지만 중첩 할 수는 없습니다. – Tankhenk

+0

예 이러한 제한 사항을 알고 있으므로 이러한 솔루션에 대한 해결 방법이 있다면 제 질문이 있습니다. 나는이 사건이 자주 일어날 수 있다고 생각하는 그러한 해결책이 없다고 생각하지 않을 것이다. –

답변

1

f : ajax에게 제출할 것을 말하지 않기 때문에 취미가 비어 있습니다. 형태의 아약스 느릅 나무 부분은 제출해야 : 당신은 당신이 F에게 코드에서 볼 수 있듯이

<h:form> 
    <h:panelGrid columns="2"> 
     <h:outputText value="Name" /> 
     <h:inputText value="#{outerBean.name}" required="true" /> 
     <h:outputText value="Hobbies" /> 
     <h:dataTable id="ht" value="#{outerBean.hobbies}" var="h"> 
      <h:column> 
       <h:outputText value="#{h.hobby}" /> 
       <f:facet name="footer"> 
        <h:inputText id="hobby" value="#{outerBean.hobby}" required="true" /> 
       </f:facet> 
      </h:column> 
      <h:column> 
       <h:outputText value="#{h.like}" /> 
       <f:facet name="footer"> 
        <h:inputText id="like" value="#{outerBean.like}" required="true" /> 
        <h:commandButton action="#{outerBean.addHobby()}" value="+" > 
         <f:ajax execute="hobby like" render="ht" /> 
        </h:commandButton> 
       </f:facet> 
      </h:column> 
     </h:dataTable> 
    </h:panelGrid> 
</h:form> 

:이 부분은 (내가 만약 당신이 원하는 추측)에 제출하고 싶은 경우 다음을 시도 할 수 있습니다 버튼을 누를 때. 당신이 지금 당신의 빈을 확인한다면 당신은 그 취미에만 취미가 추가된다는 것을 알게 될 것입니다. 이름 부분은 제출되지 않습니다. 모든 필드가 확인되지 않았다고 가정 해 보겠습니다. 이것은 immediate = true를 사용하기 때문에 유효성 검사를 건너 뜁니다. 나는 그것을 사용하지 않을 것을 제안합니다. 즉시 = true에 대한 자세한 내용은 여기를 참조하십시오. http://balusc.blogspot.nl/2006/09/debug-jsf-lifecycle.html#WhenShouldIUseTheImmediateAttribute 희망이 도움이됩니다.

+0

이것은 내가 찾던 답변이다. 대단히 감사한다. 그럼에도 불구하고이 솔루션은 즉각적인 특성을 제거 할 때만 작동합니다. 전체 양식을 제출할 때 "내부 양식 필드"에 필수 속성을 사용하면 안됩니다. 그렇지 않으면 유효성 검사 예외가 발생합니다. 마지막으로, execute-Attribute를 추가하는 것이 작동하게하는 최종 키입니다. –