【问题标题】:Bean method reading null property from xhtml从 xhtml 读取空属性的 Bean 方法
【发布时间】:2013-06-20 20:19:56
【问题描述】:

我在 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,无法更改。

【问题讨论】:

标签: jsf jsf-2 binding


【解决方案1】:

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

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

另外,我强烈建议阅读 BalusC 的博文 Debug JSF lifecycle,因为它对主题的启发不只。

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

【讨论】:

  • 已解决 感谢所有发布的有关此问题的主题。你@skuntsel 是完全正确的。我错过了有关立即生命周期的信息……这已解决。谢谢。
【解决方案2】:

我会这样做的:

<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);
}

【讨论】:

  • 没错。但是我在表单中有大约 10 个 inputText,我需要输入一些值并单击需要将它们添加到 dataTable 行的按钮。我需要在 bean 中创建大约 10 个字符串属性来执行此操作吗?那是@Gloserio的唯一方法?谢谢
  • @BalusC 如果可能的话 我喜欢你对这个问题的看法。提前致谢。
【解决方案3】:

你应该创建一个新类,即:

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-11-14
    • 2021-12-30
    • 1970-01-01
    • 1970-01-01
    • 2016-01-25
    • 2020-11-27
    • 1970-01-01
    • 1970-01-01
    • 2018-05-24
    相关资源
    最近更新 更多