java - ValueChangeEvent.getNewValue() 未从 JSF 2 中的下拉列表中返回正确的字符串值

标签 java jsf

我在附加到下拉列表的 ValueChangeListener 时遇到问题。

这是代码:

<h:selectOneMenu 
value = "#{MultiFileSelectMgmtBean.selectedLocationName}" 
valueChangeListener = "#{MultiFileSelectMgmtBean.LocationChangeEvent}" 
onchange = "submit();" 
>

<f:selectItems 
value = "#{MultiFileSelectMgmtBean.locationsListItems}"> 
</f:selectItems>

</h:selectOneMenu>

这是支持 bean:

protected List<SelectItem> locationsListItems;
...

public void LocationChangeEvent( ValueChangeEvent vce ) throws Exception
{
   selectedLocationName = (String) vce.getNewValue();
}

问题是“selectedLocationName”获取“11”或“13”值,即使下拉列表中填充了两个字符串“LocationTest1”和“LocationTest2”。

vce.getNewValue 可能存在什么问题?

最佳答案

下拉列表的提交值是选项value,而不是您想象的选项label。请注意,该方法也称为 getNewValue() ,不是getNewLabel() 。选项标签通过 HTML 表单提交通过 HTTP 从客户端发送到服务器。无法从 HTTP 请求中提取它们。

如果由于某些不清楚的原因您确实需要选项标签而不是选项值,那么您要么需要在创建选择项时使用它而不是选项值,要么需要映射与选项值在某处,以便您可以通过此映射中的值获取标签。很有可能您的 bean 中已经有这种映射,否则您将无法填充 <f:selectItems>值:)

另请参阅:

<小时/>

与具体问题无关: <h:selectOneMenu> 的组合,一个valueChangeListeneronchange="submit()"表示您正在使用 JSF 1.x 特定的 hack 来实现根据下拉列表的更改填充另一个下拉列表或字段的功能要求。由于您似乎已经在使用 JSF 2.x,我建议您完全忘记这种方法,只使用 <f:ajax listener>反而。上述链接的 wiki 页面包含一个示例。

关于java - ValueChangeEvent.getNewValue() 未从 JSF 2 中的下拉列表中返回正确的字符串值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9777353/

相关文章:

Java - 从文件中输出文本作为键盘模拟

javascript - 在页面的页眉中而不是在页脚中包含 JS 脚本?

jsf - Primefaces 图形图像不带 ?pfdrid_c=true

java - 使用 JSF 在新的浏览器窗口中阅读并打开 PDF

java - 为什么不能实现类将重写方法定义为静态的?

java - 如何使用 spring-boot 1.3.0.RC1 为 oauth2 提供自定义安全配置

java - 使用 lambda 表达式返回具有不同类型主体的 ResponseEntity 对象

java - Primefaces 向导。如何返回onnext的js函数选项卡

jquery - 如何在 JavaScript 中禁用/启用 JSF 输入字段?

java - primefaces 部分处理不起作用