JSF请求范围->;如何归档最新列表以及从表到对象的可靠映射?

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 = "";

嗨,我在玩JSF2.1

我有以下处理程序

@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”);”的注释
  • 我点击提交按钮
->

在日志中,这些值似乎没有分配给以前引用的对象,而jsf似乎只是存储列表的索引并更新错误的对象

更新对象的最佳范围是什么?如何归档最新列表以及从表到对象的可靠映射


添加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