重点内容第九天 图形报表~让微软都羡慕的报表
jFreeChart 纯java API,利用生成一张图片。
excel 图形报表,poi不能直接操作图形报表控件。变相解决,先做一个excel模板,插入好图表控件,然后利用poi动态设置它的数据。用户
打开excel,图表直接展现。
第三方的报表软件,可视化开发。开发效率极高。
可视化布局界面,配置数据源即可。(SQL的结果集)。收费。数巨报表(10w,每年服务费1w)。做一个应用程序,(C/S程序),IE上安装插件。兼容性。
amCharts FLASH,只需要构建数据xml。
1)需要swf控件,例如饼形通用
2)setting.xml 不通用的
3)data.xml、data.txt,xml格式更加直观,不通用的
sqlDao查询结果集的封装,通用
工作原理
amCharts只需要一次配置,公用flash,改造index.html,访问公用的swfobject.js和公用的flash swf原来文件。样式文件访问本地的,这样可以方便修改配置颜色,坐标,显示样式等。数据data.xml文件。将从数据库中读取的数据拼接成xml节点,写入到这个文本的文件中。转向jStat.jsp统一转向对应的forward参数目录下的index.html。(注意:html浏览器默认都有缓存,在做index.html要去掉缓存)
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="Cache-Control" content="no-cache, must-revalidate">
<meta http-equiv="expires" content="Wed, 26 Feb 1997 08:21:57 GMT">
jFreeChart 纯java api,缺点:图形非常粗糙,它实际是利用jFreeChart api生成的图片,表现力差,专门的api需要记忆。
需求:
生产厂家销售情况,厂家+销售
SELECT
f.factory_name,cp.sumnum
FROM
(SELECT factory_id,factory_name FROM factory_c WHERE state=1) f
LEFT JOIN
(
SELECT factory_id,SUM(cnumber) AS sumnum FROM contract_product_c
GROUP BY factory_id
) cp
ON f.factory_id=cp.factory_id
WHERE cp.sumnum IS NOT null
需求:
产品销售情况,畅销的产品的前10名,产品+销售
SELECT product_no,SUM(cnumber) AS sumnum FROM contract_product_c
GROUP BY product_no ORDER BY sumnum DESC
LIMIT 10
需求:系统访问压力图
记录用户登陆系统,就记录一条
统计每天登陆系统的次数
SELECT SUBSTRING(login_time,1,10),COUNT(login_time) FROM login_log_p
GROUP BY SUBSTRING(login_time,1,10)
统计24小时系统访问的次数
当数据不够时,利用临时表凑数据
SELECT
t.a1,IFNULL(p.countnum,0) AS countnum
FROM
(SELECT a1 FROM online_t) t
LEFT JOIN
(
SELECT SUBSTRING(login_time,12,2) AS a1,COUNT(login_time) AS countnum FROM login_log_p
GROUP BY SUBSTRING(login_time,12,2)
) p
ON t.a1=p.a1
总结:
图形报表业界已经相当成熟,提出公用,称作报表引擎。
需求
系统瓶颈是指,访问最长时间,写数据操作,写磁盘文件操作。都比较耗时,用户体验不好。
1)找出系统这些操作慢的地方,
2)分析原因
3)优化,用户使用频繁模块,对其优化
实现一个性能监控的程序
记录开始时间,记录结束时间,结束时间-开始时间=耗时
写到日志文件中,写到数据库中
配置springmvc拦截器,记录开始时间,结束时间,打日志。
1)写一个拦截器,实现一个接口HandlerInterceptor
2)实现共用的变量,安全性
3)配置springmvc拦截器配置,springmvc-servlet.xml
package cn.itcast.jk.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.core.NamedThreadLocal;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import common.Logger;
//功能:实现对所有类方法执行时间的监控
public class TimeInterceptor implements HandlerInterceptor {
//引入log4j日志
private static Logger log = Logger.getLogger(TimeInterceptor.class);
//利用ThreadLocal绑定一个变量,完成线程安全
NamedThreadLocal startTimeThreadLocal = new NamedThreadLocal("startTimeThreadLocal");
//处理类之前,执行preHandle方法
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
long startTime = System.currentTimeMillis(); //记录当前时间
startTimeThreadLocal.set(startTime); //绑定变量
return true;
}
//处理类之后,执行postHandler方法
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
long stopTime = System.currentTimeMillis(); //记录结束时间
log.info(String.format("%s execute %d ms."
,request.getRequestURI()
, stopTime - startTimeThreadLocal.get()));
}
//所有的动作完成,执行一些方法
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception {
// TODO Auto-generated method stub
}
}
sprimgmvc-servlet.xml中配置
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="cn.itcast.jk.interceptor.TimeInterceptor"/>
mvc:interceptor>
mvc:interceptors>
log4j.rootLogger=DEBUG, stdout
配置日志级别 OFF,FANIL,ERROR,WARN,INFO,DEBUG,TRACE,ALL 提供8个级别,log4j推荐开发者使用4个级别:
ERROR:错误信息,try,catch抛出异常,log.error(“”)
WARN:警告信息
INFO:提示
DEBUG:BUG很多时候,监控过程变量,调试
顺序级别,级别由低到高,高级别的信息会包含打印低级别的信息。
Stout输出地点,包括:控制台,文件,数据库
log4j.rootLogger=DEBUG, stdout
#Console
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%-5p - %m%n
#LogFile
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=../logs/jklog.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
log4j.logger.org.apache=INFO
log4j.logger.cn.itcast.jk=DEBUG
public class TimeInterceptor implements HandlerInterceptor {
//引入log4j日志
private static Logger log = Logger.getLogger(TimeInterceptor.class);
类中类似System.out.println()
log.info(String.format("%s execute %d ms."
,request.getRequestURI()
, stopTime - startTimeThreadLocal.get()));
直接读取文件内容,形成SQL语句,批量插入数据库。
导入时,excel文档它单元格有类型。
1)类型,根据不同的类型拼接不同的sql
2)模板,自己定义一个模板,让用户将数据导入。模板要设置将所有的单元格设置为文本类型,导入的数据就都是文本。
3)没有通用性,要根据具体业务做一个这样类。
4)插入SQL语句。
软件的核心价值:
举例:了解杰信有哪些现有的产品畅销,VIP客户,什么产品滞销。指导企业经营。
为企业经营决策提供数据支持。
在基础数据中挖掘有价值的信息。再次提炼。~ 数据挖掘。
1)第三方报表,用户展现效果最好,功能齐全,开发效果。收费
2)jFreeChart 古老,api繁杂,开发效率不高,生成图片
3)jReport 复杂
4)excel (企业中常采用)
5)javascript amCharts (收费)
6)amCharts Flash
1)SQL的数据源
2)动态生成data.xml
1)饼形图
2)柱状图
3)曲线图