使用来自多个selectOneMenus和按钮的内容填充inputTextArea

时间:2011-10-13 13:41:06

标签: java jsf jsf-2

我想构建一个小UI,它将为用户提供以更简单的方式编写一些数学公式的可能性(因此UI),并能够将它们保存到.txt(或类似的)文件中。

例如:我有3个选择框,提供各种选项,一些代表数学运算的按钮和一个inputTextArea。到目前为止,我已设法链接每个selectOneMenu和几个inputText中的选定内容,并将它们与我需要的内容连接起来,并将创建的数学公式写入.txt文件。

现在我想让用户可以看到他正在编写的公式(通过选择内容并按下按钮)。到目前为止,我一直在尝试使用inputTextArea来做到这一点,但我管理的最好的方法是将所选内容从只有一个 selectOneMenu传输到textArea,然后我尝试将所有操作添加到用户使文本区域失败(有人建议使用<h:panelGroup>,但我无处可去,我试图将我用来填充菜单的所有bean组合成一个bean,并以某种方式从那里开始,但是没有工作要么)。

到目前为止我一直在研究的JSF部分样本,包含2个选择框和TextArea:

<h:outputText value="Formula Name"></h:outputText>
<h:inputText value="#{output.formulaName}" id="formulaName"></h:inputText>              
<br /><br />

The formula so far:
<h:inputTextarea value="#{output.propertyReferenceValue}"></h:inputTextarea>
<br/><br/><br/>

Property1:
<h:selectOneMenu  value ="#{output.propertyReferenceValue}" id="selectTwo"  
    valueChangeListener="#{output.propertyReferenceValueChanged}" onchange="submit()">
    <f:selectItems value="#{property.propertyReference}"/>              
</h:selectOneMenu>
<br/><br/>
Property2:         
<h:selectOneMenu value ="#{output.property2ReferenceValue}" id="selectThree"  
    valueChangeListener="#{output.property2ReferenceChangedValue}" onchange="submit()">
    <f:selectItems value="#{property2.property2Refference}" />            
</h:selectOneMenu>

任何帮助将不胜感激。

PS。我是JSF的新手(大约2天前开始),所以即使被指出可能涉及这个或类似问题的一些文档,我也会感激。

1 个答案:

答案 0 :(得分:0)

你基本上在这里滥用valueChangeListener。您对价值变化并不完全感兴趣(即您对两者旧价值和新价值不感兴趣),您只对提交的价值感兴趣。当你没有/不能/不会使用基于ajax的组件库时,这在JSF 1.x中是可以容忍的。有(相当复杂)的方法可以用valueChangeListener修复你的特定问题,但在JSF 2.x中,它带有内置的ajax功能,这实际上不能再用这种方式了。您应该使用<f:ajax>标记来引入异步提交和部分更新。

重写您的观点如下:

Formula name:
<h:inputText value="#{output.formulaName}" id="formulaName" />
<br/><br/>

The formula so far:
<h:inputTextarea id="formula" value="#{output.propertyReferenceValue}#{output.property2ReferenceValue}"></h:inputTextarea>
<br/><br/>

Property1:
<h:selectOneMenu value="#{output.propertyReferenceValue}" id="selectTwo">
    <f:selectItems value="#{property.propertyReference}"/>
    <f:ajax render="formula" />
</h:selectOneMenu>
<br/><br/>

Property2:         
<h:selectOneMenu value ="#{output.property2ReferenceValue}" id="selectThree">
    <f:selectItems value="#{property2.property2Refference}" />            
    <f:ajax render="formula" />
</h:selectOneMenu>

这就是全部。您的#{output} bean应放在@ViewScoped的视图范围内。不需要addidional listener方法。只有当你想在显示它之前操纵它们时,你需要一个ajax监听器。 E.g。

Formula name:
<h:inputText value="#{output.formulaName}" id="formulaName" />
<br/><br/>

The formula so far:
<h:inputTextarea id="formula" value="#{output.formula}"></h:inputTextarea>
<br/><br/>

Property1:
<h:selectOneMenu value="#{output.propertyReferenceValue}" id="selectTwo">
    <f:selectItems value="#{property.propertyReference}"/>
    <f:ajax listener="#{output.calculateFormula}" render="formula" />
</h:selectOneMenu>
<br/><br/>

Property2:         
<h:selectOneMenu value ="#{output.property2ReferenceValue}" id="selectThree">
    <f:selectItems value="#{property2.property2Refference}" />            
    <f:ajax listener="#{output.calculateFormula}" render="formula" />
</h:selectOneMenu>

例如(这个启动示例对逗号进行了简单的连接,但您可以完全自由地按照自己的方式构建formula值):

public void calculateFormula() {
    formula = propertyReferenceValue + ", " + property2ReferenceValue;
}