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

附:本文全部源代码

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(); %>
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值