Jfreechart + struts2 实现数据下探 Demo

来源:互联网 发布:淘宝怎么搜高仿衣服 编辑:程序博客网 时间:2024/05/21 17:06

Jfreechart + struts2 实现数据下探


研究了好多天。网上的教程都是缺斤短两。自己又是个新手搞了好久。终于今天解决了。贴下源码做个笔记:

1、目录结构:


红框内是源码位置。

2、jar包。有一些是没用的。为了方便我都导入了



3、web.xml配置

<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://java.sun.com/xml/ns/javaee"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"id="WebApp_ID" version="2.5"><!-- <display-name>CrmJfreechart</display-name> --><!-- struts2过滤器 --><filter><filter-name>struts2</filter-name><filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class></filter><filter-mapping><filter-name>struts2</filter-name><url-pattern>/*</url-pattern></filter-mapping><servlet><servlet-name>DisplayChart</servlet-name><servlet-class>org.jfree.chart.servlet.DisplayChart</servlet-class></servlet><servlet-mapping><servlet-name>DisplayChart</servlet-name><url-pattern>/servletDisplayChart</url-pattern></servlet-mapping></web-app>

4、struts.xml 配置信息

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE struts PUBLIC    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"    "http://struts.apache.org/dtds/struts-2.0.dtd"><struts><constant name="struts.enable.DynamicMethodInvocation" value="true" />    <constant name="struts.devMode" value="true" /><constant name="struts.action.extension" value="do,action"/>     <package name="first" extends="jfreechart-default" namespace="/">           <action name="chart" class="com.web.action.ChartAction" method="getChart">              <result name="first">/first.jsp</result>          </action>      </package>            <package name="b" namespace="/" extends="jfreechart-default">          <action name="bchart"  class="com.web.action.ChartActionB">              <result type="chart">                  <param name="width">700</param>                  <param name="height">400</param>              </result>          </action>      </package>  </struts>

5、重要的action源码

ChartAction.java    第一个显示的。

package com.web.action;import java.awt.Color;import java.awt.Font;import java.io.IOException;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.struts2.interceptor.ServletRequestAware;import org.apache.struts2.interceptor.ServletResponseAware;import org.jfree.chart.ChartFactory;import org.jfree.chart.ChartRenderingInfo;import org.jfree.chart.ChartUtilities;import org.jfree.chart.JFreeChart;import org.jfree.chart.entity.StandardEntityCollection;import org.jfree.chart.labels.StandardPieToolTipGenerator;import org.jfree.chart.plot.PiePlot;import org.jfree.chart.servlet.ServletUtilities;import org.jfree.chart.title.LegendTitle;import org.jfree.chart.title.TextTitle;import org.jfree.chart.urls.StandardPieURLGenerator;import org.jfree.data.general.DefaultPieDataset;import com.opensymphony.xwork2.ActionSupport;@SuppressWarnings("serial")public class ChartAction extends ActionSupport implements ServletRequestAware,ServletResponseAware {private HttpServletRequest request;private HttpServletResponse response;private String mapMessage;private String src;public String getChart() throws IOException {// 生成饼图JFreeChart chart = ChartFactory.createPieChart("图书销售统计表", // 图表标题getDateSet(), // 数据true, // 是否显示图例true, // 是否显示工具提示true // 是否生成URL);// 设置标题及标题字体chart.setTitle(new TextTitle("图书销售统计图", new Font("黑体", Font.ITALIC, 22)));// 建一个图例LegendTitle legendTitle = chart.getLegend(0);// 设置图例字体legendTitle.setItemFont(new Font("宋体", Font.BOLD, 14));// 获取饼图plot对象PiePlot plot = (PiePlot) chart.getPlot();// 根据key指定各个数据饼图的颜色plot.setSectionPaint("JAVA教程", Color.RED);plot.setSectionPaint("c++教程", Color.BLUE);plot.setSectionPaint("C#教程", Color.GREEN);plot.setSectionPaint("VC++教程", Color.ORANGE);// 设置plot字体plot.setLabelFont(new Font("宋体", Font.BOLD, 18));// 设置背景透明度(0~1)plot.setBackgroundAlpha(0.9f);// -------------------热点设置分割线----------------------------// 设定链接plot.setNoDataMessage("No data available");String str = request.getContextPath() + "/bchart.action";// StandardPieURLGenerator()不设置第二个参数"type"默认为categoryplot.setURLGenerator(new StandardPieURLGenerator(str, "type"));plot.setToolTipGenerator(new StandardPieToolTipGenerator());StandardEntityCollection sec = new StandardEntityCollection();// 生成RenderingInfo实例,info参数就是图片的热点信息ChartRenderingInfo info = new ChartRenderingInfo(sec);response.setCharacterEncoding("GBK");String filename = null;try {filename = ServletUtilities.saveChartAsJPEG(chart, 700, 500, info,request.getSession());} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}mapMessage = ChartUtilities.getImageMap("map0", info);src = request.getContextPath() + "/servletDisplayChart?filename="+ filename;return "first";}private static DefaultPieDataset getDateSet() {// 提供生成饼图的数据DefaultPieDataset dataset = new DefaultPieDataset();dataset.setValue("JAVA教程", 47);dataset.setValue("c++教程", 23);dataset.setValue("C#教程", 20);dataset.setValue("VC++教程", 10);return dataset;}public void setServletRequest(HttpServletRequest request) {this.request = request;}public void setServletResponse(HttpServletResponse response) {this.response = response;}public String getMapMessage() {return mapMessage;}public void setMapMessage(String mapMessage) {this.mapMessage = mapMessage;}public String getSrc() {return src;}public void setSrc(String src) {this.src = src;}}

ChartActionB.java    跳转到的Action


package com.web.action;import java.awt.Color;import java.awt.Font;import java.io.IOException;import javax.servlet.http.HttpServletRequest;import org.apache.struts2.interceptor.ServletRequestAware;import org.jfree.chart.ChartFactory;import org.jfree.chart.JFreeChart;import org.jfree.chart.axis.CategoryAxis;import org.jfree.chart.axis.NumberAxis;import org.jfree.chart.plot.CategoryPlot;import org.jfree.chart.plot.PlotOrientation;import org.jfree.chart.title.TextTitle;import org.jfree.data.category.CategoryDataset;import org.jfree.data.category.DefaultCategoryDataset;import com.opensymphony.xwork2.ActionSupport;@SuppressWarnings("serial")public class ChartActionB extends ActionSupport implements ServletRequestAware {private HttpServletRequest request;public JFreeChart getChart() throws IOException {// ---------------------逻辑判断分割线-------------------------------CategoryDataset dataset;String queryString = request.getQueryString();queryString = java.net.URLDecoder.decode(queryString, "UTF-8");System.out.println(queryString);String type = null;for (String param : queryString.split("&")) {String[] nameValue = param.split("=");type = nameValue[0].equals("type") ? nameValue[1] : type;}String subTitle = "";if (type.equals("JAVA教程")) {dataset = getDateSet1();subTitle = "JAVA教程";} else if (type.equals("c++教程")) {dataset = getDateSet4();subTitle = "c++教程";} else if (type.equals("C#教程")) {dataset = getDateSet2();subTitle = "C#教程";} else {dataset = getDateSet3();subTitle = "VC++教程";}// String title = subTitle + "图书的销售情况";// -------------------------生成图片分割线---------------------// 生成柱状图JFreeChart chart = ChartFactory.createBarChart("图书销售统计表", // 图表标题"月份", // 目录轴的显示标签"销量", // 数值轴的显示标签dataset, // 数据// PlotOrientation.HORIZONTAL, //图表方向水平PlotOrientation.VERTICAL, // 图表方向垂直false, // 是否显示图例false, // 是否显示工具提示false // 是否生成URL);// 设置标题及标题字体chart.setTitle(new TextTitle("<<" + subTitle + ">>销售统计图", new Font("黑体", Font.ITALIC, 22)));// 建一个图例// LegendTitle legendTitle = chart.getLegend(0);// 设置图例字体// legendTitle.setItemFont(new Font("宋体",Font.BOLD,14));// 获取柱状图plot对象CategoryPlot plot = (CategoryPlot) chart.getPlot();// 设置柱型的颜色plot.getRenderer().setSeriesPaint(0, Color.blue);// 取得横轴CategoryAxis categoryAxis = plot.getDomainAxis();// 设置横轴的字体categoryAxis.setLabelFont(new Font("宋体", Font.BOLD, 22));// 设置分类标签以45度倾斜// categoryAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45);// 设置分类标签字体categoryAxis.setTickLabelFont(new Font("宋体", Font.BOLD, 22));// 取得纵轴NumberAxis numberAxis = (NumberAxis) plot.getRangeAxis();// 设置纵轴的字体numberAxis.setLabelFont(new Font("宋体", Font.BOLD, 22));// 设置背景透明度(0~1)plot.setBackgroundAlpha(0.9f);return chart;}// ------------------------提供数据分割线--------------------private static DefaultCategoryDataset getDateSet4() {System.out.println("c++");// 提供生成柱形图的数据DefaultCategoryDataset dataset = new DefaultCategoryDataset();dataset.addValue(47, "c++教程", "06年10月");dataset.addValue(60, "c++教程", "06年11月");dataset.addValue(20, "c++教程", "06年12月");dataset.addValue(50, "c++教程", "07年1月");return dataset;}private static DefaultCategoryDataset getDateSet1() {System.out.println("java");// 提供生成柱形图的数据DefaultCategoryDataset dataset1 = new DefaultCategoryDataset();dataset1.addValue(47, "JAVA教程", "06年10月");dataset1.addValue(23, "JAVA教程", "06年11月");dataset1.addValue(20, "JAVA教程", "06年12月");dataset1.addValue(10, "JAVA教程", "07年1月");return dataset1;}private static DefaultCategoryDataset getDateSet2() {System.out.println("C#");// 提供生成柱形图的数据DefaultCategoryDataset dataset2 = new DefaultCategoryDataset();dataset2.addValue(27, "C#教程", "06年10月");dataset2.addValue(23, "C#教程", "06年11月");dataset2.addValue(40, "C#教程", "06年12月");dataset2.addValue(70, "C#教程", "07年1月");return dataset2;}private static DefaultCategoryDataset getDateSet3() {System.out.println("VC++");// 提供生成柱形图的数据DefaultCategoryDataset dataset3 = new DefaultCategoryDataset();dataset3.addValue(48, "VC++教程", "06年10月");dataset3.addValue(63, "VC++教程", "06年11月");dataset3.addValue(29, "VC++教程", "06年12月");dataset3.addValue(49, "VC++教程", "07年1月");return dataset3;}public void setServletRequest(HttpServletRequest request) {this.request = request;}}

6、JSP页面的源码

<%@ page language="java" contentType="text/html; charset=GBK"pageEncoding="GBK" %>  <%@ taglib prefix="s" uri="/struts-tags"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><title>Insert title here</title></head><body><P ALIGN="CENTER"><s:property value="mapMessage" escape="false" /><img src="<s:property value='src'/>" border=0 usemap="#map0"></P></body></html>

实现效果展示:



点击java教程进入 下层数据



好多天终于出来了。瞬间有种解脱的感觉。这是刚进公司的第一个任务。做了好久。总算有收获。


对于有些时候图片出现乱码的时候。一定要统一几个地方的编码

项目编码、jsp页面编码、后台action编码、浏览器编码都需要一致。


由于本人只是菜鸟刚入行,有不妥之处,还望各位大神不吝指出。


0 0