我已经在Stackoverflow上阅读了很多帖子,但是我没有成功地实现下面提到的问题。
问题是:我需要在<p:inputTextarea>
中键入一些文本,当点击按钮时我需要在bean方法中获取此值。
即:
<p:inputTextarea binding="#{input}"/>
<p:commandButton action="#{pessoaMB.adicionarContato(input.value)}" immediate="true"/>
使用bean方法:
public void adicionarContato(String value) {
System.out.println(value);
}
我正在使用的代码为我提供了null
值。
我正在使用@ViewScoped并且无法更改此内容。
答案 0 :(得分:1)
首先,附注:使用JSF组件是一种不好的做法,您应该使用模型。即不要使用binding="#{input}"
,而是坚持value="#{bean.text}"
。
其次,我怀疑immediate="true"
在您的设置中是否正确使用。在像UICommand
这样的<h:commandButton>
组件中使用时,它将导致跳过 JSF生命周期的组件immediate="false"
(或省略,因为它是默认值),因此他们的根本不会设置value
。不过,在执行操作方法之前,JSF仍会在幕后预设submittedValue
。
此外,我强烈建议您阅读BalusC的博客文章Debug JSF lifecycle,因为它不仅仅是对该主题的启发。
关于解决方案,我建议处理与bean的值绑定,如第一条评论中所示。使用这种方法,您根本不需要操作方法参数。此外,请重新考虑使用immediate
属性。如果您认为这是正确的,那么您有两个选择:(1)在immediate="true"
上使用<p:inputTextarea>
或(2)切换到action="#{bean.action(input.submittedValue)}"
。
答案 1 :(得分:0)
我会这样做的:
<h:form>
<p:inputText value="#{pessoaMB.input}"/>
<p:commandButton value="add" action="#{pessoaMB.adicionarContato}" />
</h:form>
input
这里是一个带有getter和setter的pessoaMB属性(IDE可以自动生成它)。
private String input;
public String getInput() {
return input;
}
public void setInput(String input) {
this.input = input;
}
对于adicionarContato
方法,它将是这样的:
public void adicionarContato() {
System.out.println(input);
}
答案 2 :(得分:0)
您应该创建一个新类,即:
public class MyFields(){
String input1;
String input2; //and so on...
//getters and setters
}
然后,在pessoaMB中创建一个属性:
private MyFields inputFields; //getter and setter
最后,在你的xhtml文件中:
<h:form>
<p:inputText value="#{pessoaMB.inputFields.input1}"/>
<p:inputText value="#{pessoaMB.inputFields.input2}"/>
<!-- add more inputText components... -->
<p:commandButton value="add" action="#{pessoaMB.adicionarContato}" />
</h:form>