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 е RequestScope bean.

Използвам 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} в метода за действие на компонента.

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 показва пример за динамично създаване на изображение. Елементът ‹p:graphicImage value=...› изобразява img, който е свързан за извикване на метода, указан в стойността; ако параметрите не са предадени на този URL, тогава обработката на GET няма начин да разбере какво да покаже. Методът на сървлета, използващ вашия подход за изграждане на низ на заявка, изглежда все по-привлекателен, защото аз всъщност ще контролирам, а не рамката. - person Pixel; 14.10.2011
comment
Трябва да е възможно да преместите това задание за създаване на изображение към @PostConstruct метод или метод за действие на bean, така че да не се създава директно при конструирането на bean, а само след като параметрите на заявката са получени от @ManagedProperty или изпратени данни от формуляр като свойства на боба. - person BalusC; 14.10.2011