关于jfreechart的几个知识点
1、文件生成
系统临时目录的获取
System.getProperty("java.io.tmpdir")
随机文件名产生
//第一个参数为前缀,第二个为后缀
File.createTempFile("jfreechart", "jpeg");
2、图片的自动删除
参考:
http://hi.baidu.com/qingcao_xiaohei/blog/item/aaeebd518599f410377abe1a.html
http://hi.baidu.com/paulau/blog/item/760d9634e2fbd849241f1468.html
主要是
Session代表客户的会话过程,客户登录时,往Session中传入一个对象,即可跟踪客户的会话。在Servlet中,传入Session的对象如果是一个实现HttpSessionBindingListener接口的对象(方便起见,此对象称为监听器),则在传入的时候(即调用HttpSession对象的setAttribute方法的时候)和移去的时候(即调用HttpSession对象的removeAttribute方法的时候或Session Time out的时候)Session对象会自动调用监听器的valueBound和valueUnbound方法(这是HttpSessionBindingListener接口中的方法)。
3、jfreechart源码
DisplayChart.java
package org.jfree.chart.servlet;
import java.io.File;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class DisplayChart extends HttpServlet
{
public void init()
throws ServletException
{
}
public void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
HttpSession session = request.getSession();
String filename = request.getParameter("filename");
if (filename == null) {
throw new ServletException("Parameter 'filename' must be supplied");
}
filename = ServletUtilities.searchReplace(filename, "..", "");
File file = new File(System.getProperty("java.io.tmpdir"), filename);
if (!(file.exists())) {
throw new ServletException("File '" + file.getAbsolutePath() + "' does not exist");
}
boolean isChartInUserList = false;
ChartDeleter chartDeleter = (ChartDeleter)session.getAttribute("JFreeChart_Deleter");
if (chartDeleter != null) {
isChartInUserList = chartDeleter.isChartAvailable(filename);
}
boolean isChartPublic = false;
if ((filename.length() >= 6) &&
(filename.substring(0, 6).equals("public"))) {
isChartPublic = true;
}
boolean isOneTimeChart = false;
if (filename.startsWith(ServletUtilities.getTempOneTimeFilePrefix())) {
isOneTimeChart = true;
}
if ((isChartInUserList) || (isChartPublic) || (isOneTimeChart))
{
ServletUtilities.sendTempFile(file, response);
if (isOneTimeChart)
file.delete();
}
else
{
throw new ServletException("Chart image not found");
}
}
}
ServletUtilities.java
package org.jfree.chart.servlet;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.PrintStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.jfree.chart.ChartRenderingInfo;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
public class ServletUtilities
{
private static String tempFilePrefix = "jfreechart-";
private static String tempOneTimeFilePrefix = "jfreechart-onetime-";
public static String getTempFilePrefix()
{
return tempFilePrefix;
}
public static void setTempFilePrefix(String prefix)
{
if (prefix == null)
throw new IllegalArgumentException("Null 'prefix' argument.");
tempFilePrefix = prefix;
}
public static String getTempOneTimeFilePrefix()
{
return tempOneTimeFilePrefix;
}
public static void setTempOneTimeFilePrefix(String prefix)
{
if (prefix == null)
throw new IllegalArgumentException("Null 'prefix' argument.");
tempOneTimeFilePrefix = prefix;
}
public static String saveChartAsPNG(JFreeChart chart, int width, int height, HttpSession session)
throws IOException
{
return saveChartAsPNG(chart, width, height, null, session);
}
public static String saveChartAsPNG(JFreeChart chart, int width, int height, ChartRenderingInfo info, HttpSession session)
throws IOException
{
if (chart == null)
throw new IllegalArgumentException("Null 'chart' argument.");
createTempDir();
String prefix = tempFilePrefix;
if (session == null)
prefix = tempOneTimeFilePrefix;
File tempFile = File.createTempFile(prefix, ".png", new File(System.getProperty("java.io.tmpdir")));
ChartUtilities.saveChartAsPNG(tempFile, chart, width, height, info);
if (session != null)
registerChartForDeletion(tempFile, session);
return tempFile.getName();
}
public static String saveChartAsJPEG(JFreeChart chart, int width, int height, HttpSession session)
throws IOException
{
return saveChartAsJPEG(chart, width, height, null, session);
}
public static String saveChartAsJPEG(JFreeChart chart, int width, int height, ChartRenderingInfo info, HttpSession session)
throws IOException
{
if (chart == null) {
throw new IllegalArgumentException("Null 'chart' argument.");
}
createTempDir();
String prefix = tempFilePrefix;
if (session == null)
prefix = tempOneTimeFilePrefix;
File tempFile = File.createTempFile(prefix, ".jpeg", new File(System.getProperty("java.io.tmpdir")));
ChartUtilities.saveChartAsJPEG(tempFile, chart, width, height, info);
if (session != null)
registerChartForDeletion(tempFile, session);
return tempFile.getName();
}
protected static void createTempDir()
{
String tempDirName = System.getProperty("java.io.tmpdir");
if (tempDirName == null) {
throw new RuntimeException("Temporary directory system property (java.io.tmpdir) is null.");
}
File tempDir = new File(tempDirName);
if (!(tempDir.exists()))
tempDir.mkdirs();
}
protected static void registerChartForDeletion(File tempFile, HttpSession session)
{
if (session != null) {
ChartDeleter chartDeleter = (ChartDeleter)session.getAttribute("JFreeChart_Deleter");
if (chartDeleter == null) {
chartDeleter = new ChartDeleter();
session.setAttribute("JFreeChart_Deleter", chartDeleter);
}
chartDeleter.addChart(tempFile.getName());
}
else {
System.out.println("Session is null - chart will not be deleted");
}
}
public static void sendTempFile(String filename, HttpServletResponse response)
throws IOException
{
File file = new File(System.getProperty("java.io.tmpdir"), filename);
sendTempFile(file, response);
}
public static void sendTempFile(File file, HttpServletResponse response)
throws IOException
{
String mimeType = null;
String filename = file.getName();
if (filename.length() > 5)
if (filename.substring(filename.length() - 5, filename.length()).equals(".jpeg"))
{
mimeType = "image/jpeg";
}
else if (filename.substring(filename.length() - 4, filename.length()).equals(".png"))
{
mimeType = "image/png";
}
sendTempFile(file, response, mimeType);
}
public static void sendTempFile(File file, HttpServletResponse response, String mimeType)
throws IOException
{
if (file.exists()) {
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
if (mimeType != null)
response.setHeader("Content-Type", mimeType);
response.setHeader("Content-Length", String.valueOf(file.length()));
SimpleDateFormat sdf = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z");
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
response.setHeader("Last-Modified", sdf.format(new Date(file.lastModified())));
BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream());
byte[] input = new byte[1024];
boolean eof = false;
while (!(eof)) {
int length = bis.read(input);
if (length == -1) {
eof = true;
}
else
bos.write(input, 0, length);
}
bos.flush();
bis.close();
bos.close();
}
else {
throw new FileNotFoundException(file.getAbsolutePath());
}
}
public static String searchReplace(String inputString, String searchString, String replaceString)
{
int i = inputString.indexOf(searchString);
if (i == -1) {
return inputString;
}
String r = "";
r = r + inputString.substring(0, i) + replaceString;
if (i + searchString.length() < inputString.length()) {
r = r + searchReplace(inputString.substring(i + searchString.length()), searchString, replaceString);
}
return r;
}
}
ChartDeleter.java
package org.jfree.chart.servlet;
import java.io.File;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;
public class ChartDeleter
implements HttpSessionBindingListener
{
private List chartNames = new ArrayList();
public void addChart(String filename)
{
this.chartNames.add(filename);
}
public boolean isChartAvailable(String filename)
{
return this.chartNames.contains(filename);
}
public void valueBound(HttpSessionBindingEvent event)
{
}
public void valueUnbound(HttpSessionBindingEvent event)
{
Iterator iter = this.chartNames.listIterator();
while (iter.hasNext()) {
String filename = (String)iter.next();
File file = new File(System.getProperty("java.io.tmpdir"), filename);
if (file.exists())
file.delete();
}
}
}