Struts2+JFreeChart制作图标

前言
     关于Struts2入门以及提高等在这里就不介绍了,但是关于Struts2的学习有以下推荐:

  1.  
    1. struts2-showcase-2.0.6.war:这个是官方自带的Demo(struts-2.0.6-all.zip\struts-2.0.6\apps目录下),非常全面,直接部署就可以了(很多朋友Struts2能学很好我估计还是直接从这里学来的)。
    2. wiki-WebWork:入了门的朋友应该都知道,strust2由webwork2和struts1.x合并起来的,但主要还是以webwork2为主,所以如果找不到Struts2的资料可以找WebWork资料看看。
    3. Max On Java的博客,他的博客的资料在中文的Struts2算是比较全的了,写得很详细。
    4. The Code ProjectGoogle - CodeSearchKoders:这几个代码搜索网站在我找不到中文资料甚至英文文章的时候帮了我大忙!

     关于JFreeChart入门等这里我也不打算介绍了,中文资料很多了。


 

 

正题
     下面以边帖图片和代码的方式来讲解Struts2JFreeChart的整合。
     搭建环境:首先帖一张工程的目录结构以及所需的jar包。注意:如果你不打算自己写ChartResult的话只需要引入struts2-jfreechart-plugin-2.0.6.jar(这个在struts-2.0.6-all.zip可以找到了):
         Struts2+JFreeChart制作图标_第1张图片
       1.依次帖web.xml、struts.xml、struts.properties和struts-jfreechart.xml几个配置文件的代码:
        web.xml

<? xml version="1.0" encoding="UTF-8" ?>
< web-app  version ="2.4"  
    xmlns
="http://java.sun.com/xml/ns/j2ee"  
    xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance"  
    xsi:schemaLocation
="http://java.sun.com/xml/ns/j2ee 
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
>
    
    
< filter >
        
< filter-name > struts2 </ filter-name >
        
< filter-class >
            org.apache.struts2.dispatcher.FilterDispatcher
        
</ filter-class >
    
</ filter >
    
< filter-mapping >
        
< filter-name > struts2 </ filter-name >
        
< url-pattern > /* </ url-pattern >
    
</ filter-mapping >
</ web-app >
        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 >
    
< include  file ="struts-jfreechart.xml"   />
</ struts >
        struts.properties
struts.ui.theme = simple
        struts-jfreechart.xml 
<! DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd"
>
< struts >
    
< package  name ="jFreeChartDemonstration"  extends ="struts-default"
        namespace
="/jfreechart" >
        
< result-types >
            
< result-type  name ="chart"  class ="org.apache.struts2.dispatcher.ChartResult" ></ result-type >
        
</ result-types >
        
< action  name ="JFreeChartAction"  class ="com.tangjun.struts2.JFreeChartAction" >
              
< result  type ="chart" >  
                   
< param  name ="width" > 400 </ param >
                   
< param  name ="height" > 300 </ param >
            
</ result >
        
</ action >
    
</ package >
</ struts >
        说明:这里只需要说明下struts-jfreechart.xml,这里直接调用已经写好的类ChartResult,这个类是继承自com.opensymphony.xwork2.Result,传入生成图片大小的参数width和height就可以了。

       2. 新建 JFreeChartAction继承 ActionSupport,生成JFreeChart对象并保存到chart中,注意这个名称是固定的。

package  com.tangjun.struts2;

import  com.opensymphony.xwork2.ActionSupport;
import  org.jfree.chart.ChartFactory;
import  org.jfree.chart.JFreeChart;
import  org.jfree.data.general.DefaultPieDataset;

public   class  JFreeChartAction  extends  ActionSupport {

    
/**
     * 
     
*/
    
private   static   final   long  serialVersionUID  =   5752180822913527064L ;

    
// 供ChartResult调用->ActionInvocation.getStack().findValue("chart")
     private  JFreeChart chart;
    
    @Override
    
public  String execute()  throws  Exception {
        
// 设置数据
        DefaultPieDataset data  =   new  DefaultPieDataset();
        data.setValue(
" Java " new  Double( 43.2 ));
        data.setValue(
" Visual Basic " new  Double( 1.0 ));
        data.setValue(
" C/C++ " new  Double( 17.5 ));
        data.setValue(
" tangjun " new  Double( 60.0 ));
        
// 生成JFreeChart对象
        chart  =  ChartFactory.createPieChart( " Pie Chart " , data,  true , true false );
        
        
return  SUCCESS;
    }

    
public  JFreeChart getChart() {
        
return  chart;
    }

    
public   void  setChart(JFreeChart chart) {
        
this .chart  =  chart;
    }
}


OK!至此代码已经全部贴完。
输入访问 http://localhost:8080/Struts2JFreeChart/jfreechart/JFreeChartAction.action
显示结果如下:
Struts2+JFreeChart制作图标_第2张图片




补充
    以上生成的图片是PNG格式的图片,如果需要自定义图片格式的话(好像只能支持JPG和PNG格式),那么自己写一个ChartResult继承自StrutsResultSupport,见代码:

 

package  com.tangjun.struts2.chartresult;

import  java.io.OutputStream;

import  javax.servlet.http.HttpServletResponse;

import  org.apache.struts2.ServletActionContext;
import  org.apache.struts2.dispatcher.StrutsResultSupport;
import  org.jfree.chart.ChartUtilities;
import  org.jfree.chart.JFreeChart;

import  com.opensymphony.xwork2.ActionInvocation;

public   class  ChartResult  extends  StrutsResultSupport {

    
/**
     * 
     
*/
    
private   static   final   long  serialVersionUID  =   4199494785336139337L ;
    
    
// 图片宽度
     private   int  width;
    
// 图片高度
     private   int  height;
    
// 图片类型 jpg,png
     private  String imageType;
    
    
    @Override
    
protected   void  doExecute(String arg0, ActionInvocation invocation)  throws  Exception {
        JFreeChart chart 
= (JFreeChart) invocation.getStack().findValue( " chart " );
        HttpServletResponse response 
=  ServletActionContext.getResponse();
        OutputStream os 
=  response.getOutputStream();
        
        
if ( " jpeg " .equalsIgnoreCase(imageType)  ||   " jpg " .equalsIgnoreCase(imageType))
            ChartUtilities.writeChartAsJPEG(os, chart, width, height);
        
else   if ( " png " .equalsIgnoreCase(imageType))
            ChartUtilities.writeChartAsPNG(os, chart, width, height);
        
else
            ChartUtilities.writeChartAsJPEG(os, chart, width, height);
        
        os.flush();

    }
    
public   void  setHeight( int  height) {
        
this .height  =  height;
    }

    
public   void  setWidth( int  width) {
        
this .width  =  width;
    }
    
    
public   void  setImageType(String imageType) {
        
this .imageType  =  imageType;
    }

}

如此的话还需要小小的修改一下struts-jfreechart.xml:

<! DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd"
>

< struts >
    
< package  name ="jFreeChartDemonstration"  extends ="struts-default"
        namespace
="/jfreechart" >
        
<!--  自定义返回类型  -->
        
< result-types >
            
<!--  
            <result-type name="chart" class="org.apache.struts2.dispatcher.ChartResult"></result-type>
             
-->
            
< result-type  name ="chart"  class ="com.tangjun.struts2.chartresult.ChartResult" ></ result-type >
        
</ result-types >

        
< action  name ="JFreeChartAction"  class ="com.tangjun.struts2.JFreeChartAction" >
              
<!--
              <result type="chart"> 
                   <param name="width">400</param>
                   <param name="height">300</param>
            </result>
            
-->
              
< result  type ="chart" >  
                   
< param  name ="width" > 400 </ param >
                   
< param  name ="height" > 300 </ param >
                   
< param  name ="imageType" > jpg </ param >
            
</ result >
        
</ action >
    
</ package >
</ struts >

OK!显示的效果是一样的,只是图片格式不一样,当然这里面你可以做更多操作!


 

 

Struts2中POI在内存中生成文件并下载

POI是一个JAVA的实用jar包,可以生成excel文件,通常在web开发用于把数据库的数据生成excel文件,然后通过下载提供给用户。

本文结合struts2和poi,说明如何在内存中生成一个excel文件并下载到客户端。

首先进行jsp文件,struts.xml文件和action文件的内容说明,对于struts.xml文件的下载配置和action文件中的对应的方法名的设定还不熟悉的朋友可以先看前面这篇文章struts2中下载文件的方法。

文件名:download.jsp

文件位置:网站根目录下的work目录下

文件内容:

 
 
  1. < %@ page contentType="text/html; charset=gbk" %> 
  2. < %@ taglib uri="/struts-tags" prefix="s"%> 
  3. < html> 
  4. < a href="excel.action">下载文件< /a> 
  5. < /html> 

struts.xml文件

文件内容:

 
 
  1. < ?xml version="1.0" encoding="UTF-8" ?> 
  2. < !DOCTYPE struts PUBLIC  
  3.     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"  
  4.     "http://struts.apache.org/dtds/struts-2.0.dtd"> 
  5.  
  6. < struts> 
  7.  
  8.     < package name="default" extends="struts-default"> 
  9.         < action name="excel" class="ExcelDownloadAction"> 
  10.             < result name="success" type="stream"> 
  11.                 < param name="contentType">application/vnd.ms-excel< /param> 
  12.                 < param name="contentDisposition">attachment;filename="AllUsers.xls"< /param> 
  13.                 < param name="inputName">excelFile< /param> 
  14.             < /result> 
  15.         < /action> 
  16.     < /package> 
  17.       
  18. < /struts> 
  19.  

然后是action文件

文件名:ExcelDownloadAction.java

文件内容:

 
 
  1. import java.io.ByteArrayInputStream;  
  2. import java.io.ByteArrayOutputStream;  
  3. import java.io.IOException;  
  4. import java.io.InputStream;  
  5.  
  6. import org.apache.poi.hssf.usermodel.HSSFCell;  
  7. import org.apache.poi.hssf.usermodel.HSSFRow;  
  8. import org.apache.poi.hssf.usermodel.HSSFSheet;  
  9. import org.apache.poi.hssf.usermodel.HSSFWorkbook;  
  10.  
  11. import com.opensymphony.xwork2.ActionSupport;  
  12.  
  13. @SuppressWarnings("serial")  
  14. public class ExcelDownloadAction extends ActionSupport {  
  15.  
  16.     public InputStream getExcelFile() {  
  17.         HSSFWorkbook workbook = new HSSFWorkbook();  
  18.         HSSFSheet sheet = workbook.createSheet("sheet1");  
  19.         {  
  20.             // 创建表头  
  21.             HSSFRow row = sheet.createRow(0);  
  22.             HSSFCell cell = row.createCell((short0);  
  23.             cell.setCellValue("id");  
  24.             cell = row.createCell((short1);  
  25.             cell.setEncoding(HSSFWorkbook.ENCODING_UTF_16);  
  26.             cell.setCellValue("姓");  
  27.             cell = row.createCell((short2);  
  28.             cell.setEncoding(HSSFWorkbook.ENCODING_UTF_16);  
  29.             cell.setCellValue("名");  
  30.             cell = row.createCell((short3);  
  31.             cell.setEncoding(HSSFWorkbook.ENCODING_UTF_16);  
  32.             cell.setCellValue("年龄");  
  33.  
  34.             // 创建数据  
  35.             // 第一行  
  36.             row = sheet.createRow(1);  
  37.             cell = row.createCell((short0);  
  38.             cell.setCellValue("1");  
  39.             cell = row.createCell((short1);  
  40.             cell.setEncoding(HSSFWorkbook.ENCODING_UTF_16);  
  41.             cell.setCellValue("张");  
  42.             cell = row.createCell((short2);  
  43.             cell.setEncoding(HSSFWorkbook.ENCODING_UTF_16);  
  44.             cell.setCellValue("四");  
  45.             cell = row.createCell((short3);  
  46.             cell.setCellValue("23");  
  47.  
  48.             // 第二行  
  49.             row = sheet.createRow(2);  
  50.             cell = row.createCell((short0);  
  51.             cell.setCellValue("2");  
  52.             cell = row.createCell((short1);  
  53.             cell.setEncoding(HSSFWorkbook.ENCODING_UTF_16);  
  54.             cell.setCellValue("李");  
  55.             cell = row.createCell((short2);  
  56.             cell.setEncoding(HSSFWorkbook.ENCODING_UTF_16);  
  57.             cell.setCellValue("六");  
  58.             cell = row.createCell((short3);  
  59.             cell.setCellValue("30");  
  60.         }  
  61.  
  62.         ByteArrayOutputStream baos = new ByteArrayOutputStream();  
  63.         try {  
  64.             workbook.write(baos);  
  65.         } catch (IOException e) {  
  66.             // TODO Auto-generated catch block  
  67.             e.printStackTrace();  
  68.         }  
  69.         byte[] ba = baos.toByteArray();  
  70.         ByteArrayInputStream bais = new ByteArrayInputStream(ba);  
  71.         return bais;  
  72.  
  73.     }  
  74.  
  75.     @Override 
  76.     public String execute() throws Exception {  
  77.         // TODO Auto-generated method stub  
  78.         return super.execute();  
  79.     }  
  80.  
  81. }  
  82.  

蓝色的代码使用poi生成一个excel格式的内容,红色的代码通过字节数组的输入输出流的转换提供给客户端最终的输入流。

你可能感兴趣的:(struts2,poi,jfreechart)