gpt4 book ai didi

java - Wicket LoadableDetachableModel 更新问题

转载 作者:行者123 更新时间:2023-12-01 15:55:21 25 4
gpt4 key购买 nike

我有 3 个 LoadableDetachableModel。在他们的加载方法中,我调用全局变量(同一类)。在两种情况下,模型工作得很好(方法 testModel1(); 和 testModel3();)。

但是!在 testModel2() 中;是第一次调用此页面后的剩余值。

我需要解释这怎么可能。

一开始我以为ResourceReference在init之后就不能改变了。然而方法 testModel3() 证明了我并非如此。 (此方法工作正常)。

pastebin.com 上的链接: http://pastebin.com/jiFVWMMW

输出:

构造对象在 testModel1 中值 = 25.26.609在 testModel2 中值 = 25.26.609在 testModel2 中值 = 25.26.609在 testModel3 中值 = 25.26.671在 testModel3 中值 = 25.26.671构造对象在 testModel1 中值 = 25.31.625在 testModel2 中值 = 25.26.609在 testModel2 中值 = 25.26.609在 testModel3 中值 = 25.31.640在 testModel3 中值 = 25.31.640构造对象在 testModel1 中值 = 25.32.125在 testModel2 中值 = 25.26.609在 testModel2 中值 = 25.26.609在 testModel3 中值 = 25.32.140在 testModel3 中值 = 25.32.140

代码:

package app.web;

import java.util.HashMap;
import java.util.Map;
import org.apache.wicket.Resource;
import org.apache.wicket.ResourceReference;
import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.resources.StyleSheetReference;
import org.apache.wicket.model.LoadableDetachableModel;
import org.apache.wicket.util.resource.IResourceStream;
import org.apache.wicket.util.resource.StringResourceStream;
import org.apache.wicket.util.time.Time;
import org.wicketstuff.annotation.mount.MountPath;

/**
* HomePage
*/
@MountPath(path = "home")
public final class HomePage extends WebPage {

private static final long serialVersionUID = 1L;
private static final String DATE_FORMAT = "mm.ss.SS";
transient private final Map cssMap;

public HomePage() {
System.out.println("Constructing object");
cssMap = new HashMap();
cssMap.put("time", Time.now().toString(DATE_FORMAT));
}

@Override
protected void onBeforeRender() {
testModel1();
testModel2();
testModel3();
super.onBeforeRender();
}

/**
* working just fine
*/
private void testModel1() {
add(new Label("message1", new LoadableDetachableModel() {

private static final long serialVersionUID = 1L;

@Override
protected String load() {
System.out.println("in testModel1 value = " + ((String) cssMap.get("time")));
return ((String) cssMap.get("time"));
}
}));
}

/**
* DOES NOT UPDATE!!!! (load is being called, but cssMap has original value. WTF?!
*/
private void testModel2() {
add(new StyleSheetReference("cssReference", new ResourceReference("testcss.css") {

private static final long serialVersionUID = 1L;

@Override
protected Resource newResource() {
return new Resource() {

private static final long serialVersionUID = 1L;

@Override
public IResourceStream getResourceStream() {
LoadableDetachableModel LDM = new LoadableDetachableModel() {

private static final long serialVersionUID = 1L;

@Override
protected String load() {
System.out.println("in testModel2 value = " + ((String) cssMap.get("time")));
return ((String) cssMap.get("time"));
}
};

return new StringResourceStream(LDM.getObject());
}
};
}
}));
}

/**
* work just fine - StyleSheet is changing...
*/
private void testModel3() {
add(new StyleSheetReference("cssReference2", new ResourceReference("testcss2.css") {

private static final long serialVersionUID = 1L;

@Override
protected Resource newResource() {
return new Resource() {

private static final long serialVersionUID = 1L;

@Override
public IResourceStream getResourceStream() {
LoadableDetachableModel LDM = new LoadableDetachableModel() {

private static final long serialVersionUID = 1L;

@Override
protected String load() {
System.out.println("in testModel3 value = " + Time.now().toString(DATE_FORMAT));
return Time.now().toString(DATE_FORMAT);
}
};

return new StringResourceStream(LDM.getObject());
}
};
}
}));
}
}

html 标记:

<html xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd" >


<link wicket:id="cssReference"/>
<link wicket:id="cssReference2"/>


<body>

message1 will be here
</body>
</html>

testcss.css:${时间}

testcss2.css:${时间}

最佳答案

LoadableDetachableModel LDM = new LoadableDetachableModel()

这个模型永远不会分离,也不绑定(bind)到组件。当组件分离时,组件绑定(bind)模型会自动分离,该模型永远不会分离,因此值始终保持不变。

如果你像这样重组你的类,它应该可以工作:

// model should be a field, so detachModels() can see it
private IModel<String> LDM = new LoadableDetachableModel<String>() {

private static final long serialVersionUID = 1L;

@Override
protected String load() {
System.out.println("in testModel3 value = " + Time.now().toString(DATE_FORMAT));
return Time.now().toString(DATE_FORMAT);
}
};

public void detachModels() {
super.detachModels();
// detach the model
LDM.detach();
}

private void testModel3() {
add(new StyleSheetReference("cssReference2", new ResourceReference("testcss2.css") {

private static final long serialVersionUID = 1L;

@Override
protected Resource newResource() {
return new Resource() {


private static final long serialVersionUID = 1L;

@Override
public IResourceStream getResourceStream() {
return new StringResourceStream(LDM.getObject());
}
};
}
}));
}

关于java - Wicket LoadableDetachableModel 更新问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5188433/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com