出来实习也将近两个月了,感觉自己在这两个月里也收获了许多新的知识与经验,当然,说这些就有点扯远了,所以还是回到我们的主题,谈技术。

小编再最近实战学习中发现一个问题,那就是现在许多博客里有许多关于各个细节知识点的说明讲解,但是综合各个知识点用实战讲解的博客就比较少了,当然,在一个方面做精做细是大势所趋,有利于人们有针对的查找需要的知识,快速解决问题,但对于许多小白来说,一个完整的实战教程对他们来说更加重要。所以小编把平时实战开发的一些精华写下来与大家分享,也有助于自己梳理知识。好了,废话不多说,进入主题。

小编最近在处理一个首页柱状图的开发,大概类似于这样


对于这个柱状图中的各个月份数值,是需要从后台获取。这里我们也就主要讲解这个数据的传递过程。

首先来写sql语句,这里我想要根据年份和月份来查询一个月中所处理的事件,但数据库中时间保存是年月日夹杂在一起的,于是问题就来了,怎么从一个字段里取出几个独立的数据来进行查询,其实比较简单,那就是嵌套查询,一个查询不行,两个不就好了吗。

"select count(*) from "+"(select t.id ,to_char(t.shijian,'MM')as month from test t where to_char(t.shijian,'MM')="+month
+"and to_char(t.shijian,'yyyy')="+year+")";
通过下面语句返回查询结果

Long monthCount = super.getCountSqlQeury(sql,null);
接着是controll层和前台

List<Long> monthlist = new ArrayList<>();
for(int i =1;i<=12;i++){
Long monthcount = queryCountService.GetMonthCount(String.valueOf(i));
monthlist.add(monthcount);
}
model.addAttribute("monthList",monthlist);

<c:forEach var="monthList" items="${monthList}" varStatus="id">
<div class="bar">
<div class="title">${id.index+1}月</div>
<div class="value tooltips" data-original-title="${monthList}"
data-toggle="tooltip" data-placement="top">${monthList}%</div>
</div>
</c:forEach>
controller层主要是把数据库查询出的每个月份处理数量一个一个塞进List集合里,然后在前台用Jstl的forEach遍历这个集合,在用EL表达式取出每个值。
Jstl的forEach类似于<%for(int i=0;i<12;i++) %>这种形式,但更简单,界面更简洁。里面具体属性含义如下,items里用于指定被循环遍历的对象,就是刚才controller里塞满数值的List集合,var里用于指定循环变量,存储一个个具体从List集合里取出的值,varStatus相当于for循环里的i。
以前编写jsp代码时,如果要获取表单中的用户名,一般使用 <%=request.getParameter("name")%>,这样当然也可以获取到值,但是又把html代码和Java代码混到一起,看起来比较乱套。现在使用EL表达式的话就比较简洁了:${param.name}就可以解决了
EL表达式取值从servlet四大作用(servletContext>session>request>pageContext)中有的值,这四个域都有setAttribute("",object)方法和getAttribute("")方法 el表达式 会自动从四大域中按作用范围从小到达寻找搜寻对应名字的值,其内部调用的就是pageContext的findAttribute("")方法;如果要想在页面通过el表达式得到值就必需先调用域的setAttribute方法把值设置进去,不需要什么配置,直接写el表达式就可以。
到这一步,基本以及把我要讲的通过El表达式数据传递的内容讲完了,但现实情况中我们还有可能碰到循环内传递两个不一样的数组,如下图,在每次遍历中,既要输出monthList,又要输出precent的情况,这种情况我们就要另辟蹊径了。

<c:forEach var="monthList" items="${monthList}" varStatus="id">
<div class="bar">
<div class="title">${id.index+1}月</div>
<div class="value tooltips" data-original-title="${monthList.monthcount} " data-toggle="tooltip"
data-placement="top">${monthList.precent}%</div>
</div>
</c:forEach>

我们可以将两个值先放到map里,在将map放到List里,这样就可以解决这个问题。

Long count = queryCountService.GetCount();
List<Map<String,Object>> monthlist = new ArrayList<Map<String,Object>>();
for(int i =1;i<=12;i++){
Map<String,Object> map = new HashMap<String,Object>();
Long monthcount = queryCountService.GetMonthCount(String.valueOf(i));
map.put("monthcount",monthcount);
Long precent = (monthcount*100)/count;
map.put("precent",precent);
monthlist.add(map);
}
model.addAttribute("monthList",monthlist);

最后结果如下



更多相关文章

  1. Java常量表达式相关的编译优化代码
  2. java中循环遍历删除List和Set集合中元素的方法
  3. java8中lambda表达式
  4. java 正则表达式查找某段字符串中所有小写字母开头的单词并统计
  5. Java正则表达式提取字符
  6. Java正则表达式
  7. [疯狂Java]NIO.2:walkFileTree、FileVisitor(遍历文件/目录)
  8. 如何使用正则表达式验证java中的URL ?(复制)

随机推荐

  1. mysql中 character set 和collation关系
  2. Simple MySQL-C ORM - 简化C语言访问MySQ
  3. 通用的增删改查方法(反射)附带MySQL数据库
  4. 与MySQL服务器进行大量睡眠连接的可能原
  5. Java BoneCP MySQL连接超时
  6. powerdesigner连接MySQL数据库时出现Non
  7. 修改表的列结构
  8. mySQL自动分表问题
  9. 存储在mysql.slow_log里的慢查询分析
  10. 2-STM32带你入坑系列(点亮一个灯--Keil)