2011-07-31 3 views
2

내 위케이 응용 프로그램에서 PropertyModel 및 CompoundpropertyModel을 사용하고 있습니다. 나는 그들을 페이지 클래스의 멤버가 아닌 로컬 변수로 사용한다. 모델이 로컬 일 때 모델을 분리하려면 onDetach() 함수를 재정의해야합니까? 아니면 멤버 변수 만 세션에 직렬화됩니까?개 변수가 지역 변수에서 사용되는 경우 개개 모델을 분리해야합니까?

예 :

TextField<String> title = new TextField<String>("title", new PropertyModel<String>(position, "title")); 
title.setRequired(true); 
form.add(positionTitle); 

답변

2
이 경우

, 그리고 개찰구에서 같은 모델의 대부분의 용도에서, 초기 할당은 로컬 변수이지만, 객체는 무언가에 투입 아니 로컬.

form은 거의 확실하게 필드이거나 세션에 직렬화되는 필드에 들어 있습니다. 여기에는 모델이 포함 된 title 필드가 포함됩니다.

따라서 직렬화 될 것이므로 예를 들어 onDetach()을 구현해야합니다.

편집 : 코멘트에서 언급 한 바와 같이

, 정말로 중요한 것은 그것이 필드인지 여부가 아니라, 페이지의 구성 요소 계층 구조의 일부인지 여부입니다. 페이지 또는 다른 구성 요소의 하위 구성 요소가 수퍼 클래스 org.apache.wicket.MarkupContainerchildren 필드에 보유되어 있기 때문에 어느 정도 수준이 동일합니다.

+0

@Martin 또한 폼이 필드가 아니더라도 페이지 사이에 하나 이상의 다른 구성 요소가있는 경우 페이지에 추가됩니다. 그리고이 페이지는 확실히 연재 될 것입니다. – Nicktar

+0

@ 닉 타르 - 좋은 지적입니다. 나는 이것을 통합하기위한 대답을 업데이트했다. –

3

제출 한 양식 값을 작성하기 위해 TextField에 모델 개체가 필요하기 때문에 왜 TextField 모델을 분리하려고하는지 명확하지 않습니다. PropertyModel에서 position을 분리하면 사용자가 양식을 제출 한 후에 TextField에 "제목"값을 쓸 수있는 위치가 없습니다. position의 위치,로드 된 위치 및 요청주기 사이에 분리해야하는 이유에 대한 자세한 정보를 제공 할 수 있습니다. 일반적으로 양식 구성 요소에 값을 쓸 수있는 안전하게 직렬화 할 수있는 모델 객체를 사용하는 것이 일반적입니다.

각 요청이 끝날 때 PropertyModel의 모델 객체를 분리해야하는 경우 PropertyModel을 LoadableDetachableModel에 연결하십시오. LDM은 제공된 load() 메소드를 기반으로 각 요청주기마다 새로운 모델 객체를로드 한 다음 모델 객체 직렬화를 방지하기 위해 분리시 해당 모델 객체에 대한 참조를 자동으로 무효화합니다. LoadableDetachableModel<Position>을 PropertyModel의 모델 객체로 사용하면 PropertyModel이 LoadableDetachableModel을 자동으로 분리하여 position 객체의 직렬화를 피할 수 있습니다.

예제 에서처럼 detach()을 명시 적으로 호출 할 필요가 없습니다. 개찰은 페이지 계층 구조의 모든 구성 요소의 기본 모델을 자동으로 분리합니다. "기본 모델"은 super(...) 체인을 통과하여 결국 이라는 인수가 Component(...) 생성자 중 하나가되는 모델을 의미합니다.

요청 처리가 끝나면 페이지에서 detach()을 자식에 대해 호출하고 해당 자식은 자식에 detach()을 호출합니다. 이 메서드 (Component에 정의되어 있음)는 detachModels()을 호출하며 이는 Component의 기본 모델을 분리합니다.

일반적으로 두 개 이상의 모델을 사용하는 표준 Wicket 구성 요소는 detachModels 동안 추가 모델을 분리합니다. 예를 들어, DropDownChoice에 모델을 선택 값을 가져 오거나 설정하기 위해 전달하고 선택 목록의 모델을 전달하면 DropDownChoice는 각 요청이 끝날 때 두 모델을 자동으로 분리합니다. 이는 AbstractChoice#detachModel()이 설정되어있는 경우 choices 모델을 찾아 분리하기 때문입니다. 그런 다음 CompoundPropertyModel가 detachModels에 의해 자동으로 분리 될 수

Form<User> userForm = new Form<User>("userForm", new CompoundPropertyModel<User>(new DetachableUserModel(...)); 

가 있다면 예를 들어, 그래서

체인 연결 모델은, 자신의 체인 모델을 분리하고, 그 차례로 DetachableUserModel를 분리합니다.

모델을 수동으로 분리하는 것에 대해 걱정할 필요가있는 부분은 코드에서 일부 구성 요소의 기본값 model이 아닌 추가 모델을 사용하는 경우입니다. 둘 이상의 모델 객체가있는 새로운 유형의 구성 요소를 만드는 경우 문제가 될 수 있습니다. 귀하의 경우에는

+0

확실히, 그들은 wicket에 의해 분리되지만, 오직 datachable이고 의미있는 방식으로 "detach"를 구현해야합니다. PropertyModel은 대상 객체에서 분리를 호출합니다 (분리 가능할 경우에만). 그래, 네가 필요한 코드를 제공하고 질문에 대한 것이었을 때만 자동으로 분리된다. – Nicktar

+0

@ 닉 타 알았어요. 댓글 주셔서 감사합니다. 원래의 질문은 "모델"과 "모델 객체"를 혼동 한 것 같습니다. 그것은 "PropertyModel과 Compoundpropertymodel을 페이지 클래스의 멤버가 아닌 로컬 변수로 사용하는 것입니다. 로컬에있을 때 모델을 분리 할 수 ​​있습니까?" 내 대답을 업데이트했습니다. –

0

, 나는 할 것이다 :

IModel model = new CompoundPropertyModel(new LoadableDetachableModel(position){ 
     @Override protected Object load() { return null; } 
    }); 
    Form form = new Form("form", model); 
    form.add(
      new TextField("title") 
       .setRequired(true)); 
    add(form); 

detach()는 요청의 끝 부분에 체인이라고합니다. LoadableDetachableModel을 사용하면 위치 객체가 참조되지 않도록 할 수 있습니다.

속임수 : 도메인 객체 또는 값 객체를 직렬화 할 수 없도록 유지합니다. 개발 구성에서 직렬화 오류가있는 경우 이러한 객체에 대한 참조를 유지한다는 의미입니다.

관련 문제