Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Wicket 1.5(.2)中url更改时未重新加载组件?_Java_Wicket_Wicket 1.5 - Fatal编程技术网

Java Wicket 1.5(.2)中url更改时未重新加载组件?

Java Wicket 1.5(.2)中url更改时未重新加载组件?,java,wicket,wicket-1.5,Java,Wicket,Wicket 1.5,我第一次使用以下URL导航到我的应用程序: …/homepage/?0&user=x 在调试模式下,我看到wicket很好地实例化了我的面板等等(显然) 如果我将URL更改为: …/homepage/?0&user=y 然后什么也不会发生,面板不会被重新初始化(因为新用户=>user x的数据仍然显示),也不会被LoadableDetaccable调用,或者调用其他模型 但是,如果我将URL更改为: …/homepage/?1&user=y 然后为用户y 更进一步,如果您将URL更改回 …/ho

我第一次使用以下URL导航到我的应用程序:

…/homepage/?0&user=x

在调试模式下,我看到wicket很好地实例化了我的面板等等(显然)

如果我将URL更改为:

…/homepage/?0&user=y

然后什么也不会发生,面板不会被重新初始化(因为新用户=>user x的数据仍然显示),也不会被LoadableDetaccable调用,或者调用其他模型

但是,如果我将URL更改为:

…/homepage/?1&user=y

然后为用户y

更进一步,如果您将URL更改回

…/homepage/?0&user=y

然后再次显示用户x的数据


Wicket似乎并不关心URL中的参数是否已更改以决定是否重新加载组件。好了,这在Wicket 1.4中运行得很好。我想我理解这种行为背后的逻辑,但不确定。另外,我想知道如果自定义参数发生更改,如何强制Wicket重新加载,以及如何从URL中删除“丑陋的”?0(如果可能)?

这是Wicket的状态特性。页面被实例化一次,参数被解析等等。稍后,您会将不同的参数传递给已经实例化的页面,但这次根本不会调用其构造函数,因此不会更新页面参数。更改为?1会向Wicket请求id为1的页面,因为没有这样的Wicket会实例化一个新实例并传递新参数。如果希望始终拥有最新的请求参数,请使用getRequest().getRequestParameter(“用户”),它将为您提供所需的信息。
有意义吗?

修改martin-g的答案:您应该在模型中检索请求参数,并使用请求参数检索正确的用户。比如:

setModel(new LoadableDetachableModel<User>(){
    public User load() {
        String username = getRequest().getRequestParameter("user");
        return userservice.byUsername(username);
    }
}));
setModel(新的LoadableDetachableModel(){
公共用户加载(){
字符串username=getRequest().getRequestParameter(“用户”);
返回userservice.byUsername(username);
}
}));

当您需要动态数据时,几乎总是使用模型来解决问题。

我认为您可以使用
onRender
onConfigure

我可以用自己的应用程序重现这种行为。RequestLogger使用旧的pageID打印出一个新的请求,但pageID参数已更改。我猜这种行为是故意的,因为您仍然请求相同的旧pageID。然而,我也对从url中删除丑陋的pageID感兴趣…尝试将我的应用程序部署为“部署”-构建,但仍然获得了pageID。“我认为这只是为了发展。”罗奇感谢你的尝试;我自己还没有想到这一点。只是在AbstractBookmarkableMapper.mapRequest中注意到了一点:如果有一个pageId(?0),那么它将调用processHybrid,javadoc提到:“如果URL中有页面实例信息,我们需要尝试重用现有的页面实例。这很有意义,但是我应该在哪里调用getRequest().getRequestParameter?”(“用户”)如果Wicket根本不调用我的构造函数?我也有点不喜欢可书签页面中的新PageID,对于最终用户来说,Wicket 1.4的行为更符合逻辑。@TheStijn:onConfigure()/onBeforeRender()。@bert:这与1中的HybridUrlCodingStrategy一样。4@Martin-g、 tx,我来试试这个。