项目是B/S的,标示层使用的是Openlaszlo,客户要求在打印的时候不需要选择打印的纸张类型,报表显示就直接打印,所以我在客户做了一个小应用程序。
需要的jar有:msbase.jar;mssqlserver.jar;msutil.jar;jasperreports-2.0.5-applet.jar;
jasperreports-1.3.3.jar;jasperreports-2.0.5-javaflow.jar
需要使用Ireport设计模板,放在reports目录下,载入*.jasper文件
<%@ page contentType="text/html;charset=UTF-8"%>
<%@page import="java.util.Enumeration"%>
<%@page import="java.net.URLDecoder"%>
<%
String sql = request.getParameter("sql");
sql="select * from authors";
System.out.println("viewer.jsp =========:"+sql);
// System.out.println("viewer.jsp =========:"+new String(condition.getBytes("ISO8859_1"),"UTF-8"));
%>
<html>
<head>
</head>
<body>
<!--"CONVERTED_APPLET"-->
<!-- HTML CONVERTER -->
<object classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93"
codebase="http://java.sun.com/update/1.5.0/jinstall-1_5-windows-i586.cab#Version=5,0,0,5"
WIDTH="100%" HEIGHT="100%">
<PARAM NAME=CODE VALUE="ViewerApplet.class">
<param name="scriptable" value="false">
<PARAM NAME=CODEBASE VALUE="applet">
<PARAM NAME=ARCHIVE
VALUE="jasperreports-2.0.5-javaflow.jar,jasperreports-2.0.5-applet.jar,commons-collections-3.1.jar">
<param name="type" value="application/x-java-applet;version=1.5">
<PARAM NAME="sql" VALUE="<%=sql%>">
<comment>
<embed type="application/x-java-applet;version=1.5"
\
ARCHIVE="jasperreports-2.0.5-javaflow.jar,jasperreports-2.0.5-applet.jar,commons-collections-3.1.jar"
\
WIDTH="100%"
\
HEIGHT="100%"
\
CODE="ViewerApplet.class"
\
CODEBASE="applet"
\
ARCHIVE="jasperreports-2.0.5-javaflow.jar,jasperreports-2.0.5-applet.jar,commons-collections-3.1.jar"
\
scriptable="false"
\
sql="<%=sql%>"
\
scriptable=false
pluginspage="http://java.sun.com/products/plugin/index.html#download">
<noembed>
</XMP>
</noembed>
</embed>
</comment>
</object>
</body>
</html>
做一个ViewerApplet的类,继承JApplet
import java.awt.BorderLayout;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.net.URL;
import java.net.URLEncoder;
import javax.swing.JApplet;
import javax.swing.JOptionPane;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.util.JRLoader;
import net.sf.jasperreports.view.JRViewer;
public class ViewerApplet extends JApplet {
public ViewerApplet() {
initComponents();
}
private javax.swing.JPanel pnlMain;
public void init() {
try {
//获取viewer.jsp的sql参数
String sql = getParameter("sql");
//使用URLEncoder对sql语句进行encode
sql = URLEncoder.encode(sql, "UTF-8");
//提交到servlet,使用servlet访问服务器端数据
URL url = new URL(getCodeBase(), "../servlet/appletServlet?sql="
+ sql);
if (url != null) {
//获取服务器的传递过来的JasperPrint对象
JasperPrint jasperPrint = (JasperPrint) JRLoader
.loadObject(url);
//创建一个JRViewer
JRViewer viewer = new JRViewer(jasperPrint);
this.pnlMain.add(viewer, BorderLayout.CENTER);
}
} catch (Exception e) {
StringWriter swriter = new StringWriter();
PrintWriter pwriter = new PrintWriter(swriter);
e.printStackTrace(pwriter);
JOptionPane.showMessageDialog(this, swriter.toString());
}
}
private void initComponents() {// GEN-BEGIN:initComponents
pnlMain = new javax.swing.JPanel();
pnlMain.setLayout(new java.awt.BorderLayout());
getContentPane().add(pnlMain, java.awt.BorderLayout.CENTER);
}
}
创建一个AppletServlet类
package com.gddzmr.servlet;
import java.io.IOException;
import java.io.ObjectOutputStream;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.gddzmr.applet.ViewerService;
import net.sf.jasperreports.engine.JasperPrint;
public class AppletServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
try {
//获取一个sql参数
String sql = request.getParameter("sql");
ViewerService service = new ViewerService();
//获取JasperPrint对象
JasperPrint jasperPrint = service.getJasper(request
.getRealPath("/"), sql);
//将JasperPrint转化为ObjectOutputStream数据流输出
response.setContentType("application/octet-stream");
ServletOutputStream out = response.getOutputStream();
ObjectOutputStream os = new ObjectOutputStream(out);
os.writeObject(jasperPrint);
os.flush();
os.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
创建;AppletService类,用于获取JasperPrint对象
package com.gddzmr.applet;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.gddzmr.db.DBManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.data.JRMapCollectionDataSource;
public class ViewerService {
DBManager db = new DBManager();
public JasperPrint getJasper(String realpath, String sql) throws Exception {
db.openDB();
//查询结果集
ResultSet rs = db.executeQuery(sql);
db.closeSTDB();
//将ResultSet转化为一个List<HashMap>数组
List list = db.getMapList(rs);
Collection rows = list;
//获取一个JasperPrint对象
JasperPrint jasperPrint = setReportCollection(realpath
+ "\\reports\\inboundReport.jasper", rows);
return jasperPrint;
}
/**
* 获取JasperPrint对象
*
* @param url
* @param list
* @return
* @throws Exception
*/
public JasperPrint setReportCollection(String url, Collection list)
throws Exception {
Map parameters = new HashMap();
JRMapCollectionDataSource dataSource;
//将list数据集转换为JRMapCollectionDataSource
dataSource = new JRMapCollectionDataSource(list);
//使用JasperFillManager填充JasperPrint对象
JasperPrint jasperPrint = JasperFillManager.fillReport(url, parameters,
dataSource);
return jasperPrint;
}
}
最后创建一个DBManager获取数据
package com.gddzmr.db;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
public class DBManager {
private String driverName = "com.microsoft.jdbc.sqlserver.SQLServerDriver";
private String url = "jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=pubs";
private String user = "sa";
private String password = "";
private Connection cnn;
private Statement stat;
private PreparedStatement ps;
public DBManager() {
}
/**
* 新建一个数据库连接
*
*/
public void openDB() {
try {
// 加载数据连接驱动
Class.forName(driverName);
// 获取数据库连接
cnn = DriverManager.getConnection(url, user, password);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* Statement执行查询语句,返回查询的结果集
*
* @param sql
* @return
*/
public ResultSet executeQuery(String sql) {
try {
stat = cnn.createStatement();
return stat.executeQuery(sql);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
/**
* Statement执行update,insert,delete语句,返回影响的行数
*
* @param sql
* @return
*/
public int executeUpdate(String sql) {
try {
stat = cnn.createStatement();
return stat.executeUpdate(sql);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return 0;
}
/**
* Statement执行存储过程,返回ture/false
*
* @param sql
* @return
*/
public boolean executeProcedural(String sql) {
try {
stat = cnn.createStatement();
return stat.execute(sql);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return false;
}
/**
* prepareStatement执行查询语句,返回查询的结果集
*
* @param sql
* @param list
* @return
*/
public ResultSet executeQuery(String sql, List list) {
try {
ps = cnn.prepareStatement(sql);
if (list.size() != 0 && list != null) {
for (int i = 0; i < list.size(); i++) {
ps.setObject(i + 1, list.get(i));
}
}
return ps.executeQuery(sql);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
/**
* prepareStatement执行update,insert,delete语句,返回影响的行数
*
* @param sql
* @param list
* @return
*/
public int executeUpdate(String sql, List list) {
try {
ps = cnn.prepareStatement(sql);
if (list.size() != 0 && list != null) {
for (int i = 0; i < list.size(); i++) {
ps.setObject(i + 1, list.get(i));
}
}
return ps.executeUpdate(sql);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return 0;
}
/**
* prepareStatement执行存储过程,返回ture/false
*
* @param sql
* @param list
* @return
*/
public boolean executeProcedural(String sql, List list) {
try {
ps = cnn.prepareStatement(sql);
if (list.size() != 0 && list != null) {
for (int i = 0; i < list.size(); i++) {
ps.setObject(i + 1, list.get(i));
}
}
return ps.execute(sql);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return false;
}
/**
* 关闭数据库连接,释放statment
*
*/
public void closeSTDB() {
try {
stat.close();
cnn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 关闭数据库连接,释放PreparedStatement
*
*/
public void closePSDB() {
try {
ps.close();
cnn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 将ResultSet结果集,转换为List<HashMap>,为创建jasperPrint做准备
* @param rs
* @return
*/
public List getMapList(ResultSet rs) {
ArrayList<HashMap> list = new ArrayList<HashMap>();
ArrayList<String> nameList = new ArrayList<String>();
try {
// 获取字段名的数组
ResultSetMetaData md = rs.getMetaData();
for (int i = 1; i <= md.getColumnCount(); i++) {
nameList.add(md.getColumnName(i));
}
// 根据字段名,获取rs中字段的值
if (rs != null) {
while (rs.next()) {
HashMap map = new HashMap();
for (int i = 0; i < nameList.size(); i++) {
map.put(nameList.get(i), rs.getObject(nameList.get(i)));
}
list.add(map);
}
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return list;
}
public static void main(String[] args) {
DBManager db = new DBManager();
db.openDB();
ResultSet rs = db.executeQuery("select * from authors");
ArrayList<HashMap> list = new ArrayList<HashMap>();
ArrayList<String> nameList = new ArrayList<String>();
try {
// 获取字段名数组
ResultSetMetaData md = rs.getMetaData();
for (int i = 1; i <= md.getColumnCount(); i++) {
nameList.add(md.getColumnName(i));
}
if (rs != null) {
while (rs.next()) {
HashMap map = new HashMap();
for (int i = 0; i < nameList.size(); i++) {
System.out.println(nameList.get(i) + "===="
+ rs.getObject(nameList.get(i)));
map.put(nameList.get(i), rs.getObject(nameList.get(i)));
}
list.add(map);
}
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
db.closeSTDB();
}
}