JSF - переменный набор параметров на основе обратной передачи - PullRequest
0 голосов
/ 14 октября 2011

В этот пост , отличный BalusC указал на использованиечтобы получить параметры во время сборки.

Код

У меня есть более сложная версия этого с переменным количеством параметров (элементы), которые основаны на другой части формы.Верхняя часть формы имеет таблицу данных со всеми возможными «критериями».В нижней части имеется изображение PrimeFaces graphicImage, содержимое которого основано на выбранных критериях, включая только используемые критерии.

<p:dataTable var='criterion' value='#{criteria}'
    binding="#{searchBean.criteriaList}" id="#{id}">
  ... each row shows a criteria, which has a parameter name, an operator, and a value ...
  ... each row may be set or not set ...
</p:dataTable>

<p:graphicImage value="#{searchBean.lineChartImage}">
  <c:forEach var="criteriaName" items="#{searchBean.usedCriteriaKeys}">
    <f:param name="#{criteriaName}" value="#{searchBean.criteriaMap[criteriaName]}"/>
  </c:forEach>
</p:graphicImage>

Фон

Я знаюМетод searchBean.lineChartImage дает мне правильную диаграмму, если заданы параметры.

SearchBean - это компонент RequestScope.

Я использую JSF 2.1, Tomcat 7.0.22 и Primefaces2.2.1.

Проблема

Когда я выбираю / включаю критерии (например, param = "eventDate", operator = "after", value = "2011-10-01 "), параметры graphicImage создаются в начале жизненного цикла во время создания дерева на этапе RestoreView;набор параметров, который я на самом деле хочу, не обновляется до фазы UpdateModelValues.

Есть ли способ получить набор параметров для p: graphicImage на основе фактических результатов самой обратной передачи?

1 Ответ

0 голосов
/ 14 октября 2011

Я вижу вашу проблему. Я, однако, не вижу четкого решения в плане обзора. Лучше всего добавить эти параметры самостоятельно в свойство, стоящее за #{searchBean.lineChartImage} в методе действия bean-компонента.

this.lineChartImage = imageURL + "?" + toQueryString(criteriaMap);

с помощью этого служебного метода

public static String toQueryString(Map<String, String> params) {
    StringBuilder queryString = new StringBuilder();

    for (Entry<String, String> param : params.entrySet()) {
        if (queryString.length() > 0) {
            queryString.append("&amp;");
        }

        queryString
            .append(URLEncoder.encode(param.getKey(), "UTF-8"))
            .append("=")
            .append(URLEncoder.encode(param.getValue(), "UTF-8"));
    }

    return queryString.toString();
}

Это было бы возможно, если бы существовал <f:params>, который принимает Map<String, String> или, возможно, даже Map<String, String[]> в качестве значения.

...