SSH项目--国税(九)

13.7年度投诉数统计

需求:根据年度将相应年度的每个月的投诉数进行统计,并以图表的形式展示在页面中;在页面中可以选择查看当前年度及其前4年的投诉数。在页面中可以选择不同的年度,然后页面展示该年度的曲线统计图

内容:① 统计年度的每个月的投诉数;(未到月份不应该显示投诉数,已过的月份如果没有投诉数应该显示为0)
      ②页面中可选择近5年的年份;并且根据选择的年份显示投诉统计图表


-----------------------------------------------------------------前端
1、年份选择(最近5年)

2、一进入页面中需要加载当前年度的投诉统计数

[
{
    "label": "1 月",
    "value": "42"
},
{
    "label": "2 月",
    "value": "81"
}
]


-----------------------------------------------------------------后端

目标: 统计年度的每个月的投诉数
Action:
1、获取年份
2、统计年度的每个月的投诉数并输出json格式字符串

2.1、根据年份统计该年份各个月的投诉数

统计语句:

统计相应年度各个月的投诉数sql:

select 月份,投诉数
from 投诉
where 年度=传入值
group by 月份

------------------实际月份的投诉数统计结果
select month(comp_time) as '月份',count(*) '总数'
from complain
where year(comp_time)=?
group by month(comp_time)


select imonth, count(comp_id)
from tmonth left join complain onimonth=month(comp_time)
and year(comp_time)=?
group by imonth
order by imonth;

----------------------------------------------
select imonth,c2
from tmonth left join (select month(comp_time) c1,count(comp_id) c2 from complain where year(comp_time)=? group bymonth(comp_time)) t
on imonth = c1
order by imonth;

返回json格式字符串:①当年份是非当前年份的话:则每月对应的投诉数如果出现空值则应设置为0;②当前年份的话:则每月中如果是月份大于当前月份投诉数出现空值则为空值或0时也设为空

13.7.1FusionCharts
FusionCharts 是使用javascript实现统计图表的js组件;其官网地址:http://www.fusioncharts.com。其早期版本FusionChartsFree 是基于flash来实现,而在2014年其脱离开flash完全使用js来实现统计图表的FusionCharts SuiteXT来替代FusionCharts Free使其具有充分跨浏览器和终端的特点。到官网下载FusionCharts:

SSH项目--国税(九)

SSH项目--国税(九)


下载完后,解压压缩包“fusioncharts-suite-xt.zip”;目录如下:

SSH项目--国税(九)


双击打开index.html页面;查看如何使用fusioncharts


SSH项目--国税(九)



查看 Setup ,了解如何安装:

SSH项目--国税(九)



安装说明写到;如果只需要统计图表,那么只要复制js文件夹中的“fusioncharts.js”和“fusioncharts.charts.js”即可。
接着;查看其demo,了解如何使用:

SSH项目--国税(九)


于此;要使用fusioncharts先将“fusioncharts.js”和“fusioncharts.charts.js”和相关主题文件复制到项目的js/fusioncharts文件夹。
接着;将annualStatisticChartUI.jsp引入项目中;在该jsp页面中实现统计并展示曲线图。当页面一进入来应该展示当年的投诉数统计图,并且可以选择年份。为了实现一进入和选择时都展示对应的统计图;应当每次触发时候重新到数据库查询统计数据并返回。

annualStatisticChartUI.jsp 页面内容:
<%@ page language="java" import="java.util.*"pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath =request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
Calendar cal = Calendar.getInstance();
int curYear = cal.get(Calendar.YEAR);//当前年份
request.setAttribute("curYear", curYear);
List yearList = new ArrayList();
//设置页面上的年份下拉框,近5年的年份
for(int i = 0; i < 5; i++){
yearList.add(i, curYear--);
}
request.setAttribute("yearList", yearList);
%>

<!DOCTYPE HTML>
<html>
  <head>
    <%@includefile="/common/header.jsp"%>
   <title>年度投诉统计图</title>
  </head>
  <script type="text/javascript"src="${basePath }js/fusioncharts/fusioncharts.js"></script>
  <script type="text/javascript"src="${basePath}js/fusioncharts/themes/fusioncharts.theme.fint.js"></script>
  <script type="text/javascript">
  
  //一进入页面后执行,dom加载完后执行
 $(document).ready(doAnnualStatistic());
 
  //根据年份统计投诉数
  function doAnnualStatistic(){
 //1、获取年份
 var year = $("#yearoption:selected").val();
 if(year == "" || year == undefined){
 year = "${curYear}";
 }
 //2、统计年度投诉数据并展示图表
 $.ajax({
 url:"${basePath}nsfw/complain_getAnnualStatisticData.action",
 data:{"year":year},
 type:"post",
 dataType:"json",
 success: function(data){
 if(data != undefined && data !=""){
 //根据统计结果展示图表
var fc = new FusionCharts({
      "type": "line",
      "renderAt": "chartContainer",
      "width": "600",
      "height": "400",
      "dataFormat": "json",
      "dataSource":  {
        "chart": {
          "caption":year + " 年度投诉数统计图",
         "xAxisName": "月  份",
         "yAxisName": "投  诉 数",
          "theme":"fint"
       },
       "data": data.chartData
    }

 });
 fc.render();
 } else {alert("统计投诉数失败!");}
 },
 error: function(){alert("统计投诉数失败!");}
 });
  }
  </script>
  <body>
  <br>
  <divstyle="text-align:center;width:100%;">
    <s:select id="year"list="#request.yearList" οnchange="doAnnualStatistic()"cssStyle="margin-left:200px;"></s:select>
    </div>
    <br>
    <div id="chartContainer"style="text-align:center;width:100%;"></div>
  </body>
</html>




13.7.2投诉数统计
在调用fusioncharts的js中,统计图表需要接受一定格式的json数据(在demo中有固定json格式);那么现在需要将不同年度的投诉数据统计出来。

【分析】①json数据中需要有一年中12个月份和对应的投诉数,所以在查询投诉数需要根据年份查询,并且需要统计本年度的12个月的投诉数;②当统计的是非本年度的数据时,因为这是已经过去的时间,所以当某个月没有投诉时,图表中应该显示为0;当统计的是当前年度的数据时,还未到的月份不可能有投诉数据,应该显示为空或者不显示。

【解决】① 新建月份表tmonth,将月份表和投诉表联合查询;查询统计的sql语句:
select imonth,count(comp_id) from tmonth left join complain onmonth(comp_time)=imonth and year(comp_time)=? group by imonth orderby imonth; 
② 在业务层中的查询方法中对返回结果进行判断,并组装json数据

ComplainAction中对应处理方法:
//根据年度获取该年度下的统计数
public String getAnnualStatisticData(){
//1、获取年份
HttpServletRequest request =ServletActionContext.getRequest();
int year = 0;
if(request.getParameter("year") != null){
year = Integer.valueOf(request.getParameter("year"));
} else {
//默认 当前年份
year = Calendar.getInstance().get(Calendar.YEAR);
}
//2、获取统计年度的每个月的投诉数
statisticMap = new HashMap《String, Object》();
statisticMap.put("msg", "success");
statisticMap.put("chartData",complainService.getAnnualStatisticDataByYear(year));
return "annualStatisticData";
}



ComplainServiceImpl中对应的处理方法:
@Override
public List<Map> getAnnualStatisticDataByYear(int year){
List<Map> resList = new ArrayList<Map>();
//1、获取统计数据
List<Object[]> list =complainDao.getAnnualStatisticDataByYear(year);
if(list != null && list.size()>0){
Calendar cal = Calendar.getInstance();
//是否当前年份
boolean isCurYear = (cal.get(Calendar.YEAR) == year);
int curMonth = cal.get(Calendar.MONTH)+1;//当前月份
//2、格式化统计结果
int temMonth = 0;
Map<String, Object> map = null;
for(Object[] obj: list){
temMonth = Integer.valueOf((obj[0])+"");
map = new HashMap<String, Object>();
map.put("label", temMonth+ " 月");
if(isCurYear){//当前年份
//当前年份:如果月份已过的则直接取投诉数并且值为空或null时则设为0;如果月份未过的则全部投诉数置空
if(temMonth > curMonth){//未到月份,则投诉数为空
map.put("value", "");
} else {//已过月份
map.put("value", obj[1]==null?"0":obj[1]);
}
} else {//非当前年份则直接取投诉数并且值为空或null时则设为0
map.put("value", obj[1]==null?"0":obj[1]);
}
resList.add(map);
}
}
return resList;
}



complain-struts.xml 配置:
<package name="complain-action" namespace="/nsfw"extends="base-default,json-default">
<action name="complain_*"class="cn.itcast.nsfw.complain.action.ComplainAction"method="{1}">
<resultname="{1}">/WEB-INF/jsp/nsfw/complain/{1}.jsp</result>
<result name="list" type="redirectAction">
<param name="actionName">complain_listUI</param>
<param name="complain.compTitle">${strTitle}</param>
<param name="complain.state">${strState}</param>
<param name="startTime">${startTime}</param>
<param name="endTime">${endTime}</param>
<param name="pageNo">${pageNo}</param>
<param name="encode">true</param>
</result>
<result type="json" name="annualStatisticData">
<param name="root">statisticMap</param>
</result>
</action>
</package>





14其它
14.1完善系统首页数据
1、信息发布列表:对cn.itcast.home.action.HomeAction中的execute()方法进行对信息的查询,并将查询的最新5条发布状态中的信息列表结果显示在页面中。点击信息标题可查看具体信息;HomeAction中实现infoViewUI方法跳转到查看页面。
2、我的投诉列表:在cn.itcast.home.action.HomeAction中的excute()方法中,查询当前用户投诉的投诉信息的前面6条数据;并在首页中显示出来。点击投诉标题可查看投诉信息;HomeAction中实现complainViewUI方法跳转到查看投诉页面。
14.2 处理懒加载异常
在查看投诉和受理信息时;由于一个投诉对应有多个回复信息,在映射文件中配置了lazy=”true”即支持懒加载。但在打开投诉信息页面时,会产生一个懒加载异常。这个异常是因为在操作主表投诉表时没实时去读取回复信息表的内容,但事务已经提交并且session关闭了,导致在页面中需要显示时无法再次使用session加载数据。解决这个问题可利用spring提供的一个过滤器避免该异常。
<filter>
<filter-name>openSessionInViewFilter</filter-name>
<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>openSessionInViewFilter</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>



警告: couldn't clear tomcat cache
java.lang.NoSuchFieldException: resourceEntries
方案一:
因为tomcat8没有属性resourceEntries,换成tomcat7就好了。但是从tomcat8==>tomcat7感觉在退步,果断拒绝此方法。
参考链接:http://blog.csdn.net/findbestoy/article/details/50756465
方案二:
升级struts版本,struts2.0.9==>struts2.3.20,完美解决问题,坚决采纳本方法!
struts2.3.20下载地址:http://download.csdn.net/detail/xyznad/9486393
参考链接:http://blog.csdn.net/bigtree_3721/article/details/50866958
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值