JasperReport学習ノート4-検索データベースから動的なレポート(WEB)が生成されます。


二つの方法に分ける
第一種類
1.テンプレート

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE jasperReport PUBLIC "//JasperReports//DTD Report Design//EN"
"http://jasperreports.sourceforge.net/dtds/jasperreport.dtd">
<jasperReport name="DBReport">
	<parameter name="hp" class="java.lang.Integer"></parameter>	
	<queryString>
		<![CDATA[
			select tb.name as name,tb.age as age,tbs.marks as marks from jaspertb tb join jaspertbs tbs on(tb.id = tbs.tbid) where tb.id > $P{hp}
		]]>
	</queryString>
	<field name="marks" class="java.lang.Integer"></field>
	<field name="name" class="java.lang.String"></field>
	<field name="age" class="java.lang.Integer"></field>
	<pageHeader>
		<band height="30">
			<staticText>
				<reportElement x="0" y="0" width="69" height="24" />
				<text><![CDATA[marks:]]></text>
			</staticText>
			
			<staticText>
				<reportElement x="140" y="0" width="79" height="24" />
				<text><![CDATA[name:]]></text>
			</staticText>
			
			<staticText>
				<reportElement x="280" y="0" width="69" height="24" />
				<text><![CDATA[age:]]></text>
			</staticText>	
			
			<staticText>
				<reportElement x="420" y="0" width="69" height="24" />
				<text><![CDATA[you don't see this]]></text>
			</staticText>		
		</band>
	</pageHeader>
	
	<detail>
		<band height="30">
			<textField>
				<reportElement x="0" y="0" width="69" height="24" />
				<textFieldExpression class="java.lang.Integer">
					<![CDATA[$F{marks}]]>
				</textFieldExpression>
			</textField>
			<textField>
				<reportElement x="140" y="0" width="69" height="24" />
				<textFieldExpression class="java.lang.String">
					<![CDATA[$F{name}]]>
				</textFieldExpression>
			</textField>
			<textField>
				<reportElement x="280" y="0" width="69" height="24" />
				<textFieldExpression class="java.lang.Integer">
					<![CDATA[$F{age}]]>
				</textFieldExpression>
			</textField>	
			<staticText>
				<reportElement x="420" y="0" width="69" height="24" />
				<text><![CDATA[If you don't see this, it didn't work]]></text>
			</staticText>
		</band>
	</detail>
</jasperReport>
2.上記のJRXMLファイルをJASPERファイルを作成し、WEBでの呼び出しに便利です。(下記の方法で作成できます。知っているフォルダの下に置いてください。)

JasperCompileManager.compileReportToFile("WebRoot\\report\\JasperReportSQL.xml","WebRoot\\report\\JasperReportSQL.jasper");
3.Servletを書いて呼び出します

import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.HashMap;

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;

public class DynamicCreateReportWithServlet extends HttpServlet {

	private static final long serialVersionUID = 1L;

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		Connection connection = null;
		//     
		ServletOutputStream servletOutputStream = response.getOutputStream();
		//  JASPER      ,            
		InputStream is = getServletConfig().getServletContext().getResourceAsStream("report\\JasperReportSQL.jasper");
		//  Map     
		HashMap hm =  new HashMap();
		hm.put("hp", new Integer(3));
		try {
			//  JDBC
			Class.forName("com.mysql.jdbc.Driver");
			connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/jasperreportdb","root", "root");
			//     PDF   ,  JasperRunManager          ,     
			JasperRunManager.runReportToPdfStream(is,servletOutputStream,hm, connection);
			//    
			response.setContentType("application/pdf");
			servletOutputStream.flush();
			servletOutputStream.close();
			connection.close();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (JRException e) {
			e.printStackTrace();
		}		
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		this.doGet(request, response);
	}

}
第二の方法
1.この方法はJRXMLファイルにSQLは書かれていません。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE jasperReport PUBLIC "//JasperReports//DTD Report Design//EN"
"http://jasperreports.sourceforge.net/dtds/jasperreport.dtd">
<jasperReport name="DBReport">
	<field name="id" class="java.lang.Integer"></field>
	<field name="name" class="java.lang.String"></field>
	<field name="marks" class="java.lang.Integer"></field>
	
	<pageHeader>
		<band height="30">
			<staticText>
				<reportElement x="0" y="0" width="69" height="24" />
				<text><![CDATA[id:]]></text>
			</staticText>
			
			<staticText>
				<reportElement x="140" y="0" width="79" height="24" />
				<text><![CDATA[name:]]></text>
			</staticText>
			
			<staticText>
				<reportElement x="280" y="0" width="69" height="24" />
				<text><![CDATA[marks:]]></text>
			</staticText>	
			
			<staticText>
				<reportElement x="420" y="0" width="69" height="24" />
				<text><![CDATA[you don't see this]]></text>
			</staticText>		
		</band>
	</pageHeader>
	
	<detail>
		<band height="30">
			<textField>
				<reportElement x="0" y="0" width="69" height="24" />
				<textFieldExpression class="java.lang.Integer">
					<![CDATA[$F{id}]]>
				</textFieldExpression>
			</textField>
			<textField>
				<reportElement x="140" y="0" width="69" height="24" />
				<textFieldExpression class="java.lang.String">
					<![CDATA[$F{name}]]>
				</textFieldExpression>
			</textField>
			<textField>
				<reportElement x="280" y="0" width="69" height="24" />
				<textFieldExpression class="java.lang.Integer">
					<![CDATA[$F{marks}]]>
				</textFieldExpression>
			</textField>	
			<staticText>
				<reportElement x="420" y="0" width="69" height="24" />
				<text><![CDATA[If you don't see this, it didn't work]]></text>
			</staticText>
		</band>
	</detail>
</jasperReport>
2.同じく以下の方法でJASPERファイルを生成します。

	    	JasperCompileManager.compileReportToFile("WebRoot\\report\\JasperReportSQLResult.xml","WebRoot\\report\\JasperReportSQLResult.jasper");

3.Servletを書き出す


import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.HashMap;

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.JRResultSetDataSource;
import net.sf.jasperreports.engine.JasperRunManager;

public class DynamicCreateReportWithServletDateSource extends HttpServlet {

	private static final long serialVersionUID = 1L;

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		Connection connection = null;
		Statement statument = null;
		ResultSet resultSet = null;
		String sql = "select tb.name as name,tb.age as age,tbs.marks as marks from jaspertb tb join jaspertbs tbs";
		ServletOutputStream servletOutputStream = response.getOutputStream();
		InputStream is = getServletConfig().getServletContext().getResourceAsStream("report\\JasperReportSQLResult.jasper");
		try {
			Class.forName("com.mysql.jdbc.Driver");
			connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/jasperreportdb","root", "root");
			statument = connection.createStatement();
			resultSet = statument.executeQuery(sql);
			//   ResultSet   JRResultSetDataSource     
			JasperRunManager.runReportToPdfStream(is,servletOutputStream,new HashMap(), new JRResultSetDataSource(resultSet));
			response.setContentType("application/pdf");
			servletOutputStream.flush();
			servletOutputStream.close();
			connection.close();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (JRException e) {
			e.printStackTrace();
		}
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		this.doGet(request, response);
	}

}

注意:JRXMLファイルのデータベースのフィールドは全部$F{marks}で、parameterは$P{xxxx}で表されています。
そして、parameterの値は全部過去のあのHashMapに設定されています。