Web开发实战学习(涉及EL表达式,JSTL,数据库)

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

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

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

Web开发实战学习(涉及EL表达式,JSTL,数据库)_第1张图片

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

首先来写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 monthlist = new ArrayList<>();
      for(int i =1;i<=12;i++){
            Long monthcount = queryCountService.GetMonthCount(String.valueOf(i));
            monthlist.add(monthcount);
        }
model.addAttribute("monthList",monthlist);


  
${id.index+1}月
${monthList}%
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的情况,这种情况我们就要另辟蹊径了。


 
${id.index+1}月
${monthList.precent}%

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

Long count = queryCountService.GetCount();
List> monthlist = new ArrayList>();
for(int i =1;i<=12;i++){
      Map map = new HashMap();
       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);

最后结果如下

Web开发实战学习(涉及EL表达式,JSTL,数据库)_第2张图片


你可能感兴趣的:(web开发)