JSF - 基于回发的可变参数集

发布于 2024-12-10 02:19:10 字数 1310 浏览 0 评论 0原文

这篇文章中,优秀的BalusC指出了使用< c:forEach>在构建时获取参数。

代码

我有一个更复杂的版本,带有基于表单另一部分的可变数量的参数(元素)。表单的顶部有一个包含所有可能“条件”的数据表。底部有一个 PrimeFaces 图形图像,其内容基于这些标准中的选择,仅包括使用的标准。

<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 的一组参数?

In this post, the excellent BalusC pointed out the use of <c:forEach> to get the parameters at build time.

The Code

I have a more complicated version of that with a variable amount of parameters (<f:param> elements) that are based on another part of the form. The top part of the form has a DataTable of all possible "Criteria". The bottom part has a PrimeFaces graphicImage whose content is based on the selections in those criteria, including only criteria that are used.

<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>

Background

I know the searchBean.lineChartImage method gives me the right chart as long as the parameters are set.

The SearchBean is a RequestScope bean.

I'm using JSF 2.1, Tomcat 7.0.22, and Primefaces 2.2.1.

The Problem

When I select/enable a criteria (e.g. param="eventDate", operator="after", value="2011-10-01"), the parameters of graphicImage are created early in the lifecycle at tree creation time in the RestoreView phase; the set of parameters that I actually want is not updated until the UpdateModelValues phase.

Is there a way to get a set of parameters for the p:graphicImage based on the actual results of the postback itself?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

东风软 2024-12-17 02:19:10

我看到你的问题了。然而,我在视图方面并没有真正看到明确的解决方案。最好的办法是自己将这些参数附加到 bean 操作方法中 #{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("&");
        }

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

    return queryString.toString();
}

如果存在接受 Map 或什至 Map<; 的 ,则这是可能的。 String,String[]> 作为值。

I see your problem. I however don't really see a clear solution for in the view side. Your best bet is to append those parameters yourself to the property behind #{searchBean.lineChartImage} in the bean's action method.

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

with this utility method

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("&");
        }

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

    return queryString.toString();
}

It would have been possible if there exist a <f:params> which accepts a Map<String, String> or maybe even Map<String, String[]> as value.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文