之前说过如何将jasperreport集成到spring mvc当中,但有些场景中我们也会通过servlet+jsp+jasperreport的方式来展示报表内容,本文就这种方式简单介绍一下如何在servlet中使用jasperreport来展示报表,包括实现步骤,具体实现内容,参数传递方式等。
1、使用mysql数据库,创建报表测试数据库testreport,并创建相关业务表,这里根据各自测试内容自行创建,不再赘述;
2、在eclipse中创建Dynamic Web Project,命名为testReport,并添加依赖包:
jasperreports-6.1.0.jar
iTextAsian.jar
itext-2.1.7.jar
3、创建并编辑web.xml内容:
<?xml version="1.0"?>
<web-app version="2.5" 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/javaeehttp://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<servlet>
<servlet-name>TestServlet</servlet-name>
<servlet-class>servlet.JasperServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>TestServlet</servlet-name>
<url-pattern>/testServlet</url-pattern>
</servlet-mapping>
</web-app>
其中servlet-class的路径必须与实际servlet类对应。
4、创建获取jdbc连接的工具类util.DBUtils.java:
package util;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class DBUtils {
private static final String URL="jdbc:mysql://192.168.0.200:3306/testreport";
private static final String USERNAME ="root";
private static final String PASSWORD ="root";
static{
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public static Connection getConnection(){
Connection conn = null;
try {
conn = DriverManager.getConnection(URL,USERNAME,PASSWORD);
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
}
5、将ireport编译生成好的jasper文件放在指定位置,这里是“F:\\Yan\\ireport\\test.jasper”(这里为了便于测试随意选择了一个路径,建议放在工程相对路径下的resources路径下);
6、准备工作完成,现在创建servlset,并在doGet方法中编辑报表读取代码:
package servlet;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.sql.Connection;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperRunManager;
import util.DBUtils;
public class JasperServlet extends HttpServlet{
private static final long serialVersionUID = 5044554587015859089L;
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletOutputStream out = resp.getOutputStream();
resp.setCharacterEncoding("utf-8");
//报表文件路径
String htmlAddr="F:\\Yan\\ireport\\test.jasper";
Connection conn = DBUtils.getConnection();
//加入参数
Map<String,Object> params= new HashMap<String,Object>();
params.put("userid", "test-001");
try {
params.put("operateDate", new SimpleDateFormat("yyyy-MM-dd").parse("2017-05-23"));
} catch (ParseException e1) {
e1.printStackTrace();
}
//报表文件读取
try {
String file = JasperRunManager.runReportToHtmlFile(htmlAddr, params,conn);
BufferedInputStream in = new BufferedInputStream(new FileInputStream(new File(file)));
byte[] buf = new byte[8192];
while(in.read(buf)!=-1){
out.write(buf);
}
out.flush();
in.close();
out.close();
} catch (JRException e) {
e.printStackTrace();
}
}
}
本文主要介绍以html形式展示报表内容,如果需要通过pdf形式进行展示,则仅需使用JasperRunManager的runReportToPdf或者runReportToPdfStream方法即可。