前言
关于Struts2入门以及提高等在这里就不介绍了,但是关于Struts2的学习有以下推荐:
-
- struts2-showcase-2.0.6.war:这个是官方自带的Demo(struts-2.0.6-all.zip\struts-2.0.6\apps目录下),非常全面,直接部署就可以了(很多朋友Struts2能学很好我估计还是直接从这里学来的)。
- wiki-WebWork:入了门的朋友应该都知道,strust2由webwork2和struts1.x合并起来的,但主要还是以webwork2为主,所以如果找不到Struts2的资料可以找WebWork资料看看。
- Max On Java的博客,他的博客的资料在中文的Struts2算是比较全的了,写得很详细。
- The Code Project、Google - CodeSearch、Koders:这几个代码搜索网站在我找不到中文资料甚至英文文章的时候帮了我大忙!
关于JFreeChart入门等这里我也不打算介绍了,中文资料很多了。
正题
下面以边帖图片和代码的方式来讲解Struts2与JFreeChart的整合。
搭建环境:首先帖一张工程的目录结构以及所需的jar包。注意:如果你不打算自己写ChartResult的话只需要引入struts2-jfreechart-plugin-2.0.6.jar(这个在struts-2.0.6-all.zip可以找到了):
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
显示结果如下:
补充
以上生成的图片是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目录下
文件内容:
- < %@ page contentType="text/html; charset=gbk" %>
- < %@ taglib uri="/struts-tags" prefix="s"%>
- < html>
- < a href="excel.action">下载文件< /a>
- < /html>
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>
-
- < package name="default" extends="struts-default">
- < action name="excel" class="ExcelDownloadAction">
- < result name="success" type="stream">
- < param name="contentType">application/vnd.ms-excel< /param>
- < param name="contentDisposition">attachment;filename="AllUsers.xls"< /param>
- < param name="inputName">excelFile< /param>
- < /result>
- < /action>
- < /package>
-
- < /struts>
-
然后是action文件
文件名:ExcelDownloadAction.java
文件内容:
- import java.io.ByteArrayInputStream;
- import java.io.ByteArrayOutputStream;
- import java.io.IOException;
- import java.io.InputStream;
-
- import org.apache.poi.hssf.usermodel.HSSFCell;
- import org.apache.poi.hssf.usermodel.HSSFRow;
- import org.apache.poi.hssf.usermodel.HSSFSheet;
- import org.apache.poi.hssf.usermodel.HSSFWorkbook;
-
- import com.opensymphony.xwork2.ActionSupport;
-
- @SuppressWarnings("serial")
- public class ExcelDownloadAction extends ActionSupport {
-
- public InputStream getExcelFile() {
- HSSFWorkbook workbook = new HSSFWorkbook();
- HSSFSheet sheet = workbook.createSheet("sheet1");
- {
-
- HSSFRow row = sheet.createRow(0);
- HSSFCell cell = row.createCell((short) 0);
- cell.setCellValue("id");
- cell = row.createCell((short) 1);
- cell.setEncoding(HSSFWorkbook.ENCODING_UTF_16);
- cell.setCellValue("姓");
- cell = row.createCell((short) 2);
- cell.setEncoding(HSSFWorkbook.ENCODING_UTF_16);
- cell.setCellValue("名");
- cell = row.createCell((short) 3);
- cell.setEncoding(HSSFWorkbook.ENCODING_UTF_16);
- cell.setCellValue("年龄");
-
-
-
- row = sheet.createRow(1);
- cell = row.createCell((short) 0);
- cell.setCellValue("1");
- cell = row.createCell((short) 1);
- cell.setEncoding(HSSFWorkbook.ENCODING_UTF_16);
- cell.setCellValue("张");
- cell = row.createCell((short) 2);
- cell.setEncoding(HSSFWorkbook.ENCODING_UTF_16);
- cell.setCellValue("四");
- cell = row.createCell((short) 3);
- cell.setCellValue("23");
-
-
- row = sheet.createRow(2);
- cell = row.createCell((short) 0);
- cell.setCellValue("2");
- cell = row.createCell((short) 1);
- cell.setEncoding(HSSFWorkbook.ENCODING_UTF_16);
- cell.setCellValue("李");
- cell = row.createCell((short) 2);
- cell.setEncoding(HSSFWorkbook.ENCODING_UTF_16);
- cell.setCellValue("六");
- cell = row.createCell((short) 3);
- cell.setCellValue("30");
- }
-
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- try {
- workbook.write(baos);
- } catch (IOException e) {
-
- e.printStackTrace();
- }
- byte[] ba = baos.toByteArray();
- ByteArrayInputStream bais = new ByteArrayInputStream(ba);
- return bais;
-
- }
-
- @Override
- public String execute() throws Exception {
-
- return super.execute();
- }
-
- }
-
蓝色的代码使用poi生成一个excel格式的内容,红色的代码通过字节数组的输入输出流的转换提供给客户端最终的输入流。