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); –