JasperReport+サーブレットWebアプリケーション:印刷


JasperReportのプロフィールについてはgoogleで調べることができますが、ここでは紹介しません.
 
私の開発環境:MyEclipse 5.5 GA+iReport-nb-3.5.2.使用するJasperReportバージョンもjasperreports-3.5.2
必要なjarは以下のlib 1,lib 2から得ることができ、すべてのjarパケットはiTextAsianを除く.JAr以外はjasperreports-3.5.2から見つけることができます!
 
JasperReportはiReportと一緒に使用して開発するのが便利ですが、中国語の表示の問題に注意し、テンプレートを設計する際には以下の3点に注意してください.
Font name:宋体(中国語フォント)PDF font name:STSong-LightPDF Encoding:UniGB-UCS 2-H(Chinese Siplified)PDF Embed:√
アプリケーションにiTextAsianを追加します.jar
 
ステップ1:iReportでJasperReportテンプレートを設計し、コンパイルします.結果は2つのファイルがあります:preson.jrxml(テンプレートファイル)、preson.JAsper(コンパイルファイル).WebRootの下に新しいフォルダjasperを作成し、この2つのファイルをフォルダに配置します.
 
ステップ2:エンティティBeanを構築する
public class Person {
	private String person_Id;

	private String person_name;

	private String person_age;

	private String person_address;

	public Person() {

	}
	public Person(String id, String name, String age, String address) {
		this.person_Id = id;
		this.person_name = name;
		this.person_age = age;
		this.person_address = address;
	}
	//get,set      
}

   
ステップ3:サービスの構築
 
public class PersonService {
	public List<Person> getAllPerson() {
		List<Person> perList = new ArrayList<Person>();
		perList.add(new Person("101", "  ", "22", "  "));
		perList.add(new Person("102", "  ", "21", "  "));
		perList.add(new Person("103", "  ", "23", "  "));
		perList.add(new Person("104", "  ", "22", "  "));
		return perList;
	}
} 

 
ステップ4:JRDataSourceの構築
package com.mengya.JRDataSource;

import java.util.List;
import com.mengya.bean.Person;
import com.mengya.service.PersonService;
import net.sf.jasperreports.engine.JRDataSource;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRField;

/**
 *   JaserperReort  
 * 
 * @author    
 * 
 */
public class PersonDataSource implements JRDataSource {
	private int index = -1;

	private List<Person> personList = new PersonService().getAllPerson();

	public Object getFieldValue(JRField field) throws JRException {
		Object value = null;
		String fieldName = field.getName();
		if ("person_Id".equals(fieldName)) {
			value = personList.get(index).getPerson_Id();
		} else if ("person_name".equals(fieldName)) {
			value = personList.get(index).getPerson_name();
		} else if ("person_age".equals(fieldName)) {
			value = personList.get(index).getPerson_age();
		} else if ("person_address".equals(fieldName)) {
			value = personList.get(index).getPerson_address();
		}
		return value;
	}
	public boolean next() throws JRException {
		index++;
		return index < personList.size();
	}
}

  
ステップ5:サーブレットの構築
public class JRPrintServlet extends HttpServlet {

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

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		ServletContext context = this.getServletConfig().getServletContext();
		File reportFile = new File(context.getRealPath("/jasper/preson.jasper"));
		Map<String, String> parameters = new HashMap<String, String>();
		parameters.put("year", "2009");
		parameters.put("unit_mc", "  XX      ");
		JasperPrint jasperPrint = null;
		try {
			JasperReport jasperReport = (JasperReport) JRLoader.loadObject(reportFile.getPath());
			jasperPrint = JasperFillManager.fillReport(jasperReport,parameters, new PersonDataSource());
		} catch (JRException e) {
			e.printStackTrace();
		}
		if (jasperPrint != null) {
			response.setContentType("application/octet-stream");
			ServletOutputStream ouputStream = response.getOutputStream();
			ObjectOutputStream oos = new ObjectOutputStream(ouputStream);
			oos.writeObject(jasperPrint);
			oos.flush();
			oos.close();
			ouputStream.flush();
			ouputStream.close();
		}
	}

}

  
web.xmlで構成されているservletは次のとおりです.
<servlet>
		<servlet-name>JRPrintServlet</servlet-name>
		<servlet-class>com.mengya.servlet.JRPrintServlet</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>JRPrintServlet</servlet-name>
		<url-pattern>/JRPrintServlet</url-pattern>
	</servlet-mapping>

   
ステップ6:Web印刷はapplet形式に基づいているため、印刷するappletを作成する必要があります.
import java.io.PrintWriter;
import java.io.StringWriter;
import java.net.URL;

import javax.swing.JOptionPane;

import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperPrintManager;
import net.sf.jasperreports.engine.util.JRLoader;

public class JRPrinterApplet extends javax.swing.JApplet {
	private URL url = null;
	public void init() {
		String strUrl = getParameter("REPORT_URL");
		if (strUrl != null) {
			try {
				url = new URL(getCodeBase(), strUrl);//    html       URL
				// System.out.println("url=" + url.toURI());//  servlet   
			} catch (Exception e) {
				StringWriter swriter = new StringWriter();
				PrintWriter pwriter = new PrintWriter(swriter);
				e.printStackTrace(pwriter);
				JOptionPane.showMessageDialog(this, swriter.toString());
			}
		} else {
			JOptionPane.showMessageDialog(this, "Source URL not specified");
		}
	}
	
	public void start() {
		if (url != null) {
			try {
				Object obj = JRLoader.loadObject(url);//       ,  JasperPrint  
				JasperPrintManager.printReport((JasperPrint) obj, true);//           JasperPrint  
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
}

 
 
ヒント:WebRootの下に新しいappletフォルダが必要です.jasperreports-3.5.2-applet.jar,commons-logging-1.0.2.jar,commons-collections-2.1.JAr 3つのパッケージを追加し、上のJRPrinterAppletでコンパイルしたファイルも入れます.
(appletはパッケージ名を付けないほうがいいです.パッケージ名を付けてパッケージ名のようなフォルダパスを作成し、appletをコンパイルしたファイルを入れてappletと同じディレクトリに置くと、古い新聞がこのクラスを見つけます)
 public final void setStub(AppletStub stub) // Applet stub.stub Java C , 。 public boolean isActive();// Applet public URL getDocumentBase();// Applet public URL getCodeBase();// Applet URL public String getParameter(String name)// Applet name public AppletContext getAppletContext()// public void resize(int width,int height)// Applet public void resize(Dimension d)// Applet public void showStatus(String msg)// public Image getImage(URL url) // url public Image getImage(URL url,String name)// url public AudioClip getAudioClip(URL url)// url public AudioClip getAudioClip(URL url, String name)// url public String getAppletInfo()// Applet 、 ; public String[][] getParameterInfo() // Applet , : 、 。 public void play(URL url)// url public void destroy()// AppletAppletApplet * CODE
  CODE AppletWIDTH HEIGHT AppletAPPLET
  * CODEBASE
  CODEBASE Applet URLApplet URL, , www.sun.comHTML/AppletPath/NameHTML CODEBASE HTML URL
  * ALT
   Java WWW , 。 Java AppletAPPLET ALT
  * ALIGN
  ALIGN Applet HTMLHTMLLMG> ,ALIGN TOPMIDDLE BOTTOM
  * VSPACE HSPACE
  VSPACE HSPACE Applet , 。 Applet 5025
  * NAME
  NAME AppletAppletAppletNAMEApplet
  * PARAM
   。 AppletHTML Applet
   AppletAppletApplet HTML 。 , , Java AppletHTML
  PARAM HTML , :
PARAM Name="name" Value="Liter"
  Java Applet getParameter HTML

手順7:印刷ページを作成します.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
	<head>
		<title>    </title>
	</head>
	<script language="javascript"> 
	<!-- 
		function openApp() 
		{ 
			var url = "../JRPrintServlet"; 
			document.write('<APPLET ID="JrPrt" CODE = "JRPrinterApplet.class" CODEBASE = "applets" ARCHIVE = "jasperreports-3.5.2-applet.jar,commons-logging-1.0.2.jar,commons-collections-2.1.jar" WIDTH = "0" HEIGHT = "0">'); 
			document.write('<PARAM NAME = "type" VALUE="application/x-java-applet;version=1.2.2">'); 
			document.write('<PARAM NAME = "scriptable" VALUE="false">'); 
			document.write('<PARAM NAME = "REPORT_URL" VALUE ="'+url+'">'); 
			document.write('</APPLET>'); 
		}
		--> 
	</script>
	<body bgcolor="#FFFFFF">
		<input type="button" value="    " onclick="openApp();">
		<!--      js          -->
		<!-- 
		<APPLET CODE="JRPrinterApplet.class" CODEBASE = "applets"
			ARCHIVE = "jasperreports-3.5.2-applet.jar,commons-logging-1.0.2.jar,commons-collections-2.1.jar"
			WIDTH="300" HEIGHT="40">
			</XMP>
			<PARAM NAME=CODE VALUE="JRPrinterApplet.class">
			<PARAM NAME = ARCHIVE VALUE = "jasperreports-3.5.2-applet.jar,commons-logging-1.0.2.jar,commons-collections-2.1.jar" >
			<PARAM NAME="type" VALUE="application/x-java-applet;version=1.2.2">
			<PARAM NAME="scriptable" VALUE="false">
			<PARAM NAME="REPORT_URL" VALUE="../JRPrintServlet">
		</APPLET>
		 -->
	</body>
</html>

  
 
このページのURLはservletのパスでなければなりません.
 
実は上のすべてのものはjasperReprotが自分で持っているdemoから見つけることができます.
jasperreports-3.5.2-projectjasperreports-3.5.2demosampleswebappにwebアプリケーションの例があります.
 
印刷は機械にjre-1を押す必要があります.5_0_18-windows-i586-p.exe