如何使用JSF2 Primefaces请求上下文发送JSON到Highchart?

时间:2013-05-07 08:48:39

标签: json jsf-2 primefaces highcharts

您好我已经花了好几个小时,我希望使用Primefaces请求上下文将我的POJO以JSON格式发送到我的JSF中的Highchart以更新其值。 基本上我是从他自己的stackoverflow question跟随@Bhesh Gurung的这个解决方案 但我似乎无法使它成功。现在它正在抛出一个:

  

找不到标识符“pieData”的组件,该组件来自“j_idt31”。

我想通过Primefaces Request Context使用JSON数据成功创建一个高清图。请提前帮助谢谢。

这是我的代码

@ManagedBean
@ViewScoped

public class PieDataProvider {

        public void retrievePieData() { 
            List<String> categories = new ArrayList<String>();
            categories.add("Electronic");
            categories.add("Food");
            categories.add("Liguor");
            categories.add("Stationary");
            categories.add("Mechanical");

            List<Integer> itemCounts = new ArrayList<Integer>();

            itemCounts.add(5);
            itemCounts.add(20);
            itemCounts.add(1);
            itemCounts.add(50);
            itemCounts.add(10);

            RequestContext reqCtx = RequestContext.getCurrentInstance();
            reqCtx.addCallbackParam("categories", new Gson().toJson(categories));
            reqCtx.addCallbackParam("itemCounts", new Gson().toJson(itemCounts));
            System.out.println(categories);
        }

 }

我的xhtml page5.xhtml

<?xml version="1.0" encoding="UTF-8"?>

<ui:composition template="/template/common/commonLayout.xhtml">

    <ui:define name="content">
        <h:head>

            <script type="text/javascript">
                src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"
                src="http://code.highcharts.com/highcharts.js"
                src="http://code.highcharts.com/modules/exporting.js"
            </script>


            <script type="text/javascript">
                function feedPieData(xhr, status, args) {
                    var categories = eval('(' + args.categories + ')');
                    var itemCounts = eval('(' + args.itemCounts + ')');

                    options.xAxis.categories = categories;

                    var series = {
                        data : []
                    };

                    series.name = new Date().toString();
                    series.data = itemCounts;

                    options.series = [ series ];

                    chart = new Highcharts.Chart(options);
                }
            </script>

        </h:head>
        <h:body>
            <p:commandLink action="#{pieDataProvider.retrievePieData}"
                oncomplete="feedPieData(xhr, status, args);" value="Pie chart demo"
                update="pieData" />
        </h:body>
    </ui:define>

    <ui:define name="footer">
        <h2>This is page5 Footer</h2>
    </ui:define>

</ui:composition>

更新:修改XHTML

    <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:p="http://primefaces.org/ui">
<h:body>
    <ui:composition template="/template/common/commonLayout.xhtml">
        <ui:define name="content">
            <h:head>
                <script type="text/javascript"
                    src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
                <script type="text/javascript">
                    $(function() {
                        $('#container')
                                .highcharts(
                                        {
                                            chart : {
                                                plotBackgroundColor : null,
                                                plotBorderWidth : null,
                                                plotShadow : false
                                            },
                                            title : {
                                                text : 'Most used words, 2010'
                                            },
                                            tooltip : {
                                                pointFormat : '{series.name}: {point.percentage}',
                                                percentageDecimals : 1
                                            },
                                            plotOptions : {
                                                pie : {
                                                    allowPointSelect : true,
                                                    cursor : 'pointer',
                                                    dataLabels : {
                                                        enabled : true,
                                                        color : '#000000',
                                                        connectorColor : '#000000',
                                                        formatter : function() {
                                                            return '<b>'
                                                                    + this.point.name
                                                                    + '</b>: '
                                                                    + this.percentage
                                                            //+ ' %'
                                                            ;
                                                        }
                                                    }
                                                }
                                            },
                                            series : [ {
                                                type : 'pie',
                                                name : 'Browser share',
                                                data : [ [ 'Red', 45.0 ],
                                                        [ 'Orange', 26.8 ], {
                                                            name : 'Yellow',
                                                            y : 12.8,
                                                            sliced : true,
                                                            selected : true
                                                        }, [ 'Green', 8.5 ],
                                                        [ 'Blue', 6.2 ],
                                                        [ 'Violet', 0.7 ] ]
                                            } ]
                                        });
                    });
                </script>
                <script type="text/javascript">
                    function feedPieData(xhr, status, args) {
                        var categories = JSON.parse(args.categories);
                        var itemCounts = JSON.parse(args.itemCounts);

                        var series = {
                            data : []
                        };
                        options.series[0].data.length = 0;
                        series.data = categories;
                        series.data = itemCounts;

                        options.series = [ series ];

                        chart = new Highcharts.Chart(options);
                    }
                </script>

                <script src="http://code.highcharts.com/highcharts.js"></script>
                <script src="http://code.highcharts.com/modules/exporting.js"></script>
            </h:head>
            <h:body>

                <div id="container"
                    style="min-width: 400px; height: 400px; margin: 0 auto"></div>
                <h:form>
                    <p:commandLink action="#{pieDataProvider.retrievePieData}"
                        oncomplete="feedPieData(xhr, status, args);"
                        value="Pie chart demo" />
                </h:form>
            </h:body>
        </ui:define>

        <ui:define name="footer">
            <h2>This is page5 Footer</h2>
        </ui:define>

    </ui:composition>

</h:body>

</html>

1 个答案:

答案 0 :(得分:6)

您似乎无法理解Highcharts是一个JavasScript环境,仅在客户端上运行,而PrimeFaces / JSF在服务器端,它们在此上下文中仅仅作为HTML,CSS和JavaScript代码生成器。

在您的特定情况下,PrimeFaces只需使用通过RequestContext 将数据从服务器发送到客户端。在AJAX调用完成并有效地完成后,客户端会收到序列化数据,您可以调用一个JavaScript函数,它完全在客户端上从接收到的数据创建一个Highcharts JS组件。

总而言之,它通过以下设置产生了我们。

**视图元素**

<h:form>
    <p:commandLink action="#{pieDataProvider.retrievePieData}"
                   oncomplete="feedPieData(xhr, status, args);"
                   value="Generate pie chart" />
</h:form>

** JavaScript **

<script type="text/javascript">
    function feedPieData(xhr, status, args) {
        var categories = JSON.parse(args.categories);//serialized data from server
        var itemCounts = JSON.parse(args.itemCounts);//serialized data from server

        //next you create the chart and show it
    }
</script>

**行动方法**

public void retrievePieData() { 
    List<String> categories = generateCategories();
    List<Integer> itemCounts = generateItems();
    RequestContext reqCtx = RequestContext.getCurrentInstance();
    reqCtx.addCallbackParam("categories", new Gson().toJson(categories));//additional serialized data to be sent
    reqCtx.addCallbackParam("itemCounts", new Gson().toJson(itemCounts));//additional serialized data to be sent
}