我有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对象处理?
答案 0 :(得分:5)
解决方案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和其他一些类,但我认为它太复杂了,在您的情况下没有必要。