JSF请求范围->;如何归档最新列表以及从表到对象的可靠映射?
嗨,我在玩JSF2.1 我有以下处理程序JSF请求范围->;如何归档最新列表以及从表到对象的可靠映射?,jsf,scope,Jsf,Scope,嗨,我在玩JSF2.1 我有以下处理程序 @Controller("testHandler") @Scope("request") public class TestHandler { public class EntityObject { public EntityObject(String value) { this.value = value; } private String value = "";
@Controller("testHandler")
@Scope("request")
public class TestHandler {
public class EntityObject {
public EntityObject(String value) {
this.value = value;
}
private String value = "";
public String getValue() {
return value;
}
public void setValue(String value) {
log.info(this + " Set value from " + this.value + " to " + value);
this.value = value;
}
}
private Logger log = Logger.getLogger(getClass());
private List<EntityObject> objects = new ArrayList<TestHandler.EntityObject>();
@PostConstruct
public void init() {
log.info("INIT");
// addItem("O0");
addItem("O1");
addItem("O2");
addItem("O3");
}
private void addItem(String name) {
EntityObject e = new EntityObject(name);
log.info("add " + e + " with value " + name);
objects.add(e);
}
public List<EntityObject> getObjects() {
return objects;
}
public void setObjects(List<EntityObject> objects) {
this.objects = objects;
}
}
- 我看到有3个输入字段的表
- 我在每个值的末尾加上“change”
- 我在init方法中取消了对“addItem(“O0”);”的注释
- 我点击提交按钮
添加equals和hashcode函数没有帮助事实上,JSF并没有更新错误的对象。引用著名文章 @RequestScoped:此作用域中的bean的寿命与HTTP相同 请求-响应生命周期。它根据HTTP请求创建并获取 当与HTTP请求关联的HTTP响应被删除时销毁 已完成(这也适用于ajax请求!) 因此,当你点击“点击”按钮时,你的bean被销毁并创建;在初始化期间,它初始化EntityObject数组,因此无法保存状态
您可以阅读不同类型范围的链接,选择最适合您兴趣的范围。如果您没有特定的案例,可能会对您有所帮助。看起来您在错误地使用请求范围。它不适用于可更新的数据。 请求范围中的bean是为每个请求(按钮按下,甚至AJAX调用)创建的 当您点击提交按钮时,JSF将创建新的请求,并且您的请求范围bean将被删除。但是因为您停留在同一个页面上,所以JSF DataTable bean没有被破坏,它将遍历所有组件并更新值 注意,此时JSF表bean有三个InputText组件,它将更新它们:即,只更新列表中的前三项。JSF没有将完整的数据保存在组件中(浪费内存),只是引用。。所以这里有一件有趣的事情:如果在second Init()中创建两个项,JSF将给您一个错误 下面是对范围的一个很好的解释和指导: 另见:
<h:form>
<h:dataTable value="#{testHandler.objects}" var="object">
<h:column>
<h:inputText value="#{object.value}" />
</h:column>
</h:dataTable>
<h:commandButton value="submit" />
</h:form>
init | INIT
addItem | add TestHandler$EntityObject@41c3cce3 with value O1
addItem | add TestHandler$EntityObject@1dc06cd0 with value O2
addItem | add TestHandler$EntityObject@4427daf2 with value O3
init | INIT
addItem | add TestHandler$EntityObject@5d653eaa with value O0
addItem | add TestHandler$EntityObject@21f53acd with value O1
addItem | add TestHandler$EntityObject@6ae77a25 with value O2
addItem | add TestHandler$EntityObject@30449f8 with value O3
setValue | TestHandler$EntityObject@5d653eaa Set value from O0 to O1change
setValue | TestHandler$EntityObject@21f53acd Set value from O1 to O2change
setValue | TestHandler$EntityObject@6ae77a25 Set value from O2 to O3change