最近离职了,也没去找工作,好堕落呀,闲来没事干,想总结下上个项目的一些东西,也好给自己一个不工作的交代。
上个项目是邮政的一个揽投项目,是我和我同学两个人做的,在这个项目中报表是一个难点,一开始想用jasper来做,因为涉及到的业务统计比较复杂,后来换成了birt,实践才发现birt确实功能强大。
有关birt的一些基本用法,这里就不啰嗦了,网上太多这样的资料了,这里谈下,birt怎么在spring里面集成。
birt有他单独的一套引擎,其强大的script支持促使其可以利用外部的数据缘,这也是集成spring的一个必要条件。
这里先看看报表要做成什么样子。
报表1:
日期 年票类 文书类 票务类 车辆类 小计
业务量 代收款总金额 业务量 代收款总金额 业务量 代收款总金额 业务量 代收款总金额 业务量 代收款总金额
2008-12-05 264 228302 255 215673.5 294 259918 813 703893.5
合计 264 228302 255 215673.5 294 259918 813 703893.5
报表2:
投递段名称 业务种类 业务量 代收款总金额
投递段010101
车辆类 44 64966
文书类 35 51348.5
年票类 34 49860
小计 113 166174.5
投递段010102
车辆类 4 5302
文书类 3 3470.5
年票类 2 2527
小计 9 11299.5
业务种类合计
年票类 36 52387
文书类 38 54819
车辆类 48 70268
总体合计 122 177474
报表3:
日期 投递段 当日业务总量 揽投成功情况 待处理
1天 2天 3天 4天 5天 6天 7天 8天 9天 10天 11天 12天 13天 14天 揽投中
2008-12-05 010101 113 24 9 79
2008-12-05 010102 9 9
揽投失败情况
日期 投递段
揽投失败3
2008-12-05 010101 1
010102
这里就不每个报表一一详述,以第一个报表做例子来详解:
看第一报表,是典型的交叉表,关于交叉表的设计,这里不啰嗦,
这个报表用的是script数据源,其中有四个参数,startDate(开始时间),endDate(结束时间),businessKind(业务种类),ranksId(投递队伍)。
1.在工程中建立一个BirtFactory单例工厂类,用于统一去获取外表的数据,
/**
* 提供给birt使用的Factory
*
* @author 3SeeFans
*/
public class BirtFactory {
private static final Logger logger = LoggerFactory.getLogger(BirtFactory.class);
private static BirtFactory instance;
private static ApplicationContext context = AppContext.CONTEXT;
private final StatisticsManager manager = (StatisticsManager) context.getBean("statisticsManager");
private BirtFactory() {
logger.debug("Init the instance of BirtFactory...");
}
public static BirtFactory getInstance() {
if (instance == null) {
if (context == null) {
logger.debug("Get application context from birt-context.xml");
context = new ClassPathXmlApplicationContext("birt-context.xml");
}
instance = new BirtFactory();
}
return instance;
}
public List<MacroAnalysisBean> getMacroAnalysisData(Date startDate, Date endDate, Long businessKindId, Long ranksId) {
return manager.getMacroAnalysisData(startDate, endDate, businessKindId, ranksId);
}
public List<DeliverCollectBean> getDeliverCollectData(Date startDate, Date endDate, Long businessKindId,
String depId) {
return manager.getDeliverCollectData(startDate, endDate, businessKindId, depId);
}
public List<DeliverAnalysisBean> getDeliverAnalysisData(Date startDate, Date endDate, String depId) {
return manager.getDeliverAnalysisData(startDate, endDate, depId);
}
public List<DeliverAnalysisFailBean> getDeliverAnalysisFailData(Date startDate, Date endDate, String depId) {
return manager.getDeliverAnalysisFailData(startDate, endDate, depId);
}
}
这里须注意点,StatisticsManager是负者业务相关的service类,配置在spring容器里,
这里birtFacotry通过两种方式得到ApplicationContext 。
第一种就是通过实现SerletContextListener得到servletContext,再通过
public static final ServletContext servletContext = AppContextLoader.getInstance().getServletContext();
public static final ApplicationContext CONTEXT = WebApplicationContextUtils
.getRequiredWebApplicationContext(servletContext);
得到ApplicationContext ;通过注入的方式得到StatisticsManager。
第二种就是birt从新启动一个容器完全独立,先增加birt-context.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jee="http://www.springframework.org/schema/jee"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:jaxws="http://cxf.apache.org/jaxws"
xsi:schemaLocation="http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd"
default-autowire="byName" default-lazy-init="true">
<context:property-placeholder location="classpath:init.properties" />
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource"
p:driverClassName="${jdbc.driverClassName}" p:url="${jdbc.url}"
p:username="${jdbc.username}" p:password="${jdbc.password}" />
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"
p:dataSource-ref="dataSource">
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">${hibernate.dialect}</prop>
<prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
</props>
</property>
</bean>
<!-- 保证POJO中标注@Required的属性被注入 -->
<bean
class="org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor" />
<bean id="statisticsManager" class="com.gzpost.lantou.service.StatisticsManager" />
</beans>
2.配置script数据源:
在script 中的open方法加
factory = new Packages.com.gzpost.lantou.proxy.BirtFactory.getInstance();
collectList=factory.getMacroAnalysisData(params["startDate"].value,params["endDate"].value,params["businessKindId"].value,params["ranksId"].value);
iterator = collectList.iterator();
fech方法中加
if(iterator.hasNext() == false ){
return false;
} else{
var collectBean = iterator.next();
row["kindName"]=collectBean.getKindName();
row["acceptDate"] = collectBean.getAcceptDate();
row["totalCount"]=collectBean.getTotalCount();
row["totalPrice"]=collectBean.getTotalPrice();
return true;
}
colse方法中加
collectList = null;
iterator = null;
colectBean = null;
factory=null;
这样script数据原就配置好了,很简单吧。
3.报表显示:
在jsp页面加入相应的标签
<div id="content">
<c:choose>
<c:when test="${endDate!=null&&startDate!=null}">
<birt:viewer id="birtViewer"
reportDesign="reports/macroAnalysis.rptdesign" format="HTML"
showNavigationBar="false" width="800" height="480" left="0"
top="0" showParameterPage="false" showTitle="false">
<birt:param name="startDate" value="${startDate}" />
<birt:param name="endDate" value="${endDate}" />
<birt:param name="businessKindId" value="${businessKindId}" />
<birt:param name="ranksId" value="${ranksId}" />
</birt:viewer>
</c:when>
</c:choose>
</div>
执行相应的action就可以了。
补充:
关于第一种方式得到ApplicationContext
也就是你写个listener类实现ServletContextListener ,并实现contextInitialized方法,在里面加入AppContextLoader.getInstance().setServletContext(sc);
其中AppContextLoader代码为:
/**
* 用于存储ServletContext
* @
*
*/
public class AppContextLoader {
private static final Logger logger = LoggerFactory.getLogger(AppContextLoader.class);
private static AppContextLoader instance;
private ServletContext sc;
private AppContextLoader() {
logger.info("Init ServletContextLoader");
}
public static AppContextLoader getInstance() {
if (instance == null) {
instance = new AppContextLoader();
}
return instance;
}
public ServletContext getServletContext() {
return sc;
}
public void setServletContext(ServletContext sc) {
this.sc = sc;
}
}
其中context常量代码:
/**
* 系统context常量
*
*/
public abstract class AppContext {
public static final ServletContext servletContext = AppContextLoader.getInstance().getServletContext();
public static final String ROOTPATH = (String) servletContext.getAttribute("rootPath");
public static final String REALPATH = (String) servletContext.getAttribute("realPath");
public static final ApplicationContext CONTEXT = WebApplicationContextUtils
.getRequiredWebApplicationContext(servletContext);
}
你要得到spring上下文:ApplicationContext CONTEXT = WebApplicationContextUtils
.getRequiredWebApplicationContext(AppContextLoader.getInstance().getServletContext());
就行了
分享到:
相关推荐
Spring框架作为Java企业级开发领域中不可或缺的一部分,其内部集成了多种设计模式,不仅有助于提高系统的可维护性和扩展性,还能够帮助开发者更好地理解和应用这些设计模式。本文主要基于Spring 5源码分析(第2版)...
在FreeBird2011的源代码中,我们可以学习到如何组织大型项目的代码,如何通过良好的设计原则来提高代码的可读性和可维护性。这可能涉及到面向对象设计、设计模式、重构等概念。此外,项目中的注释和文档将帮助我们...
Spring 3.1是Spring框架的一个重要版本,它在企业级Java应用开发中扮演着核心角色。AOP(面向切面编程)是Spring框架的重要特性,允许开发者将关注点分离,比如日志、事务管理等,从核心业务逻辑中解耦出来。本...
该项目的核心是"bird-boot",它很可能是一个基于Spring Boot框架的应用程序,因为"boot"在Java开发中通常指的是Spring Boot,这是一个用于简化Spring应用初始搭建以及开发过程的框架。Spring Boot以其开箱即用、配置...
在现代软件工程中,自动化工具的使用是提升生产力的关键,而BigBird正是这样一把利器。 BigBird的核心功能在于通过配置文件自动生成数据访问对象(DAO)、业务代理(Business Delegate)以及Struts操作(或Spring...
在本示例中,我们探讨的是如何在Spring Boot框架中集成Redis缓存和MyBatis持久层技术,实现多对多关系的管理。这是一份适合初学者的教程,特别是那些刚接触这些技术的新手(new bird)。 首先,Spring Boot简化了...
8. **Hummingbird项目**:Hummingbird可能是该项目的名字,可能是一个集成上述技术的分布式系统框架,旨在简化分布式应用的开发和维护。 以上技术是构建高可用、可扩展分布式系统的基础,理解并掌握它们对于提升...
FEBS Cloud微服务权限系统 FEBS云是一款使用春云Hoxton.RELEASE,Spring云的OAuth2&春云阿里巴巴构建的低耦合权限管理系统,前端(FEBS云网络)采用VUE元管理构建.FEBS意指:F AST,E ASY使用, B eautiful和S afe...
在`bird-boot-master`这个项目中,我们可以期待看到以下内容: 1. **源码结构**:可能包含`src/main/java`下的`com.bird.boot`或其他包,其中组织了SpringBoot的主配置类、启动器、自定义配置等。 2. **主配置类**...
广告素材管理系统是一个关键的工具,它在数字营销领域中扮演着至关重要的角色。这个系统的主要目的是集中管理和优化广告投放过程中的各种创意元素,包括图片、视频、文本等,以提高广告效果并降低运营成本。"project...
在IT行业中,个人博客和日记类项目经常被用来记录学习过程、分享技术心得或生活感悟。"whitebird-s-Diary:随便写写"很可能是一个个人开发者或IT爱好者用来存储和展示其想法与技术探索的平台。虽然描述"喜欢的东西就...
SSM框架,即Spring、SpringMVC和MyBatis的集成框架,是JavaWeb开发中的常见选择,尤其适用于构建复杂的业务应用。这个压缩包文件"ssm_proj"提供了一个基本的SSM框架搭建实例,旨在帮助开发者快速启动一个新的JavaWeb...
在MeyboMail Web中,Spring可能被用来管理邮件服务的组件,提供事务管理,以及与数据库的交互。 四、Web应用服务器 MeyboMail Web需要部署在Web应用服务器上运行,如Tomcat、Jetty等。这些服务器负责解析HTTP请求,...
在这款游戏中,玩家需要控制一只小鸟在屏幕上不断飞翔,避开不断出现的管状障碍物,以获取更高的分数。达内的源码提供了一个学习和实践Java游戏开发的优秀案例,对于想要深入理解Java图形界面编程的开发者来说,这是...
在相册项目中,Spring可以管理各种组件,如数据库连接池、DAO(数据访问对象)和Service层对象,通过DI确保它们之间的协作。此外,Spring的AOP特性可以用于事务管理,确保在处理照片上传或删除时的数据一致性。 3. ...
MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索,可以和Spring框架无缝集成。 ###### 2.4.3 SpringMvc介绍 SpringMvc是Spring框架的一部分,用于构建Web应用程序的MVC架构。它简化了控制器类的...
用户可以通过配置SMTP服务器设置来发送邮件,通过POP3服务器设置来收取邮件,这在进行邮件系统集成或自动化测试时非常实用。 CMailServer的核心特性包括: 1. **用户管理**:该服务器允许创建和管理多个邮箱账号,...
在本案例中,我们关注的是 Gradle 版本6.1.1的全量版本压缩包"gradle-6.1.1-all.zip",它是官方发布的版本,确保了可靠性和稳定性。这个压缩包的下载可能对一些用户来说较为困难,因此分享这份资源可以节省用户的...
2. **MVC模式**:理解模型、视图、控制器之间的关系,以及如何在Struts框架中实现它们。 3. **Spring框架**:学习IoC(控制反转)和AOP(面向切面编程)的概念,以及Spring提供的Bean管理和事务管理。 4. **...
`java-websocket-1.3.0.jar` 是这个WebSocket库的实现文件,它是Java开发者用来集成WebSocket功能到他们的应用程序中的核心依赖。该库通常提供了以下功能: 1. **连接管理**:包括建立、维护和关闭WebSocket连接的...