Apache Wicket中一个类的多个路径

时间:2013-12-25 17:55:51

标签: java wicket wicket-1.5

我有Wicket应用程序,在WebApplication中我做了:

public class AppStart extends WebApplication{

    public AppStart(){
    }

    @Override
    protected void init(){
        super.init();
        mountPage("/index.html", StandardPage.class);
        mountPage("/another.html", StandardPage.class);
    }
}

但是当我访问/index.html时,我被重定向到/another.html页面。一直以为在创建页面的那一刻,StandardPage.class会被实例化,所以这两个页面将由两个独立的StandardPage.class对象处理?

1 个答案:

答案 0 :(得分:5)

是的,这是真的。 Wicket有自己复杂的URL处理机制以及如何将浏览器重定向到特定目标。在Wicket中,使用两个或多个不同的路径来安装相同的页面类(默认情况下)。

解决方案1 ​​

如果您真的想在不同的网址上获得相同的功能,使用简单的后代

public class StandardPage2 extends StandardPage {
    //... define the same constructors from StandardPage
}

您的代码

@Override
protected void init(){
    super.init();
    mountPage("/index.html", StandardPage.class);
    mountPage("/another.html", StandardPage2.class);
}

不要忘记正确使用

setResposonsePage(StandardPage.class); 

setResposonsePage(StandardPage2.class);

解决方案2

以下示例显示如何将页面参数用作URL的一部分。 让我们在数据库中有用户,每个用户都有自己的页面,可以通过唯一的URL访问。 此外,每个用户都可以执行一些可选操作,操作名称包含在URL中,并且还有一些其他页面安装到自己的URI中。 所以URI应该看起来像

/home 
/login 
/logout 
/martin 
/martin/edit 
/martin/detail 
/petr
/petr/edit 
/petr/detail
/
/texts/my-super-article-1
/texts/my-super-article-2
/events/actual
/fotos/from-my-first-holiday
/fotos/from-my-second-holiday

在这种情况下,可以使用在Wicket中实现的默认MontedMapper。 映射是

mountPage("/home", HomePage.class);
mountPage("/login", LoginPage.class);
mountPage("/logout", LogoutPage.class);
mountPage("/${nick}/${action}", UserProfilePage.class);
mountPage("/texts/${page}", TextPages.class);
mountPage("/events/${page}", EventPages.class);
mountPage("/fotos/${page}", FotoPages.class);

您必须使用PageParameters

实现UserProfilePage及其构造函数
public class UserProfilePage extends WebPage {

     public UserProfilePage(PageParameters pageParameters) {
         super(pageParameters);
         StringValue nick = pageParameters.get("nick");
         StringValue action = pageParameters.get("action");
         // any code
         String nickName = nick.toString();
         boolean defaultAction = action.isEmpty(); // default action
     }

}

解决方案3

此外,您可以覆盖IRequestMapper和其他一些类,但我认为它太复杂了,在您的情况下没有必要。