jsf immediate=";“真的”;关于会话bean的绑定

jsf immediate=";“真的”;关于会话bean的绑定,jsf,immediate-attribute,Jsf,Immediate Attribute,我有一个进入添加页面的列表页面。添加页面有一个名称文本框,其值绑定到会话范围的bean 列表页面有一个add按钮,它通过一个action方法进入add页面。此操作方法清除名称文本框绑定到的对象 我在add页面上还有一个cancel按钮,它绑定到一个action方法,该方法再次清除name textbox绑定到的值 如果未将任何内容设置为立即,则一切正常 但是,如果我将cancel按钮设置为immediate,如果我在name字段中输入值,然后单击cancel,则会触发action方法并清除bac

我有一个进入添加页面的列表页面。添加页面有一个名称文本框,其值绑定到会话范围的bean

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

我在add页面上还有一个cancel按钮,它绑定到一个action方法,该方法再次清除name textbox绑定到的值

如果未将任何内容设置为立即,则一切正常

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

下面是清单页面上添加按钮的相关XHTML

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

下面是添加页面上输入框的相关XHTML(myBean是会话范围),然后是添加页面上取消按钮的XHTML:

<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?');"/>

我几乎从不使用标签的
绑定
属性,除非我需要确定列表中的哪个项目触发了操作,所以我对它的用法不是特别了解。但是我知道,如果不使用
绑定
,您的代码很可能会像您预期的那样工作,因此我的预期是,您绑定到的任何
javax.faces.component.UIxxx
对象都无法正确重置。

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


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

  • 转到james列表页面并单击添加
  • 添加页面显示为空字段。为所有字段输入值,然后单击“添加”
  • 将显示并更新列表页面,以包含新的人员。单击添加
  • 添加页面显示为空字段。为所有字段输入值,然后单击“取消”(立即)
  • 此时将显示列表页面,并且该页面保持不变。单击添加
  • 添加页面会显示,但字段并不像我预期的那样为空。单击取消
  • 此时将显示列表页面,并且该页面保持不变。单击添加
  • 此时将显示“添加”页面,现在字段不是空的
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();
  }
}
package com.jamiebarrow;
导入java.util.ArrayList;
导入java.util.List;
导入javax.faces.bean.ManagedBean;
导入javax.faces.bean.SessionScoped;
导入javax.faces.component.UIComponent;
@ManagedBean
@会议范围
公共课詹姆斯{
私有UIComponent-idComponent;
私有UIComponent firstNameComponent;
私有UIComponent lastNameComponent;
公共UIComponent getIdComponent(){
返回组件;
}
公共void setIdComponent(UIComponent idComponent){
this.idComponent=idComponent;
}
公共UIComponent getFirstNameComponent(){
返回firstNameComponent;
}
公共void setFirstNameComponent(UIComponent firstNameComponent){
this.firstNameComponent=firstNameComponent;
}
公共UIComponent getLastNameComponent(){
返回lastNameComponent;
}
公共void setLastNameComponent(UIComponent lastNameComponent){
this.lastNameComponent=lastNameComponent;
}
私人名单个人结果;
私人;
公共服务{
personResults=new ArrayList();
添加(新的PersonBuilder(1,“Bob”,“叔叔”).build());
添加新的PersonBuilder(2,“Jack”,“Black”).build();
}
公共列表getPersonResults(){
返回结果;
}
public void setPersonResults(列出personResults){
this.personResults=personResults;
}
公众人物{
返回人;
}
公众人士{
这个人=人;
}
私人{
person=新建PersonBuilder().build();
}
公共字符串gotoList(){
返回“詹姆斯名单”;
}
公共字符串gotoAdd(){
clearPerson();
返回“jamesadd”;
}
公共字符串cancelAdd(){
clearPerson();
返回哥特派();
}
公共字符串addPerson(){
personResults.add(person);
返回哥特派();
}
}
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>

添加页面
添加人

我现在也有类似的问题

除了删除binding和/或immediate属性外,还可以尝试在组件上调用setSubmittedValue(),该组件的binding from操作是在单击“add”按钮时调用的

唉,即使它对您有所帮助,您仍然必须在任何可能导致在取消后显示相同组件的操作中执行此操作


这就是为什么我仍在试图找到更好的解决方案…

我们能看到相关的bean代码吗?我很想知道您是如何清除值的,以及您使用了
绑定属性来做什么的。@BaslusC在本例中,我没有使用绑定属性来做任何事情,删除它可以解决问题。在某些情况下,我确实希望绑定组件,以便根据preRenderComponent事件中当前输入/选择的值隐藏/显示组件。我通过在中创建一个新的空白实例来清除该值