科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道应用软件在JSP页面中轻松实现数据饼图

在JSP页面中轻松实现数据饼图

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

JSP提供了很多简单实用的工具,其中包括从数据库中读出数据,发送数据,并能够把结果显示在一个饼状图形

作者:sady 来源:论坛 2007年10月30日

关键字:

  • 评论
  • 分享微博
  • 分享邮件
附:本文全部源代码

Listing E

<%@ page language="java" %>
<%@ page import="java.io.OutputStream" %>
<%@ page import="java.sql.*" %>
<%@ page import="java.awt.*" %>
<%@ page import="java.awt.geom.*" %>
<%@ page import="java.awt.image.BufferedImage" %>
<%@ page import="com.sun.image.codec.jpeg.*" %>
<%!
////////////////////////////////////////////////////////////
// PieColors class manages the colors used in the pie chart
////////////////////////////////////////////////////////////
class PieColors
{
 Color pieColorArray[] = {
  new Color(210,60,60), new Color(60,210,60), new Color(60,60,210),
  new Color(120,60,120), new Color(60,120,210), new Color(210,120,60)
  };
 int curPieColor = 0;
 public Color getPieColor()
 {
  return pieColorArray[curPieColor];
 }
 public void setNewColor()
 {
  curPieColor++;
  if(curPieColor >= pieColorArray.length)
  {curPieColor = 0;}
 }
}
%>
<%! String driver = "com.mysql.jdbc.Driver"; String dburl = "jdbc:mysql://localhost/articles"; String dbuid = "myuid"; String dbpwd = "mypwd";

////////////////////////////////////////////////////////////
// Get the products from the database as a String array
////////////////////////////////////////////////////////////
public String[] getProducts()
{
 String[] arr = new String[0];
 Connection con;
 Statement stmt;
 ResultSet rs;
 int count = 0;
 String sql = "select * from p_products order by productID";
 try
 {
  //Load Driver:
  Class.forName(driver);
  //Connect to the database with the url
  con = DriverManager.getConnection(dburl , dbuid , dbpwd);
  stmt = con.createStatement();
  //Get ResultSet
  rs = stmt.executeQuery(sql);
  //Count the records
  while(rs.next()){count++;
 }
 //Create an array of the correct size
 arr = new String[count];
 //Get ResultSet (the most portable way of using rs a second time)
 rs = stmt.executeQuery(sql);
 while(rs.next())
 {
  arr[rs.getInt("productID")] = rs.getString("productname");
 }
 stmt.close();
 con.close();
}
 catch (java.lang.Exception ex)
 {arr[0] = ex.toString();}
 return arr;
}
////////////////////////////////////////////////////////////
//Get the sales totals from the database
////////////////////////////////////////////////////////////
public float[] getSales(int products)
{
 float[] arr = new float[products];
 Connection con;
 Statement stmt;
 ResultSet rs;
 String sql = "select productID, amount from p_sales";
 try {
  //Load Driver:
  Class.forName(driver);
  //Connect to the database with the url
  con = DriverManager.getConnection(dburl , dbuid , dbpwd);
  stmt = con.createStatement();
  //Get ResultSet
  rs = stmt.executeQuery(sql);
  while (rs.next()) { int product = rs.getInt("productID");
  //Check that the productID is valid
  if (product >= 0 && product < products)
  {
   //Add to product total
   arr[product] += rs.getFloat("amount");
  }
 }
 stmt.close();
 con.close();
} catch (java.lang.Exception ex) {arr[0] = -1.0f; }
 return arr; } %>
<%
 //get an array that contains the product names
 String products[] = getProducts();
 //read the data and store the totals in an array
 float sales[] = getSales(products.length);
 //Declare PieColors PieColors
 pc = new PieColors();
 //Colors Color
 dropShadow = new Color(240,240,240);
 //inner padding to make sure bars never touch the outer border
 int innerOffset = 20;
 //Set the graph's outer width & height
 int WIDTH = 400;
 int HEIGHT = 200;
 int pieHeight = HEIGHT - (innerOffset * 2);
 int pieWidth = pieHeight;
 //To make a square (circular) pie
 int halfWidth = WIDTH/2;
 //Width of the inner graphable area
 int innerWIDTH = WIDTH - (innerOffset * 2);
 //graph dimensions Dimension
 graphDim = new Dimension(WIDTH,HEIGHT);
 Rectangle graphRect = new Rectangle(graphDim);
 //border dimensions
 Dimension borderDim = new Dimension(halfWidth-2,HEIGHT-2);
 Rectangle borderRect = new Rectangle(borderDim);

 /////////////////////////////////////////////////////////////
  //Set up the graph
 ////////////////////////////////////////////////////////////
 //Set content type
  response.setContentType("image/jpeg");
 //Create BufferedImage & Graphics2D
 BufferedImage bi = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
 Graphics2D g2d = bi.createGraphics();
 // Set Antialiasing RenderingHints
 renderHints = new RenderingHints( RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
 g2d.setRenderingHints(renderHints);
 //Set graph background color to white:
 g2d.setColor(Color.white);
 g2d.fill(graphRect);
 //Draw black border
 g2d.setColor(Color.black);
 borderRect.setLocation(1,1);
 g2d.draw(borderRect);
 //Now draw border for legend
 borderRect.setLocation((WIDTH/2) + 1,1);
 g2d.draw(borderRect);  
 ////////////////////////////////////////////////////////////////////
 //Draw data onto the graph:    
 ////////////////////////////////////////////////////////////////////
 int x_pie = innerOffset;
 int y_pie = innerOffset; int border = 20;
 //Main chart Ellipse
 //Ellipse2D.Double el = new Ellipse2D.Double(x_pie, y_pie, pieWidth, pieHeight);  Ellipse2D.Double elb = new Ellipse2D.Double(x_pie - border/2, y_pie - border/2, pieWidth + border, pieHeight + border);
 //Shadow
 g2d.setColor(dropShadow);
 g2d.fill(elb);
 //Border
 g2d.setColor(Color.black);
 g2d.draw(elb);

 /////////////////////////////////////////////////////////////////
 //Calculate the total sales       
 /////////////////////////////////////////////////////////////////
 float salesTotal = 0.0f;
 int lastElement = 0;
 for(int i=0; i<products.length; i++)
 {
  if(sales[i] > 0.0f)
  {
   salesTotal += sales[i];
   lastElement = i;
   }
 }
 //////////////////////////////////////////////////////////////
  //Draw the pie chart   
 /////////////////////////////////////////////////////////////
 //Chart variables
 int startAngle = 0;
 //Legend variables
 int legendWidth = 20;
 int x_legendText = halfWidth + innerOffset/2 + legendWidth + 5;
 int x_legendBar = halfWidth + innerOffset/2;
 int textHeight = 20;
 int curElement = 0;
 int y_legend = 0;
 //Dimensions of the legend bar
 Dimension legendDim = new Dimension(legendWidth , textHeight/2);
 Rectangle legendRect = new Rectangle(legendDim);
 for(int i=0; i<products.length; i++)
 {
  if(sales[i] > 0.0f)
  {
   //Calculate percentage sales float
   perc = (sales[i]/salesTotal);
   //Calculate new angle
   int sweepAngle = (int)(perc * 360);
   //Check that the last element goes back to 0 position
   if (i == lastElement)
   {
    sweepAngle = 360-startAngle;
   }
   // Draw Arc
   g2d.setColor(pc.getPieColor());
   g2d.fillArc(x_pie, y_pie, pieWidth, pieHeight, startAngle, sweepAngle);
   //Increment startAngle with the sweepAngle
   startAngle += sweepAngle;
   /////////////
   //Draw Legend
   /////////////
   //Set y position for bar
   y_legend = curElement * textHeight + innerOffset;
   //Display the current product
   String display = products[i];
   g2d.setColor(Color.black);
   g2d.drawString(display, x_legendText, y_legend);
   //Display the total sales
   display = "" + (int)sales[i];
   g2d.setColor(Color.black);
   g2d.drawString(display, x_legendText + 80, y_legend);
   //Display the sales percentage
   display = " (" + (int)(perc*100) + "%)";
   g2d.setColor(Color.red);
   g2d.drawString(display, x_legendText + 110, y_legend);
   //Draw the bar
   g2d.setColor(pc.getPieColor());
   legendRect.setLocation(x_legendBar,y_legend - textHeight/2);
   g2d.fill(legendRect);
   //Set new pie color
   pc.setNewColor();
   //Increment
   curElement++;
  }
 }
 ////////////////////////////////////////////////
 // Encode the graph   
 /////////////////////////////////////////
 OutputStream output = response.getOutputStream();
 JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(output);
 encoder.encode(bi);
 output.close(); %>

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章