JSF - переменный набор параметров на основе обратной передачи

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

Кодекс

У меня есть более сложная версия с переменным количеством параметров (элементов ‹f:param›), которые основаны на другой части формы. В верхней части формы есть DataTable всех возможных «критериев». В нижней части находится изображение 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 — это bean-компонент RequestScope.

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

Проблема

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

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


person Pixel    schedule 14.10.2011    source источник


Ответы (1)


Я вижу твою проблему. Однако я действительно не вижу четкого решения для стороны просмотра. Лучше всего добавить эти параметры самостоятельно к свойству за #{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[]> в качестве значения.

person BalusC    schedule 14.10.2011
comment
Я забыл упомянуть, что #{searchBean.lineChartImage} — это метод, возвращающий объект StreamedContent (это функция p:graphicImage в Primefaces); поэтому добавление строки не работает. Это выходит за рамки моих знаний, но мне интересно, можно ли связать GraphicImage, а затем добавить параметры вручную в дерево компонентов во время обратной передачи. В противном случае мне, вероятно, следует создать свой собственный сервлет для создания изображения и использовать метод конкатенации строк, который вы предложили здесь, чтобы указать на этот сервлет. - person Pixel; 14.10.2011
comment
Хм, привязка теоретически сработает. Но интересно, нельзя ли добавить параметры самому StreamedContent? Я никогда не использовал его, поэтому я не могу подробно рассказать об этом. Что это за изображение? Диаграмма JFreeChart? Можно ли добавить к нему параметры программно? - person BalusC; 14.10.2011
comment
Пример изображения Primefaces Dyna показывает пример динамического создания изображения. Элемент ‹p:graphicImage value=...› отображает изображение, связанное с вызовом метода, указанного в значении; если параметры не передаются по этому URL-адресу, то обработка GET не может знать, что отображать. Метод сервлета, использующий ваш подход построения строки запроса, выглядит все более и более привлекательным, потому что на самом деле я буду контролировать, а не фреймворк. - person Pixel; 14.10.2011
comment
Должна быть возможность переместить это задание по созданию изображения в метод @PostConstruct или метод действия bean-компонента, чтобы он не создавался непосредственно при построении bean-компонента, а только после того, как параметры запроса получены @ManagedProperty или отправлены данные формы как свойства фасоли. - person BalusC; 14.10.2011