代码之家  ›  专栏  ›  技术社区  ›  jamiebarrow

关于绑定到会话bean的jsf immediate=“true”

  •  1
  • jamiebarrow  · 技术社区  · 14 年前

    我有一个 列表页 去一个 添加页面 . 添加页有一个 名称文本框 其值绑定到 会话范围bean .

    列表页有一个 添加按钮 它通过一个action方法进入add页面。此操作方法清除名称文本框绑定到的对象。

    我还有一个 取消按钮 在“添加”页上,它绑定到一个操作方法,该方法再次清除“名称”文本框绑定到的值。

    如果没有设置为立即,这一切都可以正常工作。

    但是,如果我将cancel按钮设置为immediate,如果我在name字段中输入值,然后单击cancel,就会触发action方法并清除backing bean中的对象,然后转到清单页。如果单击“添加”,则action方法将再次清除对象(如果它是最佳方法或不是最佳方法,则忽略),然后转到“添加”页。我现在希望add page的name文本框是空的,但不是吗?!当然,因为add按钮不是立即的,所以值应该重新绑定并为空?

    下面是列表页上add按钮的相关xhtml

    <h:commandButton id="addButton"
                     value="Add"
                     action="#{myBean.gotoAdd}"/>
    

    下面是add页面上输入框的相关xhtml(mybean是会话范围的),后面是add页面上的cancel按钮。

    <h:inputText id="newName"
                 value="#{myBean.newObject.name}"
                 binding="#{myBean.newNameInput}"
                 styleClass="name" />
    
    <h:commandButton id="cancelButton"
                     value="Cancel" immediate="true"
                     action="#{myBean.cancelAdd}"
                     onclick="return confirm('You sure?');"/>
    
    4 回复  |  直到 9 年前
        1
  •  2
  •   Naganalf    14 年前

    我几乎从不使用 binding 标记的属性,除非我需要标识列表中的哪个项对其触发了操作,所以我对其使用情况不是特别了解。但我知道不用 结合 你的代码很可能会像你所期望的那样工作,所以我的期望是 javax.faces.component.UIxxx 绑定到的对象未正确重置。

        2
  •  1
  •   Marko Mitrović    14 年前

    我现在也有类似的问题。

    除了删除binding和/或immediate属性外,请尝试在单击“添加”按钮时调用binding from action的组件上调用setSubmittedValue()。

    唉,即使它对你有帮助,你仍然需要在任何可能导致在取消后显示相同组件的操作中执行它。

    这就是为什么我还在想办法…

        3
  •  0
  •   kpolice    14 年前

    如果使用immediate=“true”,那么值将被保留,这就是参数的工作方式。您应该查看以下链接:

    http://wiki.apache.org/myfaces/How_The_Immediate_Attribute_Works

    http://wiki.apache.org/myfaces/ClearInputComponents

        4
  •  0
  •   jamiebarrow    14 年前

    好吧,这是我从头开始做的一个例子。我有两个取消按钮,一个是立即的,另一个不是。复制步骤示例:

    • 转到james列表页并单击add
    • “添加”页显示空字段。输入所有字段的值,然后单击“添加”。
    • 此时将显示并更新列表页以包含新人员。单击“添加”。
    • “添加”页显示空字段。为所有字段输入值,然后单击“取消”(立即)
    • 此时将显示“列表”页,且该页保持不变。单击“添加”。
    • “添加”页面将显示,但是字段并不像我所期望的那样是空的。单击“取消”。
    • 此时将显示“列表”页,且该页保持不变。单击“添加”。
    • 此时将显示“添加”页,并且字段不为空。

    James.java:

    package com.jamiebarrow;
    
    import java.util.ArrayList;
    import java.util.List;
    import javax.faces.bean.ManagedBean;
    import javax.faces.bean.SessionScoped;
    import javax.faces.component.UIComponent;
    
    @ManagedBean
    @SessionScoped
    public class James {
    
      private UIComponent idComponent;
      private UIComponent firstNameComponent;
      private UIComponent lastNameComponent;
    
      public UIComponent getIdComponent() {
        return idComponent;
      }
    
      public void setIdComponent(UIComponent idComponent) {
        this.idComponent = idComponent;
      }
    
      public UIComponent getFirstNameComponent() {
        return firstNameComponent;
      }
    
      public void setFirstNameComponent(UIComponent firstNameComponent) {
        this.firstNameComponent = firstNameComponent;
      }
    
      public UIComponent getLastNameComponent() {
        return lastNameComponent;
      }
    
      public void setLastNameComponent(UIComponent lastNameComponent) {
        this.lastNameComponent = lastNameComponent;
      }
    
      private List<Person> personResults;
    
      private Person person;
    
      public James() {
        personResults = new ArrayList();
        personResults.add(new PersonBuilder(1, "Bob", "Uncle").build());
        personResults.add(new PersonBuilder(2, "Jack", "Black").build());
      }
    
      public List<Person> getPersonResults() {
        return personResults;
      }
    
      public void setPersonResults(List<Person> personResults) {
        this.personResults = personResults;
      }
    
      public Person getPerson() {
        return person;
      }
    
      public void setPerson(Person person) {
        this.person = person;
      }
    
      private void clearPerson() {
        person = new PersonBuilder().build();
      }
    
      public String gotoList() {
        return "james-list";
      }
    
      public String gotoAdd() {
        clearPerson();
        return "james-add";
      }
    
      public String cancelAdd() {
        clearPerson();
        return gotoList();
      }
    
      public String addPerson() {
        personResults.add(person);
        return gotoList();
      }
    }
    

    james-list.xhtml文件:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE html
        PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"
          xmlns:ui="http://java.sun.com/jsf/facelets"
          xmlns:f="http://java.sun.com/jsf/core"
          xmlns:h="http://java.sun.com/jsf/html">
    <h:head>
      <title>list page</title>
    </h:head>
    
    <body>
    <div class="container">
      <div class="content">
        <h:messages showSummary="true" showDetail="false" errorClass="error" infoClass="info"
                    warnClass="warn"/>
        <h:form>
          <h:dataTable value="#{james.personResults}" var="person">
            <h:column>
              <f:facet name="header">Id</f:facet>
              <h:outputText value="#{person.id}"/>
            </h:column>
            <h:column>
              <f:facet name="header">Name</f:facet>
              <h:outputText value="#{person.firstName}"/>
            </h:column>
            <h:column>
              <f:facet name="header">Surname</f:facet>
              <h:outputText value="#{person.lastName}"/>
            </h:column>
          </h:dataTable>
          <h:panelGroup layout="block">
            <h:commandButton value="Add" action="#{james.gotoAdd}"/>
          </h:panelGroup>
        </h:form>
      </div>
    </div>
    <ui:debug hotkey="L" rendered="true"/>
    </body>
    </html>
    

    james-add.xhtml:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE html
        PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"
          xmlns:ui="http://java.sun.com/jsf/facelets"
          xmlns:f="http://java.sun.com/jsf/core"
          xmlns:h="http://java.sun.com/jsf/html">
    <h:head>
      <title>add page</title>
    </h:head>
    
    <body>
    <div class="container">
      <div class="content">
        <h:messages showSummary="true" showDetail="false" errorClass="error" infoClass="info"
                    warnClass="warn"/>
        <h:form>
          <fieldset>
            <legend>Add Person</legend>
            <h:panelGrid columns="2">
              <h:outputLabel for="PersonId" value="Id:"/>
              <h:inputText id="PersonId" value="#{james.person.id}" binding="#{james.idComponent}"/>
              <h:outputLabel for="PersonFirstName" value="First Name:"/>
              <h:inputText id="PersonFirstName" value="#{james.person.firstName}" binding="#{james.firstNameComponent}"/>
              <h:outputLabel for="PersonLastName" value="Last Name:"/>
              <h:inputText id="PersonLastName" value="#{james.person.lastName}" binding="#{james.lastNameComponent}"/>
            </h:panelGrid>
            <h:panelGroup layout="block">
              <h:commandButton value="Add" action="#{james.addPerson}"/>
              <h:commandButton value="Cancel (immediate)" action="#{james.cancelAdd}" immediate="true"/>
              <h:commandButton value="Cancel" action="#{james.cancelAdd}"/>
            </h:panelGroup>
          </fieldset>
        </h:form>
      </div>
    </div>
    <ui:debug hotkey="L" rendered="true"/>
    </body>
    </html>