Glassfish抱怨JSF组件ID

时间:2010-06-16 15:45:29

标签: jsf

我是JSF(v2.0)的新手,我正试图在netbeans.org和coreservlets.com这样的地方学习它。我正在研究一个非常简单的“加/减/乘/除”Java webapp,我遇到了一个问题。当我刚开始时,应用程序输入两个数字并点击“+”键,它们将自动添加到一起。现在我增加了更多的复杂性,我无法将操作转移到托管bean。这就是我刚刚“添加”时所拥有的:

<h:inputText styleClass="display" id="number01" size="4" maxlength="3" value="#{Calculator.number01}" />  
<h:inputText styleClass="display" id="number02" size="4" maxlength="3" value="#{Calculator.number02}" />  
<h:commandButton id="add" action="answer" value="+" />  

对于“回答”页面,我会显示如下答案:

<h:outputText value="#{Calculator.answer}" />  

我在Calculator.java托管bean中有适当的getter和setter,操作完美。

现在我已经添加了其他三个操作,我无法可视化如何获取bean的操作参数,以便我可以切换它。我试过这个:

<h:commandButton id="operation" action="answer" value="+" />       
<h:commandButton id="operation" action="answer" value="-" />  
<h:commandButton id="operation" action="answer" value="*" />  
<h:commandButton id="operation" action="answer" value="/" />  

然而,Glassfish抱怨说我已经使用了“操作”一次,我试图在这里使用它四次。

有关如何对托管bean进行多项操作以便它可以执行所需操作的任何adivce /提示?

感谢您抽出宝贵时间阅读。

1 个答案:

答案 0 :(得分:2)

组件id确实应该是唯一的。这是HTML规范隐式要求的。你知道,所有JSF都只是生成适当的HTML / CSS / JS代码。给他们一个不同的id或者只是把它留下来,在这种特定的情况下它没有额外的价值(除非你想把一些CSS / JS挂钩)。

为了达到您的功能要求,您可能会发现f:setPropertyActionListener有用。

<h:commandButton action="answer" value="+">
    <f:setPropertyActionListener target="#{calculator.operation}" value="+" />
</h:commandButton>      
<h:commandButton action="answer" value="-">  
    <f:setPropertyActionListener target="#{calculator.operation}" value="-" />
</h:commandButton>      
<h:commandButton action="answer" value="*">  
    <f:setPropertyActionListener target="#{calculator.operation}" value="*" />
</h:commandButton>      
<h:commandButton action="answer" value="/"> 
    <f:setPropertyActionListener target="#{calculator.operation}" value="/" />
</h:commandButton>      

operation托管bean中有一个属性calculator

private String operation; // +setter.

您可以使用getAnswer()方法访问它并进行相应处理。


或者,让按钮分别指向不同的bean动作但返回所有"answer"

<h:commandButton action="#{calculator.add}" value="+" />      
<h:commandButton action="#{calculator.substract}" value="-" />      
<h:commandButton action="#{calculator.multiply}" value="*" />      
<h:commandButton action="#{calculator.divide}" value="/" />      

calculator托管bean中使用以下方法:

public String add() {
    answer = number1 + number2;
    return "answer";
}

public String substract() {
    answer = number1 - number2;
    return "answer";
}

// etc...

然后让getAnswer()返回answer并在那里不做任何其他事情。这是一个更清晰的责任分离。