`

JasperReport+Servlet Web应用之:打印

阅读更多

关于JasperReport的简介大家可以去google上去查,在这里就不作介绍了。

 

我的开发环境:MyEclipse 5.5 GA+iReport-nb-3.5.2。所用的JasperReport版本也是:jasperreports-3.5.2

所需要的jar可以从下面的lib1,lib2中获得,所有jar包除了iTextAsian.jar外都可以从jasperreports-3.5.2中找到!

 

JasperReport要和iReport一起使用开发起来才比较方便,要注意的是中文显示问题,设计模板的时候要注意以下三点:

Font   name:    宋体 (中文字体)
PDF    font name:   STSong-Light
PDF    Encoding:  UniGB-UCS2-H(Chinese Siplified)
PDF    Embeded: √

在应用程序中添加iTextAsian.jar

 

第一步:用iReport设计JasperReport模板并编译。结果有两个文件:preson.jrxml(模板文件),preson.jasper(编译文件)。在WebRoot下面新建文件夹jasper,将这两个文件放到该文件夹中。

 

第二步:构造我们的实体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方法就省掉了
}

   

 第三步:构造我们的service

 

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;
	}
} 

 

第四步:构造我们的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();
	}
}

  

第五步:构造我们的Servlet

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>

   

第六步:由于我们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三个包加进去,还要将上面的JRPrinterApplet编译后的文件放进去。

(applet最好不要加包名,如果加了包名要建一个如包名一样的文件夹路径再将applet编译后的文件放进去再把它放到与applet同一目录中去,否则老报找一到这个类)

 public final void setStub(AppletStub stub)
//设置Appletstub.stubJavaC之间转换参数并返回值的代码位,它是由系统自动设定的。
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()//撤消Applet及其所占用的资源。若该Applet是活动的,则先终止该Applet的运行。

* CODE标志
  CODE标志指定Applet的类名;WIDTHHEIGHT标志指定Applet窗口的像素尺寸。在APPLET语句里还可使用其他一些标志。
  * CODEBASE 标志
  CODEBASE标志指定AppletURL地址。Applet的通用资源定位地址URL,它可以是绝对地址 ,如www.sun.com。也可以是相对于当前HTML所在目录的相对地址,如/AppletPath/Name。如果HTML文件不指定CODEBASE 标志,浏览器将使用和HTML文件相同的URL
  * ALT 标志
  虽然JavaWWW上很受欢迎,但并非所有浏览器都对其提供支持。如果某浏览器无法运行Java Applet,那么它在遇到APPLET语句时将显示ALT标志指定的文本信息。
  * ALIGN 标志
  ALIGN标志可用来控制把Applet窗口显示在HTML文档窗口的什么位置。与HTMLLMG>语句一样,ALIGN标志指定的值可以是TOPMIDDLEBOTTOM
  * VSPACEHSPACE 标志
  VSPACEHSPACE标志指定浏览器显示在Applet窗口周围的水平和竖直空白条的尺寸,单位为像素。如下例使用该标志在Applet窗口之上和之下各留出50像素的空白,在其左和其右各留出25像素的空白:
  * NAME 标志
  NAME标志把指定的名字赋予Applet的当前实例。当浏览器同时运行两个或多个Applet时,各Applet可通过名字相互引用或交换信息。如果忽略NAME标志,Applet的名字将对应于其类名。
  * PARAM 标志
  通用性是程序设计所追求的目标之一。使用户或者程序员能很方便地使用同一个Applet完成不同的任务是通用性的具体表现。从HTML文件获取信息是提高Applet通用性的一条有效途径。
  假设编制了一个把某公司的名字在屏幕上卷动的Applet。为了使该Applet更加通用,则可以使该AppletHTML文件获取需要卷动的文本信息。这样,若想显示另一个公司的名字,用不着修改Java Applet本身,只需修改HTML文件即可。
  PARAM 标志可用来在HTML文件里指定参数,格式如下所示:
PARAM Name="name" Value="Liter"
  Java Applet可调用getParameter方法获取HTML文件里设置的参数值。

第七步:构造我们的打印页面:

<!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-project\jasperreports-3.5.2\demo\samples\webapp中有web应用的例子。

 

打印需要在机器上按装jre-1_5_0_18-windows-i586-p.exe

 

  • lib2.rar (5.7 MB)
  • 描述: 所需要jar包2
  • 下载次数: 625
  • lib1.rar (6.6 MB)
  • 描述: 所需要jar包1
  • 下载次数: 608
18
0
分享到:
评论
3 楼 ppengjin 2012-09-20  
您好,请问一下,我把你给的demo放在我的Web工程里,jar包都弄好了,程序没错误提示了,也可以用tomcat部署,就是去页面访问时,就出现了404的错误,报出请求不错在,这是怎么回事呢?
2 楼 jacksonokno 2012-02-26  

这个例子很好,感谢分享!
我在使用中,补充了个jar包才能使用,commons-logging-1.0.4.jar。
1 楼 li463968565 2012-01-06  
你好,你这个例子可以直接运行~?

相关推荐

    JasperReport+Servlet Web应用之:打印预览

    **JasperReport与Servlet在Web应用中的打印预览** JasperReport是一款强大的开源报表工具,它允许开发者在Java应用程序、Web应用甚至独立的Java应用程序中创建复杂的报告。Servlet是Java Web开发中的一个重要组件,...

    Jasperreport+ireport学习笔记(1).rar

    **JasperReport与iReport简介** JasperReport是一款开源的报告生成库,它...在实际项目中,合理地整合JasperReport到Web应用,不仅可以实现静态数据的展示,还可以实现动态数据的实时更新,为决策提供有力的数据支持。

    jasperreport 生成pdf实现下载与打印

    Servlet是Java Web应用中处理客户端请求的组件,它可以接收请求参数,生成响应内容,然后将其发送回客户端。 4. **显示于页面**:生成的PDF文件可以通过HTTP响应发送到浏览器,展示在页面上。这样用户可以直接在...

    jasperreport报表模板预览 applet与servlet通信

    Servlet是Java Web应用中的服务器端组件,用于接收HTTP请求并生成HTTP响应。在JasperReport的上下文中,Servlet的作用是处理客户端的请求,比如下载报表模板,填充数据,然后将生成的报表返回给Applet。Servlet可能...

    客户端打印pdf以及服务器打印(jasperreport)

    1. **接收请求**:在Web应用中,创建一个处理请求的Servlet或Controller,接收前端发送的参数,如报表ID、数据参数等。 2. **生成报表**:按照客户端打印的步骤,编译模板,填充数据并生成PDF。 3. **返回响应**:有...

    jasperreport从数据库中取数据

    5. **Web打印**:在Web环境下,我们通常需要将报告集成到Web应用中。这涉及到创建一个Servlet,如`MyJasperReportWebPrint`,该Servlet接收用户请求,处理报告生成和打印。用户可以通过HTTP请求参数传递数据库连接...

    JasperReport 与iReport 的配置与使用.pdf

    该工具特别适用于WEB应用程序和Java Application中的报表打印需求,最大的优势在于其开源和免费的特性。 ##### 1.2 iReport简介 iReport同样是sf.net的一个项目,它是一款免费的报表设计软件,主要用于以可视化的...

    jasperreport与ireport的配置与使用.pdf

    此工具非常适合用于WEB应用程序和Java Application的报表生成需求,尤其吸引人的是它的开源和免费特性。 ##### 1.2 iReport简介 iReport同样是sf.net的一个开源项目,它主要作为JasperReport的辅助工具,提供了一...

    JasperReport报表成型框架

    - **Web应用支持**: 可以与Servlet容器集成,用于Web应用中的报表服务。 5. **UPJasperReport** 这可能是项目中使用的特定库或工具,可能包含了JasperReport的扩展或定制功能。通常,这样的库会提供额外的辅助类...

    ireport与java 桌面应用,web应用

    标题中的“ireport与java 桌面应用,web应用”揭示了本次讨论的核心主题,即如何使用ireport工具在Java环境下开发桌面应用程序和Web应用程序的报表功能。ireport是JasperReports库的一个图形化设计工具,允许开发者...

    jasperreport ant运行以及启动hsqldb服务

    - `WebApp`: 集成到Web应用程序中,支持JSP、Servlet、Applet等技术。 #### 五、启动HSQLDB服务 1. **运行服务器**: - 在命令行中进入到`cmd/demo/hsqldb`目录。 - 执行`ant runServer`启动HSQLDB服务。 - 若...

    JasperReports iReport中文教程.pdf

    - **JasperReport**: 开源的报表打印组件,适合于Web应用程序与Java Application的报表打印需求,可在sf.net获取,截至文章撰写时,最新版本为0.5.2。 - **iReport**: 作为JasperReport的可视化报表设计工具,弥补了...

    Java Jsp 调用ireport动态模板打印

    Java JSP调用iReport动态模板打印是一种在Web应用程序中实现报表打印的常见技术。iReport是一款开源的报表设计工具,它可以与Java、JSP、Servlets等进行集成,为开发者提供灵活的报表生成和打印功能。在这个场景下,...

    JasperReport 与iReport 的配置与使用

    它广泛应用于 Web 应用程序和 Java 应用程序中作为报表打印组件,并且最重要的是它是完全免费的。 JasperReport 提供了一套完整的解决方案,包括数据获取、报告设计以及最终报表的渲染和输出。它可以支持多种输出...

Global site tag (gtag.js) - Google Analytics