0

我在 Stackoverflow 上阅读了很多帖子,但我没有成功地从我这边解决下面提到的问题。

问题是:我需要输入一些文本<p:inputTextarea>,当点击按钮时,我需要在 bean 方法中获取这个值。

IE:

<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 并且无法更改它。

4

3 回答 3

1

首先,附注:使用 JSF 组件是一种不好的做法,您应该使用 model 代替。即不使用binding="#{input}",但坚持使用value="#{bean.text}"

其次,我怀疑immediate="true"在您的设置中使用得当。当在UICommand像这样的组件中使用时,<h:commandButton>它会导致跳过immediate="false"带有(或省略,因为它是默认值)的组件的 JSF 生命周期,因此value根本不会设置它们。尽管如此,JSF 仍然会submittedValue在执行 action 方法之前在幕后预设。

此外,我强烈建议阅读 BalusC 的博客文章Debug JSF 生命周期,因为它不仅对主题有启发性。

至于解决方案,我建议处理与 bean 的值绑定,如第一条评论中所述。使用这种方法,您根本不需要操作方法参数。此外,重新考虑您对immediate属性的使用。如果您认为它是正确的,那么您有两个选择:(1)使用immediate="true"on<p:inputTextarea>或(2)切换到action="#{bean.action(input.submittedValue)}".

于 2013-06-20T21:28:23.870 回答
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);
}
于 2013-06-20T21:26:43.740 回答
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>
于 2013-06-21T20:00:22.233 回答