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

59 篇文章 0 订阅
index.jsp
<%@ 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/musichouse"; String dbuid = "root"; String dbpwd = "";



// 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

PieColors pc = new PieColors();

//Colors Color

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

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

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

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(); %>
附件: p_products.sql(七条数据只显示六条的结果)
p_sales.sql
mysql的jdbc包(见jsp数据饼图.rar)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值