Bean方法从xhtml读取null属性

时间:2013-06-20 20:19:57

标签: jsf jsf-2 binding

我已经在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并且无法更改此内容。

3 个答案:

答案 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>