首先说明几点:
1.假设读者已经能搭建struts2的环境,已经稍微了解jasperReport和iReport的基础知识(这个基础知识能百度出来)
2.制作报表的时候使用的是iReport工具,那么要保证JasperReport的版本和iReport的版本一致!我使用的都是4.5.1版(这个要点是我从风中叶的教学视频中得知的)
3.导入jar包
jar包分三部分:struts2的jar包,struts2-jasperreports-plugin的jar包(这两个jar包都可以在struts2的lib文件夹中找到),和jasperReport的jar包
4.注意struts2的jasper结果类型的转换
5.注意action访问的方式,我测试form提交总是报错….
6.注意工具类的调用,这个很重要,不然导出的excel格式很乱,根本无法使用,被这个折磨好久
下面就贴代码:
1:web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<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>
</web-app>
2:struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<constant name="struts.devMode" value="true" />
<package name="struts2" namespace="/" extends="struts-default,jasperreports-default">
<action name="JasperAction" class="com.yzj.action.JasperAction">
<result name="success" type="jasper">
<param name="location">/report/test.jasper</param>
<param name="dataSource">list</param>
<param name="reportParameters">reportParameters</param>
<param name="exportParameters">exportParameters</param>
<param name="format">XLS</param>
</result>
</action>
</package>
</struts>
说明一下:由于struts2本身不能识别<result name="success" type="jasper">这种结果类型,那么就需要自己配置,这里可以使用下面几种方式配置jasper的result类型
1:利用struts2的xml配置中多继承的方式,就如我上面的extends="struts-default,jasperreports-default"
2:修改jasperreports-default.xml中的配置文件,让它继承struts-default.xml,然后自己的struts.xml再继承jasperreports-default.xml
(上面两个的目的都是为了自己的struts.xml能够继承到struts-default.xml)
3:在配置文件的package标签里面加上这句result指定:
<result-types>
<result-type name="jasper" class="org.apache.struts2.views.jasperreports.JasperReportsResult"/>
</result-types>
目的都是为了
struts2
能够识别
jasper
这种结果类型
3.index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
<script type="text/javascript">
function exp(){
if(confirm("确定要导出清单?")){
var url="JasperAction.action";
window.open(url,'exportReport','height=5,width=5,status=yes,toolbar=no,menubar=no,location=no');
}
}
</script>
</head>
<body>
Ttest jasperreport<br>
<a href="#" οnclick="exp();">PDF</a>
</body>
</html>
这个是初始页面,也是进行导出的页面,很简单,就一个链接,使用js访问JasperAction的exportReport方法,当然也可以使用location.href=””的方式进去访问~!
不过表单提交的方式好像不行,因为我之前使用form提交,总是报错,后来改成这种形式之后,才消除问题的~!
4.JasperAction.java
package com.yzj.action;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import com.opensymphony.xwork2.ActionSupport;
public class JasperAction extends ActionSupport{
private List<User> list;
private Map<String,String> reportParameters;
private final Map<Object,Object> exportParameters=(Map<Object,Object>)JasperUtils.getMap();
@Override
public String execute(){
System.out.println("OK");
this.list = new LinkedList<User>();
this.list.add(new User("111","aaa"));
this.list.add(new User("222","bbb"));
this.list.add(new User("333","ccc"));
reportParameters = new HashMap<String,String>();
reportParameters.put("TIME", "2015");
return SUCCESS;
}
public Map<Object, Object> getExportParameters() {
return exportParameters;
}
public Map<String, String> getReportParameters() {
return reportParameters;
}
public void setReportParameters(Map<String, String> reportParameters) {
this.reportParameters = reportParameters;
}
public List<User> getList() {
return this.list;
}
public void setList(List<User> list) {
this.list = list;
}
}
这个就是处理请求的action了,可以看出它关联了两个其他的类,一个是User.java一个是JasperUtils.java,分别如下:
5.User.java
package com.yzj.action;
public class User {
private String username;
private String password;
public User(){}
public User(String username,String password){
this.username = username;
this.password = password;
}
public String getUsername() {
return username;
}
public String getPassword() {
return password;
}
public void setUsername(String username) {
this.username = username;
}
public void setPassword(String password) {
this.password = password;
}
}
这个只是一个POJO,用来给jasperReport填充数据的,我在action中是手动赋值的,当然在实际应用中就可以冲数据库中取值了,然后组装成一个list就行了,结果是一样的--都是生成数据源
6.JasperUtils.java
package com.yzj.action;
import java.util.HashMap;
import java.util.Map;
import net.sf.jasperreports.engine.JRExporterParameter;
import net.sf.jasperreports.engine.export.JExcelApiExporterParameter;
import net.sf.jasperreports.engine.export.JRCsvExporterParameter;
import net.sf.jasperreports.engine.export.JRXlsExporterParameter;
public class JasperUtils {
private final static Map map = new HashMap();
static {
map.put(JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET, Boolean.TRUE);
map.put(JRXlsExporterParameter.IS_FONT_SIZE_FIX_ENABLED, Boolean.TRUE);
map.put(JRXlsExporterParameter.PROPERTY_IGNORE_CELL_BORDER, Boolean.TRUE);
//对于导出excel来说下面三个很重要
map.put(JRXlsExporterParameter.IS_WHITE_PAGE_BACKGROUND, Boolean.FALSE);
map.put(JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS, Boolean.TRUE);
map.put(JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_COLUMNS, Boolean.TRUE);
map.put(JExcelApiExporterParameter.IS_COLLAPSE_ROW_SPAN, Boolean.TRUE);
map.put(JRCsvExporterParameter.FIELD_DELIMITER, "");
map.put(JRExporterParameter.CHARACTER_ENCODING, "UTF-8");
}
public static Map getMap(){
return map;
}
}
工具类主要是提供了一些JasperReport的参数,具体意义自己研读一下,百度一下,其实这些常量名字已经很直白了~!
7.最后就一个.Jasper文件了
test.jasper
这个是我在iReport中画的简单模板:
还是贴出对应的.jrxml吧,这样即便没有iReprt也可以利用代码去编译了
<?xml version="1.0" encoding="UTF-8"?>
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="sss" language="groovy" pageWidth="842" pageHeight="595" orientation="Landscape" columnWidth="802" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20">
<property name="ireport.zoom" value="1.4641000000000006"/>
<property name="ireport.x" value="10"/>
<property name="ireport.y" value="0"/>
<parameter name="TIME" class="java.lang.String"/>
<field name="username" class="java.lang.String"/>
<field name="password" class="java.lang.String"/>
<background>
<band splitType="Stretch"/>
</background>
<title>
<band height="31" splitType="Stretch">
<staticText>
<reportElement x="107" y="0" width="295" height="31"/>
<textElement textAlignment="Center">
<font size="14"/>
</textElement>
<text><![CDATA[Test Struts2 and JaspeRreports]]></text>
</staticText>
</band>
</title>
<pageHeader>
<band height="26">
<staticText>
<reportElement x="243" y="0" width="159" height="25"/>
<textElement>
<font size="12"/>
</textElement>
<text><![CDATA[password]]></text>
</staticText>
<staticText>
<reportElement x="107" y="0" width="136" height="25"/>
<textElement>
<font size="12"/>
</textElement>
<text><![CDATA[username]]></text>
</staticText>
</band>
</pageHeader>
<detail>
<band height="26">
<textField>
<reportElement x="243" y="0" width="159" height="25"/>
<textElement>
<font size="12"/>
</textElement>
<textFieldExpression><![CDATA[$F{password}]]></textFieldExpression>
</textField>
<textField>
<reportElement x="107" y="0" width="136" height="25"/>
<textElement>
<font size="12"/>
</textElement>
<textFieldExpression><![CDATA[$F{username}]]></textFieldExpression>
</textField>
</band>
</detail>
<lastPageFooter>
<band height="50">
<textField>
<reportElement x="243" y="0" width="159" height="20"/>
<textElement/>
<textFieldExpression><![CDATA[$P{TIME}]]></textFieldExpression>
</textField>
</band>
</lastPageFooter>
</jasperReport>
自此,所有的文件都已经备齐了,启动工程访问就可以了
多说两句导入jar包吧,如果保证了jasperreport和ireport的版本一致,jar包就很好弄了,我看视频中是把jasperreport的所有jar都放在了WEB-INF下面了,其实不用这么多的~!虽然我已经删了一些了,但是还有很多没来得及测试,万幸的是,这些jar都可以从下载的jasperreport和struts2的工程里面找到~!
还有中文的问题,我还没测试,这个网上也有蛮多解决方式的~!
顺便推荐一本报表相关的书:
Java报表开发技术深入解析-刘聪著
本人菜鸟初次写心得,有什么问题请大家指教
工程下载(已包含jar包):
http://download.youkuaiyun.com/detail/seguzhizi/8406977