在 JSF 中将 JSON 写入 HTTP 响应

Write JSON to HTTP response in JSF

我想在 JSF 中使用 de JavaScript 库 "D3.js" 创建动态图表。我的意思是动态 java 方法从数据库中获取数据并写入相应的 JSON。这种方法我已经编写好了,而且有效。然后 JavaScript 应该访问 JSON 并创建图表。

我的问题是:如何将 JSON sting/file 传递给 JavaScript。我认为最好的方法是将其写在 HTTP 响应中。但是如何在 JSF 中做到这一点?或者您有其他建议吗?

一步一步:

  • 创建一个支持 bean 方法,用于使用数字数组字符串 JSON 表示更新字符串属性 (jsonData)。您将必须:

    • 调用 returns 数据的 EJB bean 或 JAX-RS 服务。
    • 读取列表中的数据。
    • 将 List 集合转换为 JSON 对象,然后将其字符串化,例如使用标准中的 javax.json 包。
    • 更新 jsonData 模型属性。
  • 在 JSF 页面中,您必须包含一个绑定到 jsonData 属性的 outputLabel 组件。您可以使用 CSS.

  • 隐藏它
  • 在 JSF 页面中编写 Javascript 代码以将组件值放入 Javascript 变量中。您可以使用 jQuery 选择器或使用 getElementById 函数 Javascript 实现它。

  • 最后你使用了D3库中的Javascript变量

注意:D3库的使用是从here复制过来的。

JSF 页面中的代码类似于:

<h:form id="myForm">
    <h:outputLabel id="myLink" value="#{yourBackingBean.jsonData}"  
        style="display:none;" styleClass="myLink"/>

    <div class="someclass">
        <h2>Create A Bar Chart With D3 JavaScript</h2>
        <div id="bar-chart">

        </div>
    </div>  

    <script>

        var chartdata = eval(document.getElementById("myForm:myLink").innerHTML);
        // you can use jQuery too: $(".myLink").html()

        //  the size of the overall svg element
        var height = 200,
            width = 720,

        //  the width of each bar and the offset between each bar
            barWidth = 40,
            barOffset = 20;


        d3.select('#bar-chart').append('svg')
          .attr('width', width)
          .attr('height', height)
          .style('background', '#dff0d8')
          .selectAll('rect').data(chartdata)
          .enter().append('rect')
            .style({'fill': '#3c763d', 'stroke': '#d6e9c6', 'stroke-width': '5'})
            .attr('width', barWidth)
            .attr('height', function (data) {
                return data;
            })
            .attr('x', function (data, i) {
                return i * (barWidth + barOffset);
            })
            .attr('y', function (data) {
                return height - data;
            });     
    </script>
</h:form>   

让 JSF 打印出 JSON 字符串,就好像它是一个 JS 变量一样。

<script>var data = #{bean.json};</script>