2011-02-18 1 views
2

getModelObject에 문제가 있습니다. 널 (null)을 리턴합니다. 사실 모델 컨셉은 나에게 분명하지 않습니다. 코드는 다음과 같습니다Wicket : getModelObject가 null을 반환합니다.

public class SpaceCheckListWindow extends WebPage { 
private SpaceCheckListForm spaceCheckListForm; 
private Page parentPage; 
private ModalWindow modalWindow; 

public SpaceCheckListWindow(Page parentPage, final ModalWindow modalWindow) { 
    this.parentPage = parentPage; 
    this.modalWindow = modalWindow; 

    String[] labels = new String[] { 
      "a", 
      "b", 
      "c", 
      "d", 
      "e", 
      "f" 
    }; 

    List<ListMemeber> list = new ArrayList<ListMemeber>(); 

    for(String label : labels) { 
     list.add(new ListMemeber(label)); 
    } 

    addComponent(list); 
} 

private void addComponent(List<ListMemeber> list) { 
    spaceCheckListForm = new SpaceCheckListForm("form", list); 
    add(spaceCheckListForm); 
} 

private class SpaceCheckListForm extends Form { 

    private static final long serialVersionUID = 1L; 

    public SpaceCheckListForm(String id, final List<ListMemeber> list) { 
     super(id); 

     ListView listView = new ListView("listView", list) { 

      private static final long serialVersionUID = 1L; 

      @Override 
      protected void populateItem(ListItem listItem) { 
       ListMemeber member = (ListMemeber) listItem.getModelObject(); 
       listItem.add(new Label("label", member.getLabel())); 
       listItem.add(new CheckBox("checkbox", new PropertyModel(member, "selected"))); 
      } 
     }; 

     listView.setReuseItems(true); 
     add(listView); 

     AjaxButton submitBtn = new AjaxButton("submitBtn", this) { 

      private static final long serialVersionUID = 1L; 

      @Override 
      protected void onSubmit(AjaxRequestTarget target, Form form) { 
       System.out.println(spaceCheckListForm.getModelObject()); 
       modalWindow.close(target); 
      } 
     }; 

     add(submitBtn); 
    } 

} 

private class ListMemeber implements Serializable { 
    private String label; 
    private Boolean selected = Boolean.FALSE; 

    public ListMemeber(String label) { 
     this.label = label; 
    } 

    public String getLabel() { 
     return label; 
    } 

    public void setLabel(String label) { 
     this.label = label; 
    } 

    public Boolean getSelected() { 
     return selected; 
    } 

    public void setSelected(Boolean selected) { 
     this.selected = selected; 
    } 

    @Override 
    public String toString() { 
     return label + Boolean.toString(selected); 
    } 
} 

}

지금 온 클릭이 AjaxButton가 null가 반환된다. 나는 레이블과 해당 체크 박스 값을 얻고 싶다. 그것을 얻기 위해 무엇을해야합니까? 모든 정보는 나에게 매우 도움이 될 것입니다. 고맙습니다.

답변

3

구성 요소 계층 구조는 다음과 같습니다

SpaceCheckListWindow 
SpaceCheckListForm (id: form) 
    ListView (id: listView) 
    ListItem (id: <generated by wicket>) 
    Label (id: label) 
    CheckBox (id: checkbox) 
    AjaxButton (id: submitBtn) 

은 개찰구에서 각 구성 요소가 표시 데이터/조작하는 저장 모델을 가질 수있다. 이 모델은 일반적으로 생성자의 구성 요소에 전달됩니다. 이것이 발생하지 않으면 구성 요소가 빈 모델로 초기화됩니다 (이 자체는 오류가 아닙니다). 하지만 코드에서 빈 모델을 사용하여 양식을 만들었으므로 모델을 업데이트 할 방법이 없으므로 getModelObject()은 항상 null을 반환합니다. 이것은 다시 오류가 아니므로 양식에 모델 객체 자체가있을 필요는 없습니다.

평범하지 않은 모델을 가진 유일한 구성 요소는 CheckBox이며, 이는 ListMemeberselected 필드를 읽고 업데이트합니다. (업데이트 : 물론 Label에도 비어 있지 않은 모델이 있지만 라벨은 모델을 읽지 만 업데이트하지는 마십시오.)

이렇게 요약하면이 코드에 근본적으로 잘못된 것은 없습니다. 잘못된 위치의 결과 : 양식의 모델 개체를 로그 아웃하는 대신 모든 목록 구성원의 selected 필드를 나열하여 양식을 제출할 때 변경 사항을 확인하십시오. 개찰구 모델에 대한

일부 추가 읽기 : Working with Wicket models

+0

자세한 설명 주셔서 감사합니다. 나는 그 모델이 보통 POJO라는 것을 알았다. 이제 폼의 모델처럼 클래스를 만들고 싶습니다. 어떻게 그것에 listview를 삽입 할 수 있습니까? 텍스트 필드 또는 확인란의 경우 문자열 또는 부울이됩니다. 그럼 listview는 어떻습니까? getter와 setter와 함께리스트를 선언해야합니까? 그럼 toString 메서드는 무엇입니까? 위의 문제에서 listview.getmodelobject를 호출하면 해당 작업이 처리됩니다. 도와 주셔서 감사합니다. –