Java 2引用同一字段的互斥InputComponents正在更新同一字段两次

Java 2引用同一字段的互斥InputComponents正在更新同一字段两次,java,jsf,render,visible,Java,Jsf,Render,Visible,我有一个带有2个JSF输入组件的屏幕:inputText和inputText with suggestionBox。它们都绑定到同一字段,但只有一个字段可见/呈现(互斥) 问题是,如果我在其中写入一些内容,然后提交,那么另一个未显示的组件将使用它的值(空字符串或null)更新模型(同一字段再次更新)。为了解决这个问题,我在类中创建了另一个字段,这样两个组件就不会引用同一个字段 我不喜欢这样,因为我正在修改模型以解决GUI问题 我怎么能有2个互斥输入 引用相同值的组件 我想干什么就干什么 关键是使

我有一个带有
2个JSF输入组件的屏幕
inputText
inputText with suggestionBox
。它们都绑定到同一字段,但只有一个字段可见/呈现(互斥)
问题是,如果我在其中写入一些内容,然后提交,那么另一个未显示的组件将使用它的值(空字符串或null)更新模型(同一字段再次更新)。为了解决这个问题,我在类中创建了另一个字段,这样两个组件就不会引用同一个字段
我不喜欢这样,因为我正在修改模型以解决GUI问题

我怎么能有2个互斥输入 引用相同值的组件 我想干什么就干什么


关键是使用“渲染”属性来显示/隐藏组件,以便一次只有一个或另一个组件在实际更新模型。下面是一个非常基本的例子来说明:

<h:form id="exampleForm" prependId="false">

    <h:inputText id="test1" value="#{exampleBean.testString}" rendered="#{exampleBean.toggle}" style="border: 1px solid red;" />
    <h:inputText id="test2" value="#{exampleBean.testString}" rendered="#{!exampleBean.toggle}" style="border: 1px solid blue;" />

    <h:commandButton id="testButton" action="#{exampleBean.toggle()}" />

</h:form>

正如我所说的,我不能使用rendered,因此在这种情况下,使用
readonly true
visible false
可以提供我需要的行为。谢谢。

它应该可以工作。当您说“未显示的组件”时,我假设您正在使用rendered=“false”控制它,实际上在ADF面中是
visible=false
。由于某种原因,我们不允许使用渲染。visible=false的输入文本我认为用于通过屏幕上不需要的请求传递值。有没有解决办法,可以获得与渲染相同的行为?visible=false+readonly=true或类似的东西?我对ADF面一无所知,但我无法想象它们会取消对渲染属性的支持。这对于JSF来说相当重要。我将进行一些研究,因为问题似乎是您并没有真正从渲染阶段移除组件——您只是使其不可见。渲染属性存在,但我们无法使用它。我知道它是用html呈现的,有一些css使它隐藏起来。为什么你不能使用它呢?这是什么将解决你所张贴的问题?你是否有一个团队领导在童年时有过不好的经历?这确实是解决上述问题的唯一优雅的方法(而且非常容易实现)。
@ManagedBean(name = "exampleBean")
@ViewScoped
public class ExampleBean {

    private String testString;

    public String getTestString() { return testString; }

    public void setTestString(String testString) { 
        this.testString = testString; 
        System.out.println(testString);
    }

    private boolean toggle;

    public boolean isToggle() { return toggle; }
    public void setToggle(boolean toggle) { this.toggle = toggle; }

    public void toggle() {
        toggle = (toggle) ? false : true;
    }

}