0

我想知道是否可以使用谷歌图表制作简单动态的图表;这里我实际使用的是:使用谷歌图表生成动态统计

Oracle DB,JSTL,EL,JSP页面。

为了实现上述结果,我还应该在我的知识范围内做些什么。

编辑:

我经历JPQL来收集来自ORACLE DATABSE数据,他们将被存储在包含名称和各行的数量Object []对象的名单,他们将被送到通过servlet实现的JSP页面:request.setAttribute("data",listemployees); 如何从JSP访问此列表,以及如何将它们存储在生成图表的JavaScript代码中。

编辑:添加细节

这是DAO的一部分,选择门票的种类和对其计数。

private static final String JPQL_SELECT_TICKETS_ETAT = "SELECT t.etat, COUNT(t.id_ticket) FROM Ticket t GROUP BY t.etat"; 

@PersistenceContext(unitName = "bdd_helpdesk_PU") 
private EntityManager  em; 


public List<Object[]> chargerTicketsParEtat() throws DAOException { 
    List<Object[]> liste; 
    //List<Object[]> results = em.createQuery("").getResultList(); 
    TypedQuery<Object[]> query = em.createQuery(JPQL_SELECT_TICKETS_ETAT, Object[].class); 
    //query.setParameter(PARAM_TICKET, id_ticket); 
    try { 
     liste = (List<Object[]>) query.getResultList(); 
    } catch (NoResultException e) { 
     return null; 
    } catch(Exception e) { 
     throw new DAOException(e); 
    } 
    return liste; 
} 

下一个代码发生在servlet的:

 List<Object[]> lticket = ticketDao.chargerTicketsParEtat(); 
     String test= "this is a string"; 
     request.setAttribute("test", test); 
     request.setAttribute("lticket",lticket); 

这是JSP页面:

结果在数表示在一个表是这样的:

<table> 
<tr> 
<th>Etat ticket</th> 
<th>Nombre</th> 
</tr> 
<c:forEach items="${lticket}" var="ticket"> 
<tr> 
<td>${ticket[0]}</td> 
<td>${ticket[1]}</td> 
</tr> 
</c:forEach> 
</table> 

这就是我要用的那种牡鹿:

<head> 
<!--Load the AJAX API--> 
<script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script> 
<script type="text/javascript"> 

    // Load the Visualization API and the corechart package. 
    google.charts.load('current', {'packages':['corechart']}); 

    // Set a callback to run when the Google Visualization API is loaded. 
    google.charts.setOnLoadCallback(drawChart); 

    // Callback that creates and populates a data table, 
    // instantiates the pie chart, passes in the data and 
    // draws it. 
    function drawChart() { 

    // Create the data table. 
    var data = new google.visualization.DataTable(); 
    data.addColumn('string', 'Topping'); 
    data.addColumn('number', 'Slices'); 
    data.addRows([ 
     ['Mushrooms', 3], 
     ['Onions', 1], 
     ['Olives', 1], 
     ['Zucchini', 1], 
     ['Pepperoni', 2] 
    ]); 

    // Set chart options 
    var options = {'title':'How Much Pizza I Ate Last Night', 
        'width':400, 
        'height':300}; 

    // Instantiate and draw our chart, passing in some options. 
    var chart = new google.visualization.PieChart(document.getElementById('chart_div')); 
    chart.draw(data, options); 
    } 
</script> 

它被放置在头上,我想知道我应该使用什么语言来能够注入所代表的表到图表的脚本中的数据,我所知道的是EL(表达langugae),而JS是由浏览器解释 新的servlet不能被放置在脚本,因为它在服务器部分解释:`

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
    { 
     response.setContentType("application/json"); 
     response.setHeader("Cache-Control", "nocache"); 
     response.setCharacterEncoding("utf-8"); 


     List<Object[]> lticket = ticketDao.chargerTicketsParEtat(); 


     PrintWriter out = response.getWriter(); 

     JSONObject json = new JSONObject(); 
     try{ 

      json.put("status", 200); 
      json.put("msg", "OK"); 

      JSONObject map = new JSONObject(); 
      String nom="Non défini"; 
      long valeur; 
      for (Object[] result : lticket) { 

       if((int)result[0]==1) 
        nom="En attente de prise en charge"; 
       else if((int)result[0]==2) 
        nom="En attente de validation"; 
       else if((int)result[0]==3) 
        nom="Cloturé"; 
       else if((int)result[0]==4) 
        nom="En cours de traitement"; 
       valeur = (long) result[1]; 
       map.put(nom,valeur); 
      } 
      json.put("map", map); 

     }catch(JSONException e){ 
      e.printStackTrace(); 
     } 
     out.print(json.toString()); 
     request.setAttribute("lticket", lticket); 
     this.getServletContext().getRequestDispatcher("/NewFile2.jsp").forward(request, response); 

    } 

JSP PAGE:

`<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.0/jquery.min.js"></script> 
<script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script> 
<script type="text/javascript"> 

    var jsonData = []; 
    $(document).ready(function(){ 
     $.ajax({url: "/test", success: function(result){ 
      jsonData = result.map; 
     }}); 
    }); 

    // Load the Visualization API and the corechart package. 
    google.charts.load('current', {'packages':['corechart']}); 

    // Set a callback to run when the Google Visualization API is loaded. 
    google.charts.setOnLoadCallback(drawChart); 

    // Callback that creates and populates a data table, 
    // instantiates the pie chart, passes in the data and 
    // draws it. 
    function drawChart() { 

    // Create the data table. 

    var data = new google.visualization.DataTable(); 
    data.addColumn('string', 'Topping'); 
    data.addColumn('number', 'Slices'); 
    for (var key in jsonData) { 
     data.addRow([key,jsonData[key]]); 
     } 

    // Set chart options 
    var options = {'title':'How Much Pizza I Ate Last Night', 
        'width':400, 
        'height':300}; 

    // Instantiate and draw our chart, passing in some options. 
    var chart = new google.visualization.PieChart(document.getElementById('chart_div')); 
    chart.draw(data, options); 
    } 
</script> 
<div id="chart_div" style="height: 300px; width: 100%;"></div> 

     </body> 

`

+0

是的,你可以使图表动态,你可以使用ajax调用来获取动态数据,并适当地设置或更新它。 –

+0

好吧,数据通过Http请求发送,并可通过表达式语言(EL)读取,我如何在JS脚本中添加数据? – TheNorth

+0

您需要定义一个url,它可以为Google图表的数据提供json响应,然后您可以轻松地通过页面中的ajax调用并更新图表。请添加您现有的代码,以便我可以展示如何在您的案例中完成 –

回答

1

对于你不需要改变任何东西的DAO部分。

对于你的servlet需要返回JSON这样的:

import java.io.IOException; 
import java.io.PrintWriter; 

import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

import org.json.JSONException; 
import org.json.JSONObject; 

public class ChartsDataServlet extends HttpServlet { 

    public void doGet(HttpServletRequest request, HttpServletResponse response) 
      throws IOException { 

     response.setContentType("application/json"); 
     response.setHeader("Cache-Control", "nocache"); 
     response.setCharacterEncoding("utf-8"); 

     PrintWriter out = response.getWriter(); 

     JSONObject json = new JSONObject(); 
     try{ 

      json.put("status", 200); 
      json.put("msg", "OK"); 

      JSONObject map = new JSONObject(); 

      map.put("Mushrooms", 3); 
      map.put("Onions", 1); 
      map.put("Olives", 1); 
      map.put("Zucchini", 1); 
      map.put("Pepperoni", 2); 
      json.put("map", map); 

     }catch(JSONException e){ 
      e.printStackTrace(); 
     } 
     out.print(json.toString()); 
    } 
} 

然后要绘制图表的页面上使用这个servlet-URL(比如chartsDataUrl)。

<html> 
    <head> 
    <!--Load the AJAX API--> 
    <script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script> 
    <script src="https://code.jquery.com/jquery-2.2.4.min.js"></script> 
    <script type="text/javascript"> 
     var jsonData = []; 
     $(document).ready(function(){ 
      $.ajax({url: "/chartsDataUrl", success: function(result){ 
       jsonData = result.map; 
      }}); 
     }); 


     // Load the Visualization API and the corechart package. 
     google.charts.load('current', {'packages':['corechart']}); 

     // Set a callback to run when the Google Visualization API is loaded. 
     google.charts.setOnLoadCallback(drawChart); 

     // Callback that creates and populates a data table, 
     // instantiates the pie chart, passes in the data and 
     // draws it. 
     function drawChart() { 

     // Create the data table. 
     var data = new google.visualization.DataTable(); 
     data.addColumn('string', 'Topping'); 
     data.addColumn('number', 'Slices'); 
     for (var key in jsonData) { 
      data.addRow([key,jsonData[key]]); 
     } 

     // Set chart options 
     var options = {'title':'How Much Pizza I Ate Last Night', 
         'width':400, 
         'height':300}; 

     // Instantiate and draw our chart, passing in some options. 
     var chart = new google.visualization.PieChart(document.getElementById('chart_div')); 
     chart.draw(data, options); 
     } 
    </script> 
    </head> 

    <body> 
    <!--Div that will hold the pie chart--> 
    <div id="chart_div"></div> 
    </body> 
</html> 

让我知道如果您有任何问题。

+0

如上所述,我推荐使用JSON,JSP的图表不显示数据,页面上显示“无数据”,我在文章中添加了描述,检查从“新SERVLET”,并感谢您的帮助。 – TheNorth

+0

请添加一些控制台语句,让我知道如果你在JavaScript控制台中的任何错误。 –

+0

也请从servlet中移除这两行request.setAttribute(“lticket”,lticket); this.getServletContext()。getRequestDispatcher(“/ NewFile2.jsp”)。forward(request,response); –