ireport+jasperreports报表开发总结一(Struts2)

开发环境:

ireport4.0.1+sqlserver2000+struts2

功能目标:

通过struts2将数据信息填充到ireport所设计的报表内,数据源方式:javabean

具体实现:

1、新建一个报表模板命名为:testReport.jrxml,根据向导点击“下一页”,选择数据源如下图所示:

这里有多种数据源,通常我们使用jdbc和javabean方式,由于jdbc连接,是直接在模板中写入查询语句,它的优点是,操作简单,但是在项目中一旦出现修改时非常麻烦的一件事情,而且比较死板,业务逻辑和表现层黏贴的比较紧,所以,这里我选择以javabean的方式连接进行连接,将查询的业务和报表分离开,以方便以后功能的维护和拓展。这里我新建一个javabean连接模式的数据源。

2、由于这只是单一的报表模板,数据源中还不存在字段,在之后的向导操作过程中直接点下一步,直至新建完成。

3、搭建struts2项目工程,这个不用多说大家都会(把我们工程中需要的jar包,全部引入,注意的是:你引入的jar包的版本最好和ireport的版本一致,负责可能会报异常),我在项目中引入的jar报版本为如下图所示:

4、在salserver中创建数据库和表如下图所示:

5、前期的基本工作完成以后现在开始真正进入神奇的报表之旅:

第一、创建一个类名为User的类,该类其实就是一个formbean,里面是我们的UserDemo表字段对应的set和get方法:

package com.ansure.moudle; public class User { private int u_id; private String u_name; private String u_pwd; private String u_email; public User() { } public User(int id, String name, String pwd, String email) { this.u_id = id; this.u_name = name; this.u_pwd = pwd; this.u_email = email; } public int getU_id() { return u_id; } public void setU_id(int uId) { u_id = uId; } public String getU_email() { return u_email; } public void setU_email(String email) { this.u_email = email; } public String getU_name() { return u_name; } public void setU_name(String uName) { u_name = uName; } public String getU_pwd() { return u_pwd; } public void setU_pwd(String uPwd) { u_pwd = uPwd; } }

第二、创建数据库连接类dbPool,这里随便写了一个:

package com.ansure.utill; /* 数据访问组件 */ import java.io.*; import java.util.*; import java.sql.*; /** * @作者 haizi * @创建日期 2011-04-12 * @版本 V 1.0 */ public class dbPool{ private static dbPool instance = null; public static synchronized Connection getConnection() { if (instance == null){ instance = new dbPool(); } return instance._getConnection(); } private dbPool(){ super(); } private Connection _getConnection(){ try{ String sDBDriver = "com.microsoft.jdbc.sqlserver.SQLServerDriver"; String sConnection = "jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=MyDatabase"; String sUser = "sa"; String sPassword = "sa"; Class.forName(sDBDriver).newInstance(); return DriverManager.getConnection(sConnection,sUser,sPassword); } catch(Exception se){ System.out.println(se); return null; } } //释放资源 public static void dbClose(Connection conn,PreparedStatement ps,ResultSet rs) throws SQLException { rs.close(); ps.close(); conn.close(); } public static void main(String arg[]){ new dbPool()._getConnection(); } }

第三:创建数据查询的业务类 UserDao,只作为参考:

package com.ansure.dao; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; import java.util.List; import com.ansure.moudle.User; import com.ansure.utill.dbPool; public class UserDao { public UserDao() { } Connection conn; Statement st; ResultSet rs; public List getAllStudent(){ String sql=""; String sqls="select sqltext from sqltext where id=1"; List userlist=new ArrayList(); try { conn=dbPool.getConnection(); st=conn.createStatement(); rs=st.executeQuery(sqls); while(rs.next()){ sql=rs.getString("sqltext").toString(); } rs=null; System.out.println(sql); rs=st.executeQuery(sql); while(rs.next()){ User user=new User( rs.getInt("u_id"), rs.getString("u_name"), rs.getString("u_Pwd"), rs.getString("u_email") ); userlist.add(user); } } catch (SQLException e) { try { conn.close(); } catch (SQLException e1) { e1.printStackTrace(); } e.printStackTrace(); return null; } return userlist; } }

第四:创建action具体方法如下,注意userList和map的get、set方法:

package com.ansure.action; import java.io.File; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.struts2.ServletActionContext; import net.sf.jasperreports.engine.export.JRHtmlExporter; import net.sf.jasperreports.engine.export.JRHtmlExporterParameter; import com.ansure.dao.UserDao; import com.ansure.moudle.User; import com.opensymphony.xwork2.ActionSupport; public class TestAction extends ActionSupport { private static final long serialVersionUID = 1L; private List<User> userList = new ArrayList<User> ();//本变量是作为查询结果集向报表传入 public Map<String,Object> map = new HashMap<String,Object>(); //map用于向前台报表传值赋给报表模板中的变量 protected String imageServletUrl = "//images//"; public String execute() { try { HttpServletRequest request = ServletActionContext.getRequest(); HttpServletResponse response = ServletActionContext.getResponse(); userList=new UserDao().getAllStudent(); map.put("pp", "123456"); } catch (Exception e) { e.printStackTrace(); return ERROR; } return SUCCESS; } public Map<String, Object> getMap() { return map; } public void setMap(Map<String, Object> map) { this.map = map; } public List<User> getUserList() { return userList; } public void setUserList(List<User> userList) { this.userList = userList; } }

6、书写完以上代码后,可以先进行小小的测试,防止因为代码的问题导致填充报表失败,下面的操作很关键,请注意:

第一、我们在1的时候只是给报表加了一个空的javabean连接源,这里我们要把连接源的内容加进去,具体做法:把User.java按照包的路径进行编译打包如本例中路径为:com.ansure.moudle.User。将打好的包随便放到你存放ireport模板所在目录文件夹下,然后