2010-02-01 5 views
5

그래서 Apache WicketApache Click을 비교하는 Wicket 태그에서 another question을 읽었습니다. 내 의견에 간결한 설명. 나는 Click 세계보다 개찰구 세계에 더 익숙하다.상태가없는 Apache Wicket 상태 비 저장 페이지/요청

내가 읽은 의견 중 하나는 상태가없는 위젯 페이지를 만들 수 있다는 것입니다. 나는 이것에 대해 생각하기 시작했고 무언가에 대한 요청이나 페이지 요청을하는 방법을 알 수 없었다. 이것은 어떤 상황에서는 확실히 유용 할 수 있습니다. 그러면 주 (state)없이 Wicket을 어떻게 사용하기 시작합니까?

+0

http://stackoverflow.com/a/3441584/176897 – tetsuo

+0

위의 링크가 작동하지 않습니다. 다음을 시도해보십시오. https://cwiki.apache.org/confluence/display/WICKET/Stateless+pages – snorbi

답변

8

페이지가 북마크 가능하고 상태 비 저장이 아닌 구성 요소/비헤이비어를 포함하지 않는 경우 페이지는 자동으로 비 상태이므로 세션에 저장되지 않습니다. 나는 사용자가 상태없는 페이지 만 방문하면 세션이 생성되지 않을 것이라고 생각한다. 대부분의 경우, 페이지 표시 방법에 대한 모든 것이 no-args 생성자 또는 PageParameters 인수를 사용하는 생성자에서만 결정될 수 있습니다. 일반적인 Link 및 Form 클래스는 Stateless가 아니므로 StatelessForm 및 StatelessLink를 대신 사용해야합니다.

+0

감사합니다. Geoff. 이제 Stateless ... 구성 요소의 존재도 의미가 있습니다. – Matt

16

Wicket은 기본적으로 상태 비 저장이며 필요한 경우 상태 저장 모드로 전환됩니다. 무국적 모드를 깨는 것은 매우 쉽습니다.

의도 된 상태 비 저장 페이지 및 상태 비 저장 구성 요소에 @StatelessComponent으로 주석을 지정하는 것이 유용하다는 것을 발견했습니다. 이는 wicket-devutils 프로젝트에 있습니다. 나는 다음과 같이 내 WebApplication.init() 방법에 StatelessChecker을 추가

protected void init(){ 
    ... 
    this.addPostComponentOnBeforeRenderListener(new StatelessChecker()); 
    ... 
} 

이 방법 난 항상 문제를 일으키는 상태 구성 요소에 대한 예외를 얻을.

3

페이지가있는 경우 의도적으로 무 상태인지 확인하려는 경우 setStatelessHint(boolean state) 방법이 유용합니다.

페이지가 비 상태가 아닌 경우 경고 메시지를 표시합니다. 자세한 내용은

는 여기를 참조하십시오 Wicket Stateless pages

4

내가 시험에서 그것을 확인하는 것을 선호합니다.

그렇게 무 페이지에 대한 각각의 테스트는 기본적으로 수익률이 널 (null)

getStatelessWebPage() 

우선합니다.

는 기본 테스트에서 나는 페이지의 모든 구성 요소를 방문하는 일반적인 검사를하고 구성 요소가 상태인지를 확인하거나

@Test 
public void checkForStateless() 
{ 
    StatelessWebPage statelessPage = getStatelessWebPage(); 
    if (statelessPage != null) 
    { 
     Page page = (Page)statelessPage; 
     if (!page.isPageStateless()) 
     { 
      //find the reason 
      Component statefulComponent = page.visitChildren(Component.class, new StatelessChecker()); 
      if (statefulComponent != null) 
      { 
       fail("Stateless page contains stateful component [" 
        +statefulComponent.getClass().getName()+" : " 
        + statefulComponent.getMarkupId() +"]"); 
      } 
     } 
    } 
} 

class StatelessChecker implements IVisitor<Component, Component> 
{ 
    @Override 
    public void component(Component component, IVisit<Component> iVisit) 
    { 
     if (!component.isStateless()) 
     { 
      iVisit.stop(component); 
     } 
    } 
} 
0

어떤 상황에 대해 페이지는 곳이 될 수 없습니다 사용자가 authenitcated했는지 여부에 따라 stateless 또는 stateful?

예는 현재 사용자 이름 로그온을 보여줍니다 대부분의 웹 페이지의 상단, 프로필 링크 등에있는 전형적인 '계정'패널, 사이트에

대부분의 페이지가에서이있을 것입니다 수 top 이렇게하면 사용자가 로그온했는지 여부에 따라 두 페이지 모두 상태 저장과 상태 비 저장이 가능해야합니다.

관련 문제