我的JSF页面中有一个简单的Form,如下所示:
<html
xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
>
<f:view>
<h:head>
<f:metadata>
<f:viewParam name="cities" value="#{myBean.cities}" />
</f:metadata>
</h:head>
<h:body>
<h:form>
<h:messages id="messages" />
<h:selectManyCheckbox value="#{myBean.cities}" label="Select City" >
<f:selectItems value="#{myBean.allCities}" />
</p:selectManyCheckbox>
<h:commandButton value="Submit">
<f:ajax execute="@form" render="output"/>
</h:commandButton>
</h:form>
<h:panelGroup id="output">
Number of Selected Cities: #{myBean.cities.size()}
</h:panelGroup>
</h:body>
</f:view>
</html>
匹配的支持bean:
使用以下bean方法:
@Named
@RequestScoped
public class MyBean {
private List<String> cities = new ArrayList<>();
public List<String> getCities() {
return cities;
}
public void setCities(List<String> cities) {
this.cities = cities;
}
public List<String> getAllCities() {
return new ArrayList<>(Arrays.asList(new String [] {
"Los Angeles",
"St. Louis",
"San Francisco",
"Dallas",
}));
}
}
观察:
getCities
和setCities
方法的入口和出口。在刷新JSF页面期间,将调用getCities
方法。但是,提交时,setCities
永远不会被调用。<h:messages/>
问题似乎与commandButton/commandLink/ajax action/listener method not invoked or input value not set/updated接受的答案中的问题#3相似,但是对于<p:selectCheckboxMenu>
我没有明显的转换问题。根据文档,它应该能够完美地处理List<String>
。
因此,除了解决明显的问题之外,我们如何确保与此相关的任何错误都可见,而不是出现这种无声的故障?
答案 0 :(得分:1)
简而言之,<f:viewParam>
does not yet support list of values。
cities
属性的签名为List<String>
。
请注意,当我们尝试传递cities
的参数(将?cities=Dallas
附加到请求URL的末尾)时,我们突然在<h:messages/>
中确实得到了适当的转换错误,说明:
“空转换器”的转换错误设置值“达拉斯”。
此外,根据引用的帖子,我们还应包括有关Ajax更新的消息:
<h:commandButton value="Submit">
<f:ajax execute="@form" render="output"/>
<f:ajax execute="@form" render="messages"/>
</h:commandButton>
在执行此操作时,不是在第一次访问期间,而是至少在提交过程中,我们会出现适当的错误:
“空转换器”的转换错误设置值“ []”。
我不确定为什么在ajax样式提交期间需要设置<f:viewParam>
吗?
要解决此问题,您可以提供<f:converter>
,也可以提供其他基于字符串的getter / setter来处理设置/获取Array或List类型。
选择一种快速解决方案,我们可以如下更改<f:viewParam>
:
<f:viewParam name="cities" value="#{myBean.citiesCsv}" />
对于后备bean,我们添加以下方法:
public void setCitiesCsv(String csv) {
if (csv.isEmpty()) {
cities = new ArrayList<>();
} else {
cities =
Stream.of(csv.split(","))
.collect(Collectors.toCollection(ArrayList<String>::new));
}
}
为反复进行此类工作,我们可能应该考虑使用合适的转换器,如果适合我们,我们可以为简单的CSV转换定制该转换器。
相关帖子