使用<f:viewparams>

时间:2019-02-20 18:53:36

标签: jsf

我的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",
      }));
  }
}

观察:

  1. 我已将日志记录添加到getCitiessetCities方法的入口和出口。在刷新JSF页面期间,将调用getCities方法。但是,提交时,setCities永远不会被调用。
  2. 控制台日志中没有任何错误或异常(在web.xml中将javax.faces.PROJECT_STAGE设置为DEVELOPMENT)。
  3. 没有错误传递给<h:messages/>
  4. set方法不会为任何表单输入字段调用。该页面的行为为“奇数”。

问题似乎与commandButton/commandLink/ajax action/listener method not invoked or input value not set/updated接受的答案中的问题#3相似,但是对于<p:selectCheckboxMenu>我没有明显的转换问题。根据文档,它应该能够完美地处理List<String>

因此,除了解决明显的问题之外,我们如何确保与此相关的任何错误都可见,而不是出现这种无声的故障?

1 个答案:

答案 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转换定制该转换器。

相关帖子