2
上沒有正確更改我使用PropertyModel
類和setDefaultModelObject()
方法 來編寫頁面鏈接單擊時更改標籤。 我預計將從「John Doe」更改爲「Jane Smith」。 但它更改爲[email protected]_
。wicket標籤在setDefaultModelObject
這是Wicket的正確行爲嗎? 還是我錯了什麼? 我正在使用Wicket 7.0.0。
ExamplePage.java
package com.mycompany.myproject;
import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.link.Link;
import org.apache.wicket.model.PropertyModel;
public class ExamplePage extends WebPage {
public ExamplePage() {
ScoreBean johnScore = new ScoreBean();
johnScore.setName("John Doe");
johnScore.setScore(79);
final ScoreBean janeScore = new ScoreBean();
janeScore.setName("Jane Smith");
janeScore.setScore(84);
final Label label = new Label("label", new PropertyModel<>(johnScore, "name"));
add(label);
Link link = new Link("link") {
@Override
public void onClick() {
label.setDefaultModelObject(janeScore);
}
};
add(link);
}
}
ExamplePage.html
<!DOCTYPE html>
<html lang="en" xmlns:wicket="http://wicket.apache.org">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<span wicket:id="label"></span>
<a wicket:id="link">Click me</a>
</body>
</html>
ScoreBean.java
package com.mycompany.myproject;
import java.io.Serializable;
public class ScoreBean implements Serializable {
private String name;
private Integer score;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getScore() {
return score;
}
public void setScore(Integer score) {
this.score = score;
}
}
ExamplePageTest.java
package com.mycompany.myproject;
import org.apache.wicket.util.tester.WicketTester;
import org.junit.Before;
import org.junit.Test;
public class ExamplePageTest
{
private WicketTester tester;
@Before
public void setUp()
{
tester = new WicketTester(new WicketApplication());
}
@Test
public void labelChangedCorrectly()
{
tester.startPage(ExamplePage.class);
tester.assertRenderedPage(ExamplePage.class);
tester.clickLink("link");
tester.assertLabel("label", "Jane Smith");
}
}
測試結果。
12:48:16.883 [main] INFO org.apache.wicket.Application - [WicketTesterApplication-77ef7482-95ae-4e94-b274-1e9fcfb961be] init: Wicket core library initializer
12:48:16.887 [main] INFO org.apache.wicket.RequestListenerInterface - registered listener interface [RequestListenerInterface name=IBehaviorListener, method=public abstract void org.apache.wicket.behavior.IBehaviorListener.onRequest()]
12:48:16.891 [main] INFO org.apache.wicket.RequestListenerInterface - registered listener interface [RequestListenerInterface name=IFormSubmitListener, method=public abstract void org.apache.wicket.markup.html.form.IFormSubmitListener.onFormSubmitted()]
12:48:16.892 [main] INFO org.apache.wicket.RequestListenerInterface - registered listener interface [RequestListenerInterface name=ILinkListener, method=public abstract void org.apache.wicket.markup.html.link.ILinkListener.onLinkClicked()]
12:48:16.893 [main] INFO org.apache.wicket.RequestListenerInterface - registered listener interface [RequestListenerInterface name=IOnChangeListener, method=public abstract void org.apache.wicket.markup.html.form.IOnChangeListener.onSelectionChanged()]
12:48:16.894 [main] INFO org.apache.wicket.RequestListenerInterface - registered listener interface [RequestListenerInterface name=IResourceListener, method=public abstract void org.apache.wicket.IResourceListener.onResourceRequested()]
org.junit.ComparisonFailure:
Expected :Jane Smith
Actual :[email protected]
<Click to see difference>
at org.junit.Assert.assertEquals(Assert.java:115)
at org.junit.Assert.assertEquals(Assert.java:144)
at org.apache.wicket.util.tester.WicketTester.assertLabel(WicketTester.java:603)
at com.mycompany.myproject.ExamplePageTest.labelChangedCorrectly(ExamplePageTest.java:24)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:78)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:212)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:68)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)
Process finished with exit code 255
我可能是錯的,但是,這樣做的一個方法是在'ExamplePage'中用'johnScore'設置'compoundPropertyModel',然後將其更改爲'janeScore'。 使用這種方式,他不必使用PropertyModel。只需將標籤的id,屬性的名稱放在'ScoreBean'中即可。 – GustavoCinque