2013-01-21 3 views
4

특정 URL에 액세스하는 사용자를 개찰 페이지로 리디렉션하고 페이지의 앵커로 스크롤해야합니다. 예를 들어 사용자는 http://.../target/url/123에 직접 연결할 수 있습니다. 그런 다음 123 ID가 데이터베이스에서 조회됩니다. 이후 엔티티를 찾았는지 여부에 따라 사용자가 다른 페이지로 리디렉션됩니다.Wicket의 setResponsePage()에서 앵커를 추가하는 방법은 무엇입니까?

엔티티를 가져온 후에 사용자는 http://.../another/url/123#element123으로 리디렉션되어야합니다. 어떻게 우리가 개찰판에서 이걸 얻을 수 있습니까? 페이지는 앵커없이 액세스 할 수 있어야하며 솔루션은 일반적이어야합니다. 내가 생각 해낸

하나 개의 솔루션은 PageParametersanchor라는 항목이 포함 된 경우 URL에 #anchor를 추가하기 위해 PageParametersEncoder 논리를 무시하는 것입니다. 그러나 이것은 또한 앵커를 추가하기 위해 Url 클래스를 내 자신으로 확장해야 함을 의미합니다.

public class ExtendedEncoder extends PageParametersEncoder { 

    public static final String ANCHOR = "anchor"; 

    @Override 
    public Url encodePageParameters(PageParameters pageParameters) { 
     Url fromSuper = super.encodePageParameters(pageParameters.remove(ANCHOR)); 
     return new ExtendedUrl(fromSuper, 
       pageParameters.get(ANCHOR).toOptionalString()); 

    } 
} 

public class ExtendedUrl extends Url { 
     private String anchor; 

     private ExtendedUrl(Url url, String anchor) { 
      super(url); 
      this.anchor = anchor; 
     } 

     @Override 
     public String toString(StringMode mode, Charset charset) { 
      return super.toString(mode, charset) 
        + anchor == null ? "" : "#" + anchor; 
     } 
    } 
} 

다른 문제가 있습니까?

답변

1

리디렉션 수 url.

@Override 
public void renderHead(IHeaderResponse response) { 
    super.renderHead(response); 
    long anchor = getRequest().getQueryParameters().getParameterValue("anchor").toLong(0); 
    if (anchor > 0) { 
     response.render(new OnLoadHeaderItem("location.href='#anchor" + anchor + "';")); 
     anchor = 0; 
    } 
} 

btw, 이것은 wicket 6 용입니다. 1.5 및 이전 버전에서도 비슷한 작업을 수행 할 수 있습니다.

+0

그래, 그 트릭을 할 것입니다. 그러나'anchor' 매개 변수는'/ page/123? anchor = foo # foo'와 같이 URL에 표시됩니다. 또한 각 페이지에 코드를 추가해야하므로 매우 일반적이지 않습니다. – RJo

+0

@rjokelai 나는 항상 내 응용 프로그램의 모든 페이지를 하위 클래스로 분류하는 기본 페이지를 가지고 있으므로 절대로 문제가되지 않습니다. 이 패턴은 앵커 매개 변수가 주석 ID이고 URL에 표시되도록하는 콘텐츠 페이지에서 문제가되지 않았습니다. 그러나 렌더링 시간 만 솔루션을 찾고 있다면 wicket6과 추가 # 문자를 추가하고 매개 변수 목록의 끝에 앵커 태그를 이동하는 사용자 정의 PageParameterEncoder를 사용하는 해결책이 유일한 옵션입니다. apache.issues.org의 기능 요청 티켓을 여는 것이 좋습니다. – cserepj

+0

Wicket 1.5에서도'PageParametersEncoder'가 오버라이드 될 수 있다고 생각합니다. 이것은'MountedMapper'에 매개 변수로 전달되기 때문입니다. 나는 URL을 조금 더 못하게 만들지 만 자바 스크립트 솔루션과 함께 갈 것이라고 생각한다. :) – RJo

0

당신은 페이지의 URL을 요청하고 다음 코드 페이지에로드에 지정된 앵커에 페이지를 중점 대상 페이지의 HTML에 자바 스크립트 코드 조각을 렌더링

String fullUrl = RequestCycle.get().getUrlRenderer() 
    .renderFullUrl(Url.parse((String) urlFor(RedirectPage.class,parameters))); 
setResponsePage(new RedirectPage(fullUrl+"#anchor")); 
+0

니스,하지만 Wicket은 'org.apache.wicket.markup.html.pages.RedirectPage 클래스에서 페이지를 만들 수 없습니다. 클래스에 보이는 기본 컨스트럭터가 없습니다. ' 왜냐하면 존재하지 않는'RedirectPage (PageParameters)'생성자로'RedirectPage'를 인스턴스화하려고하기 때문입니다. – RJo

+0

또한,'fullUrl'은'http : // localhost : 8080/...'을 포함하고있는 것 같습니다. 실제 환경에서 실제로 작동합니까? – RJo

+0

어쩌면 다른 개찰판 버전 나는 달리고있다 012 – osdamv

관련 문제