JSF getValue() 与获取提交的值()

标签 jsf

我最近一直在开发一些 JSF 应用程序,并且对 Web 组件 API 的不一致感到不安。

我注意到在服务器端代码中的 JSF 组件对象上调用 .getValue() 或 .getSubmittedValue() 时会出现极其不可预测的行为。有时,当我在下拉列表框上调用 .getValue() 时,我注意到我得到的值是在我选择我的值之前的值(因此来自最后一页刷新的值),其中 .getSubmittedValue() 得到我是正确的值,例如:

UIInput name = new UIInput(); // This is the control I have in a bean.

public void submit(ActionEvent ae)
{
    someMethod(name.getValue().toString());          // Retrieves the "old" value
    someMethod(name.getSubmittedValue().toString()); // Retrieves the correct value 
}

另外,我注意到在表单字段上调用 ​​.getSubmittedValue() 有时会导致空指针异常,因为该值尚未在组件对象中实例化,在这种情况下,当我在这种情况下调用 .getValue() 时,我得到正确的值,例如:
HtmlInputText name = new HtmlInputText(); // This is the control I have in a bean.

public void submit(ActionEvent ae)
{
    someMethod(name.getValue().toString());          // Retrieves the correct value
    someMethod(name.getSubmittedValue().toString()); // Throws NullPointerException 
}

这只是 JSF 框架的“怪癖”,还是我只是使用 API 完全 错了??对这两种方法的任何见解将不胜感激。干杯。

最佳答案

由于这是在 Google 中搜索 getValue 与 getSubmittedValue 的第一结果,我想补充一点,它们之间的区别在验证中至关重要(即在编写自定义验证器时)

引用 getSubmittedValue() 的 API 文档:

This is non-null only between decode and validate phases, or when validation for the component has not succeeded. Once conversion and validation has succeeded, the (converted) value is stored in the local "value" property of this component, and the submitted value is reset to null.



来源: http://myfaces.apache.org/core11/myfaces-api/apidocs/javax/faces/component/UIInput.html#getSubmittedValue()

这意味着如果您尝试访问的绑定(bind)已经进行了验证/转换,您应该调用 getValue() 否则您将不得不调用 getSubmittedValue() 并自己处理解析它。这些发生的顺序似乎是由它们在 UI 中出现的顺序决定的,但我认为这不能保证。即使是这样,您也不应该指望这一点,因为 UI 中的更改字段不应该破坏您的代码。

您可以通过查看 isLocalValueSet() 返回的内容来检测验证/转换是否已完成。如果它返回 true,那么验证/转换已经完成,所以你应该调用 getValue()。否则,您将需要调用 getSubmittedValue() ,这将为您提供用户输入的原始输入,您可能希望将其解析为更有意义的内容。

例如,当调用 getValue() 时,日历对象将返回 Date 对象,而在调用 getSubmittedValue() 时将返回 String 对象。由您的转换器将字符串解析为 Date 以便对其进行验证。

如果 JSF 规范有一种方法可以为我们做到这一点,那就太好了,但 AFAIK 没有。如果某些日期需要在其他日期之前,并且某些仅在某些情况下需要,则需要编写几个验证器来处理这个问题。所以它很容易成为一个问题。这类似于您不能对空白字段进行任何类型的验证,这意味着您不能有条件地要求该字段。如果对所有字段(甚至是空白字段)都运行了验证,则可以编写自定义验证器来抛出异常(如果它应该被要求而不是)。 JSF 有一些东西只是一种痛苦。除非/直到它们被修复,我们只需要处理它们。

在原始帖子中谈论问题的细节:这里的区别在于您在生命周期中所处的位置。 submit方法看起来像是一个按钮的 Action 监听器,它把它放在生命周期的末尾; Action 和 Action 监听器在渲染响应之前但在验证之后的“调用应用程序”阶段触发。如果您打算使用 JSF 进行编程,您应该学习并理解生命周期。值得花时间。

关于JSF getValue() 与获取提交的值(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/260094/

相关文章:

jsf - 为什么找不到我的功能?

string - h :inputText which is bound to String property is submitting empty string instead of null

jsf - 单个 JSF 应用程序中的多个 Primefaces 主题

jsf - 如何获取 PrimeFaces 轮播的当前索引?

eclipse - 找不到 "http://richfaces.ajax4jsf.org/rich"的标签库描述符

jsf - 如何使用 j_security_check 获取已连接用户的数量及其角色?

java - 是否可以在 JSF 1.2 中使用 JSF 2.0 提供的 bean 级别验证

java - 具有从父类(super class)继承的属性的托管 Bean

validation - 用户输入的值在 JSF 中验证后消失

Jsf 在 Apache Karaf 3.0.3 中的应用