精华内容
下载资源
问答
  • 如何数据库数据获取到前台页面

    万次阅读 2019-05-05 23:16:00
    最近在做有个简单电商平台,想做一个功能就是在搜索商品时候通过数据库查找,最后把数据直接显示在前台页面上。我自己在完成功能时候通过了俩种方式实现(基于SSM框架)完成,在此将我们想法和代码分享出来...

    最近在做有个简单的电商平台,想做一个功能就是在搜索商品的时候通过数据库查找,最后把数据直接显示在前台页面上。我自己在完成功能的时候通过了俩种方式实现(基于SSM框架)完成,在此将我们的想法和代码分享出来,供自己和他人参考。

     

    电影的数据库数据:

    ps:imagepath 存放的图片的地址

    一、通过EL表达式和简单点SSM框架知识

    1、首先,先从数据库中获取数据,并把数据返回给前台页面

            控制器代码

    	@RequestMapping("/selmovie")
    	public String  selAllMovie(HttpServletRequest req){
                    //获取所有的电影信息
    		List<Movie> lm = moiveServiceImpl.selAllMovie();
    		if(lm!=null){
    			for (Movie movie : lm) {
    				System.out.println(movie);
    			}
    		}
    		req.setAttribute("movie", lm);
    		return "movie.jsp";
    	}

     

    2、在前台中显示(通过EL表达式和JSTL标准标签库)

    <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
    <%
    String path = request.getContextPath();
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
    %>
    <%@ taglib  prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
    
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
        <base href="<%=basePath%>">
        
        <title>My JSP 'movie.jsp' starting page</title>
        
    	<meta http-equiv="pragma" content="no-cache">
    	<meta http-equiv="cache-control" content="no-cache">
    	<meta http-equiv="expires" content="0">    
    	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    	<meta http-equiv="description" content="This is my page">
    	<!--
    	<link rel="stylesheet" type="text/css" href="styles.css">
    	-->
    
      </head>
    	  <style>
    	    *{margin: 0;padding: 0}
    	    #movie{width: 690px; margin: 40px auto}
    	    #movie ul li{list-style-type: none;float: left;width: 150px; height: 270px;margin: 10px 10px; position: relative}
    	    #movie ul li a div{list-style-type: none;float: left;width: 120px;}
    	    #movie ul li a p{position: absolute;top:200px;width: 150px;height: 70px;padding: 5px;box-sizing: border-box;font-size: 15px;}
    	    #movie ul li a p .grade{ color: #ffba5a ;font-weight: bold}
    	
    	
    	</style> 
     <body>	
        <div id="movie">
            <ul>
                <!--jstl标准标签库的循环-->
                <!--El表达式可以获取到四大作用域中的信息-->
                <c:forEach items="${movie }" var="mm">
    	            <li>
    	                <a>
    	                    <div>
    	                    	<img src="${mm.imagepath }" width="150px" height="200px">
    	                    </div>
    	                    <p>
    	                        <span>${mm.name }</span>&nbsp;&nbsp;
    	                        <span class="grade"> ${mm.average }</span>
    	                    </p>
    	                </a>
    	            </li>  
                </c:forEach>
            </ul>
        </div>
    </body>
    </html>
    

    3、添加一个触发点;

    因为我的页面必须先访问控制器才能返回数据到movie.jsp页面。所有需要一个网页先去访问控制器

    <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
    <%
    String path = request.getContextPath();
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
    %>
    
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
        <base href="<%=basePath%>">
        
        <title>My JSP 'movie2.jsp' starting page</title>
        
    	<meta http-equiv="pragma" content="no-cache">
    	<meta http-equiv="cache-control" content="no-cache">
    	<meta http-equiv="expires" content="0">    
    	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    	<meta http-equiv="description" content="This is my page">
    	<!--
    	<link rel="stylesheet" type="text/css" href="styles.css">
    	-->
    
      </head>
      
      <body>
      	<!-- 触发点 -->
        <a href="selmovie">获取所有电源</a>
      </body>
    </html>
    

     

    返回结果:

     

     

    二、通过ajax异步请求获取后台数据

    1、在前端异步请求控制器并获取到电源数据

    <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
    <%
    String path = request.getContextPath();
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
    %>
    
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
        <base href="<%=basePath%>">
        
        <title>My JSP 'movieajax.jsp' starting page</title>
        
    	<meta http-equiv="pragma" content="no-cache">
    	<meta http-equiv="cache-control" content="no-cache">
    	<meta http-equiv="expires" content="0">    
    	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    	<meta http-equiv="description" content="This is my page">
    	<!--
    	<link rel="stylesheet" type="text/css" href="styles.css">
    	-->
    
    </head>
    <style>
        *{margin: 0;padding: 0}
        #movie{width: 690px; margin: 40px auto}
        #movie ul li{list-style-type: none;float: left;width: 150px; height: 270px;margin: 10px 10px; position: relative}
        #movie ul li a div{list-style-type: none;float: left;width: 120px;}
        #movie ul li a p{position: absolute;top:200px;width: 150px;height: 70px;padding: 5px;box-sizing: border-box;font-size: 15px;}
        #movie ul li a p .grade{ color: #ffba5a ;font-weight: bold}
    </style>
      <script type="text/javascript" src="js/jquery-1.12.3.min.js"></script>
      <script type="text/javascript">
                    //代码自动执行
      		$(function(){
      		  	var movies;
      		  	var movie ="";
      		  	/* 异步请求数据  */
      			$.ajax({
     		  	  type : "get",
     		 	  dataType : "json",
      		      url : "selmovie1",
      		      error : function(){
      		      		alert("请求失败");
      		      },
       		      success : function(movies) {
       		      	 //movie为json数据
       		      	 //通过$.each遍历json数据
       		      	 $.each(movies,function(key,obj){
       		      	 	  //拼接字符串
                  		  movie +="<li><a><div><img src='"+obj.imagepath+"' width='150px' height='200px'><p><span>'"+obj.name+"'</span>&nbsp;&nbsp;<span class='grade'>'"+obj.average+"'</span></p></div></a></li>";
    	   		  });
        	   	       }
    		     });
    		     //这块我本是想等到上面函数执行完在执行下面的代码,但是上面获取数据以及拼接字符串太耗费时间,总是优先执行下面的代码
    		     //所以暂时想出此方法来完成功能,往后在进行修改
    		     setTimeout(function() {	
    		     	 //将拼接好的字符串加入到html代码中去 
    		   	 $("#movie ul").html(movie);
    			},1000);
      		})
      </script>
      
      <body>
        <div id="movie">
             <ul>
             </ul>
        </div>
      </body>
    </html>
    

    2、在控制器中返回json格式的数据

    	@RequestMapping(value="/selmovie1",produces="application/json;charset=utf-8")
    	@ResponseBody
    	public List<Movie>  selAllMovie1(HttpServletRequest req){
    		List<Movie> lm = moiveServiceImpl.selAllMovie();
    		return lm;
    	}

     

    返回结果

     

     

    三、启发

    今天听到班里大牛在群里分析的类似的功能

    感觉也是可以从过滤器进行获取数据。

     

     

     

    展开全文
  • 如何从Zabbix数据库中获取监控数据

    千次阅读 2017-11-09 17:23:00
    做过Zabbix同学都知道,Zabbix通过专用Agent或者SNMP收集相关监控数据,然后存储到数据库里面实时在前台展示。Zabbix监控数据主要分为以下两类: 历史数据:history相关表,从history_uint表里面可以查询到...

       做过Zabbix的同学都知道,Zabbix通过专用的Agent或者SNMP收集相关的监控数据,然后存储到数据库里面实时在前台展示。Zabbix监控数据主要分为以下两类:

        历史数据:history相关表,从history_uint表里面可以查询到设备监控项目的最大,最小和平均值,即存储监控数据的原始数据。

        趋势数据:trends相关表,趋势数据是经过Zabbix计算的数据,数据是从history_uint里面汇总的,从trends_uint可以查看到监控数据每小时最大,最小和平均值,即存储监控数据的汇总数据。

        Zabbix可以通过两种方式获取历史数据:

    1.通过Zabbix前台获取历史数据

        通过Zabbix前台查看历史数据非常简单,可以通过Monitoring->Lastest data的方式查看。也可以点击右上角的As plain test按钮保存成文本文件。

    wKioL1QkDOCjpLoTAAOm77_P1z4367.jpg

    2.通过前台获取的数据进行处理和二次查询有很多限制,因此可以通过SQL语句直接从后台DB查询数据。    

        首先大家应该熟悉SQL语句Select 常用用法:

    1
    2
    3
    4
    5
    6
    7
    SELECT [ALL DISTINCT] Select_List [INTO [New_Table_name]
    FROM { Table_name | View_name} [ [,{table2_name | view2_name}
         [,...] ]
    WHERE Serch_conditions ]
    GROUP BY Group_by_list ]
    HAVING Serch_conditions ]
    ORDER BY Order_list [ASCDEsC] ]

        说明:

    1)SELECT子句指定要查询的特定表中的列,它可以是*,表达式,列表等。

    2)INTO子句指定要生成新的表。

    3)FROM子句指定要查询的表或者视图。

    4)WHERE子句用来限定查询的范围和条件。

    5)GROUP BY子句指定分组查询子句。

    6)HAVING子句用于指定分组子句的条件。

    7)ORDER BY可以根据一个或者多个列来排序查询结果,在该子句中,既可以使用列名,也可以使用相对列号,ASC表示升序,DESC表示降序。

    8)mysql聚合函数:sum(),count(),avg(),max(),avg()等都是聚合函数,当我们在用聚合函数的时候,一般都要用到GROUP BY 先进行分组,然后再进行聚合函数的运算。运算完后就要用到Having子句进行判断了,例如聚合函数的值是否大于某一个值等等。

    从Zabbix数据库中查询监控项目方法,这里已查询主机的网卡流量为例子:

    1)通过hosts表查找host的ID。

    1
    2
    3
    4
    5
    6
    7
    mysql> select host,hostid from hosts where host="WWW05";
    +-------+--------+
    | host  | hostid |
    +-------+--------+
    | WWW05 |  10534 |
    +-------+--------+
    1 row in set (0.00 sec)

    2)通过items表查找主的监控项和key以及itemid。

    1
    2
    3
    4
    5
    6
    7
    mysql> select itemid,name,key_ from items where hostid=10534 and key_="net.if.out[eth0]";
    +--------+-----------------+------------------+
    | itemid | name            | key_             |
    +--------+-----------------+------------------+
    |  58860 | 发送流量:      | net.if.out[eth0] |
    +--------+-----------------+------------------+
    1 row in set (0.00 sec)

    3)通过itemid查询主机的监控项目(history_uint或者trends_uint),单位为M。

       主机流入流量:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    mysql> select from_unixtime(clock) as DateTime,round(value/1024/1024,2) as Traffic_in from history_uint where itemid="58855" and from_unixtime(clock)>='2014-09-20' and from_unixtime(clock)<'2014-09-21' limit 20;
    +---------------------+------------+
    | DateTime            | Traffic_in |
    +---------------------+------------+
    | 2014-09-20 00:00:55 |       0.10 |
    | 2014-09-20 00:01:55 |       0.09 |
    | 2014-09-20 00:02:55 |       0.07 |
    | 2014-09-20 00:03:55 |       0.05 |
    | 2014-09-20 00:04:55 |       0.03 |
    | 2014-09-20 00:05:55 |       0.06 |
    | 2014-09-20 00:06:55 |       0.12 |
    | 2014-09-20 00:07:55 |       0.05 |
    | 2014-09-20 00:08:55 |       0.10 |
    | 2014-09-20 00:09:55 |       0.10 |
    | 2014-09-20 00:10:55 |       0.12 |
    | 2014-09-20 00:11:55 |       0.12 |
    | 2014-09-20 00:12:55 |       0.13 |
    | 2014-09-20 00:13:55 |       3.16 |
    | 2014-09-20 00:14:55 |       0.23 |
    | 2014-09-20 00:15:55 |       0.24 |
    | 2014-09-20 00:16:55 |       0.26 |
    | 2014-09-20 00:17:55 |       0.23 |
    | 2014-09-20 00:18:55 |       0.14 |
    | 2014-09-20 00:19:55 |       0.16 |
    +---------------------+------------+
    20 rows in set (0.82 sec)

        主机流出流量:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    mysql> select from_unixtime(clock) as DateTime,round(value/1024/1024,2) as Traffic_out from history_uint where itemid="58860" and from_unixtime(clock)>='2014-09-20' and from_unixtime(clock)<'2014-09-21' limit 20;
    +---------------------+-------------+
    | DateTime            | Traffic_out |
    +---------------------+-------------+
    | 2014-09-20 00:00:00 |        4.13 |
    | 2014-09-20 00:01:00 |        3.21 |
    | 2014-09-20 00:02:00 |        2.18 |
    | 2014-09-20 00:03:01 |        1.61 |
    | 2014-09-20 00:04:00 |        1.07 |
    | 2014-09-20 00:05:00 |        0.92 |
    | 2014-09-20 00:06:00 |        1.23 |
    | 2014-09-20 00:07:00 |        2.76 |
    | 2014-09-20 00:08:00 |        1.35 |
    | 2014-09-20 00:09:00 |        3.11 |
    | 2014-09-20 00:10:00 |        2.99 |
    | 2014-09-20 00:11:00 |        2.68 |
    | 2014-09-20 00:12:00 |        2.55 |
    | 2014-09-20 00:13:00 |        2.89 |
    | 2014-09-20 00:14:00 |        4.98 |
    | 2014-09-20 00:15:00 |        6.56 |
    | 2014-09-20 00:16:00 |        7.34 |
    | 2014-09-20 00:17:00 |        6.81 |
    | 2014-09-20 00:18:00 |        7.67 |
    | 2014-09-20 00:19:00 |        4.11 |
    +---------------------+-------------+
    20 rows in set (0.74 sec)

    4)如果是两台设备,汇总流量,假如公司出口有两台设备,可以用下面的SQL语句汇总每天的流量。下面SQL语句是汇总上面主机网卡的进出流量的。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    mysql> select from_unixtime(clock,"%Y-%m-%d %H:%i"as DateTime,sum(round(value/1024/1024,2)) as Traffic_total from history_uint where itemid in (58855,58860)  and from_unixtime(clock)>='2014-09-20'and from_unixtime(clock)<'2014-09-21' group by from_unixtime(clock,"%Y-%m-%d %H:%i") limit 20;
    +------------------+---------------+
    | DateTime         | Traffic_total |
    +------------------+---------------+
    | 2014-09-20 00:00 |          4.23 |
    | 2014-09-20 00:01 |          3.30 |
    | 2014-09-20 00:02 |          2.25 |
    | 2014-09-20 00:03 |          1.66 |
    | 2014-09-20 00:04 |          1.10 |
    | 2014-09-20 00:05 |          0.98 |
    | 2014-09-20 00:06 |          1.35 |
    | 2014-09-20 00:07 |          2.81 |
    | 2014-09-20 00:08 |          1.45 |
    | 2014-09-20 00:09 |          3.21 |
    | 2014-09-20 00:10 |          3.11 |
    | 2014-09-20 00:11 |          2.80 |
    | 2014-09-20 00:12 |          2.68 |
    | 2014-09-20 00:13 |          6.05 |
    | 2014-09-20 00:14 |          5.21 |
    | 2014-09-20 00:15 |          6.80 |
    | 2014-09-20 00:16 |          7.60 |
    | 2014-09-20 00:17 |          7.04 |
    | 2014-09-20 00:18 |          7.81 |
    | 2014-09-20 00:19 |          4.27 |
    +------------------+---------------+
    20 rows in set (1.52 sec)

    5)查询一天中主机流量的最大值,最小值和平均值。

    1
    2
    3
    4
    5
    6
    7
    mysql> select date as DateTime,round(min(traffic)/2014/1024,2) as TotalMinIN,round(avg(traffic)/1024/1024,2) as TotalAvgIN,round(max(traffic)/1024/1024,2)  as TotalMaxIN from (select from_unixtime(clock,"%Y-%m-%d"as date,sum(value) as traffic from history_uint where itemid in (58855,58860)  and from_unixtime(clock)>='2014-09-20' and from_unixtime(clock)<'2014-09-21' group by from_unixtime(clock,"%Y-%m-%d %H:%i") ) tmp;
    +------------+------------+------------+------------+
    | DateTime   | TotalMinIN | TotalAvgIN | TotalMaxIN |
    +------------+------------+------------+------------+
    | 2014-09-20 |       0.01 |       4.63 |     191.30 |
    +------------+------------+------------+------------+
    1 row in set (1.74 sec)

    6)查询主机组里面所有主机CPU Idle平均值(原始值)。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    mysql> select from_unixtime(hi.clock,"%Y-%m-%d %H:%i"as DateTime,g.name as Group_Name,h.host as Host, hi.value as Cpu_Avg_Idle from hosts_groups as hg join groups g on g.groupid = hg.groupid join items i on hg.hostid = i.hostid join hosts h on h.hostid=i.hostid join history hi on  i.itemid = hi.itemid where g.name='上海机房--项目测试' and i.key_='system.cpu.util[,idle]' and  from_unixtime(clock)>='2014-09-24' and from_unixtime(clock)<'2014-09-25' group by h.host,from_unixtime(hi.clock,"%Y-%m-%d %H:%i") limit 10;
    +------------------+----------------------------+----------+--------------+
    | DateTime         | Group_Name                 | Host     | Cpu_Avg_Idle |
    +------------------+----------------------------+----------+--------------+
    | 2014-09-24 00:02 | 上海机房--项目测试         | testwb01 |      94.3960 |
    | 2014-09-24 00:07 | 上海机房--项目测试         | testwb01 |      95.2086 |
    | 2014-09-24 00:12 | 上海机房--项目测试         | testwb01 |      95.4308 |
    | 2014-09-24 00:17 | 上海机房--项目测试         | testwe01 |      95.4580 |
    | 2014-09-24 00:22 | 上海机房--项目测试         | testwb01 |      95.4611 |
    | 2014-09-24 00:27 | 上海机房--项目测试         | testwb01 |      95.2939 |
    | 2014-09-24 00:32 | 上海机房--项目测试         | testwb01 |      96.0896 |
    | 2014-09-24 00:37 | 上海机房--项目测试         | testwb01 |      96.5286 |
    | 2014-09-24 00:42 | 上海机房--项目测试         | testwb01 |      96.8086 |
    | 2014-09-24 00:47 | 上海机房--项目测试         | testwb01 |      96.6854 |
    +------------------+----------------------------+----------+--------------+
    10 rows in set (0.75 sec)

    7)查询主机组里面所有主机CPU Idle平均值(汇总值)。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    mysql> select from_unixtime(hi.clock,"%Y-%m-%d %H:%i"as Date,g.name as Group_Name,h.host as Host, hi.value_avg as Cpu_Avg_Idle   from hosts_groups as hg join groups g on g.groupid = hg.groupid join items i on hg.hostid = i.hostid join hosts h on h.hostid=i.hostid join trends hi on  i.itemid = hi.itemid     where g.name='上海机房--项目测试' and i.key_='system.cpu.util[,idle]' and  from_unixtime(clock)>='2014-09-10' and from_unixtime(clock)<'2014-09-11' group by h.host,from_unixtime(hi.clock,"%Y-%m-%d %H:%i") limit 10;
    +------------------+----------------------------+----------+--------------+
    Date             | Group_Name                 | Host     | Cpu_Avg_Idle |
    +------------------+----------------------------+----------+--------------+
    | 2014-09-10 00:00 | 上海机房--项目测试         | testwb01 |      99.9826 |
    | 2014-09-10 01:00 | 上海机房--项目测试         | testwb01 |      99.9826 |
    | 2014-09-10 02:00 | 上海机房--项目测试         | testwb01 |      99.9825 |
    | 2014-09-10 03:00 | 上海机房--项目测试         | testwb01 |      99.9751 |
    | 2014-09-10 04:00 | 上海机房--项目测试         | testwb01 |      99.9843 |
    | 2014-09-10 05:00 | 上海机房--项目测试         | testwb01 |      99.9831 |
    | 2014-09-10 06:00 | 上海机房--项目测试         | testwb01 |      99.9829 |
    | 2014-09-10 07:00 | 上海机房--项目测试         | testwb01 |      99.9843 |
    | 2014-09-10 08:00 | 上海机房--项目测试         | testwb01 |      99.9849 |
    | 2014-09-10 09:00 | 上海机房--项目测试         | testwb01 |      99.9849 |
    +------------------+----------------------------+----------+--------------+
    10 rows in set (0.01 sec)

    8)其它与Zabbix相关的SQL语句。

        查询主机已经添加但没有开启监控主机:

    1
    select host from hosts where status=1;

        查询NVPS的值:

    1
    2
    3
    4
    5
    6
    7
    mysql> SELECT round(SUM(1.0/i.delay),2) AS qps FROM items i,hosts h WHERE i.status='0' AND i.hostid=h.hostid AND h.status='0' AND i.delay<>0; 
    +--------+
    | qps    |
    +--------+
    | 503.40 |
    +--------+
    1 row in set (0.11 sec)

        查询IDC机房的资产信息:

    1
    2
    3
    4
    5
    6
    7
    8
    mysql> select name,os,tag,hardware from host_inventory where hostid in (select hostid from  hosts_groups  where groupid=69) limit 2;
    +-------+----------------------------+------+-------------------+
    name  | os                         | tag  | hardware          |
    +-------+----------------------------+------+-------------------+
    | SHDBM | CentOS release 5.2 (Final) | i686 | ProLiant DL360 G5 |
    | SHDBS | CentOS release 5.2 (Final) | i686 | ProLiant DL360 G5 |
    +-------+----------------------------+------+-------------------+
    rows in set (0.00 sec)

        查询Zabbix interval分布情况:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    mysql> select delay,count(*),concat(round(count(*) / (select count(*) from items where status=0)*100,2),"%"as percent from items where status=0 group by delay order by desc;
    +-------+----------+---------+
    | delay | count(*) | percent |
    +-------+----------+---------+
    |  3600 |    41168 | 38.92%  |
    |   300 |    35443 | 33.51%  |
    |   600 |    16035 | 15.16%  |
    |    60 |    12178 | 11.51%  |
    |     0 |      902 | 0.85%   |
    | 36000 |       46 | 0.04%   |
    |    30 |        1 | 0.00%   |
    +-------+----------+---------+
    rows in set (0.68 sec)

        总结:通过SQL语句可以查询出任何监控项目的数据,并且在SQL语句的末尾通过into outfile '/tmp/zabbix_result.txt'直接把查询的结果保存到系统上面,在通过脚本发送查询结果到指定的用户,实现自动化查询的过程,网上很少有介绍Zabbix数据库查询的文章,希望对大家有所帮助。










    本文转自 sfzhang 51CTO博客,原文链接:http://blog.51cto.com/sfzhang88/1558254,如需转载请自行联系原作者

    展开全文
  • 做过Zabbix同学都知道,Zabbix通过专用Agent或者SNMP收集相关监控数据,然后存储到数据库里面实时在前台展示。Zabbix监控数据主要分为以下两类: 历史数据:history相关表,从history_uint表里面可以查询到...

     

    如何从Zabbix数据库中获取监控数据

    做过Zabbix的同学都知道,Zabbix通过专用的Agent或者SNMP收集相关的监控数据,然后存储到数据库里面实时在前台展示。Zabbix监控数据主要分为以下两类:

        历史数据:history相关表,从history_uint表里面可以查询到设备监控项目的最大,最小和平均值,即存储监控数据的原始数据。

        趋势数据:trends相关表,趋势数据是经过Zabbix计算的数据,数据是从history_uint里面汇总的,从trends_uint可以查看到监控数据每小时最大,最小和平均值,即存储监控数据的汇总数据。

        Zabbix可以通过两种方式获取历史数据:

    1.通过Zabbix前台获取历史数据

        通过Zabbix前台查看历史数据非常简单,可以通过检测中->最新数据 的方式查看。也可以点击右上角的As plain test按钮保存成文本文件。

     

     

    2.通过前台获取的数据进行处理和二次查询有很多限制,因此可以通过SQL语句直接从后台DB查询数据。    

        首先大家应该熟悉SQL语句Select 常用用法:

     

    1
    2
    3
    4
    5
    6
    7
    SELECT [ALL DISTINCT] Select_List [INTO [New_Table_name]
    FROM { Table_name | View_name} [ [,{table2_name | view2_name}
         [,...] ]
    WHERE Serch_conditions ]
    GROUP BY Group_by_list ]
    HAVING Serch_conditions ]
    ORDER BY Order_list [ASCDEsC] ]

        说明:

    1)SELECT子句指定要查询的特定表中的列,它可以是*,表达式,列表等。

    2)INTO子句指定要生成新的表。

    3)FROM子句指定要查询的表或者视图。

    4)WHERE子句用来限定查询的范围和条件。

    5)GROUP BY子句指定分组查询子句。

    6)HAVING子句用于指定分组子句的条件。

    7)ORDER BY可以根据一个或者多个列来排序查询结果,在该子句中,既可以使用列名,也可以使用相对列号,ASC表示升序,DESC表示降序。

    8)mysql聚合函数:sum(),count(),avg(),max(),avg()等都是聚合函数,当我们在用聚合函数的时候,一般都要用到GROUP BY 先进行分组,然后再进行聚合函数的运算。运算完后就要用到Having子句进行判断了,例如聚合函数的值是否大于某一个值等等。

    从Zabbix数据库中查询监控项目方法,这里已查询主机的网卡流量为例子:

    1)通过hosts表查找host的ID。

    1
    2
    3
    4
    5
    6
    7
    mysql> select host,hostid from hosts where host="WWW05";
    +-------+--------+
    | host  | hostid |
    +-------+--------+
    | WWW05 |  10534 |
    +-------+--------+
    1 row in set (0.00 sec)

    2)通过items表查找主的监控项和key以及itemid。

    1
    2
    3
    4
    5
    6
    7
    mysql> select itemid,name,key_ from items where hostid=10534 and key_="net.if.out[eth0]";
    +--------+-----------------+------------------+
    | itemid | name            | key_             |
    +--------+-----------------+------------------+
    |  58860 | 发送流量:      | net.if.out[eth0] |
    +--------+-----------------+------------------+
    1 row in set (0.00 sec)

    3)通过itemid查询主机的监控项目(history_uint或者trends_uint),单位为M。

       主机流入流量:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    mysql> select from_unixtime(clock) as DateTime,round(value/1024/1024,2) as Traffic_in from history_uint where itemid="58855" and from_unixtime(clock)>='2014-09-20' and from_unixtime(clock)<'2014-09-21' limit 20;
    +---------------------+------------+
    | DateTime            | Traffic_in |
    +---------------------+------------+
    | 2014-09-20 00:00:55 |       0.10 |
    | 2014-09-20 00:01:55 |       0.09 |
    | 2014-09-20 00:02:55 |       0.07 |
    | 2014-09-20 00:03:55 |       0.05 |
    | 2014-09-20 00:04:55 |       0.03 |
    | 2014-09-20 00:05:55 |       0.06 |
    | 2014-09-20 00:06:55 |       0.12 |
    | 2014-09-20 00:07:55 |       0.05 |
    | 2014-09-20 00:08:55 |       0.10 |
    | 2014-09-20 00:09:55 |       0.10 |
    | 2014-09-20 00:10:55 |       0.12 |
    | 2014-09-20 00:11:55 |       0.12 |
    | 2014-09-20 00:12:55 |       0.13 |
    | 2014-09-20 00:13:55 |       3.16 |
    | 2014-09-20 00:14:55 |       0.23 |
    | 2014-09-20 00:15:55 |       0.24 |
    | 2014-09-20 00:16:55 |       0.26 |
    | 2014-09-20 00:17:55 |       0.23 |
    | 2014-09-20 00:18:55 |       0.14 |
    | 2014-09-20 00:19:55 |       0.16 |
    +---------------------+------------+
    20 rows in set (0.82 sec)

     

        主机流出流量:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    mysql> select from_unixtime(clock) as DateTime,round(value/1024/1024,2) as Traffic_out from history_uint where itemid="58860" and from_unixtime(clock)>='2014-09-20' and from_unixtime(clock)<'2014-09-21' limit 20;
    +---------------------+-------------+
    | DateTime            | Traffic_out |
    +---------------------+-------------+
    | 2014-09-20 00:00:00 |        4.13 |
    | 2014-09-20 00:01:00 |        3.21 |
    | 2014-09-20 00:02:00 |        2.18 |
    | 2014-09-20 00:03:01 |        1.61 |
    | 2014-09-20 00:04:00 |        1.07 |
    | 2014-09-20 00:05:00 |        0.92 |
    | 2014-09-20 00:06:00 |        1.23 |
    | 2014-09-20 00:07:00 |        2.76 |
    | 2014-09-20 00:08:00 |        1.35 |
    | 2014-09-20 00:09:00 |        3.11 |
    | 2014-09-20 00:10:00 |        2.99 |
    | 2014-09-20 00:11:00 |        2.68 |
    | 2014-09-20 00:12:00 |        2.55 |
    | 2014-09-20 00:13:00 |        2.89 |
    | 2014-09-20 00:14:00 |        4.98 |
    | 2014-09-20 00:15:00 |        6.56 |
    | 2014-09-20 00:16:00 |        7.34 |
    | 2014-09-20 00:17:00 |        6.81 |
    | 2014-09-20 00:18:00 |        7.67 |
    | 2014-09-20 00:19:00 |        4.11 |
    +---------------------+-------------+
    20 rows in set (0.74 sec)

    4)如果是两台设备,汇总流量,假如公司出口有两台设备,可以用下面的SQL语句汇总每天的流量。下面SQL语句是汇总上面主机网卡的进出流量的。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    mysql> select from_unixtime(clock,"%Y-%m-%d %H:%i"as DateTime,sum(round(value/1024/1024,2)) as Traffic_total from history_uint where itemid in (58855,58860)  and from_unixtime(clock)>='2014-09-20'and from_unixtime(clock)<'2014-09-21' group by from_unixtime(clock,"%Y-%m-%d %H:%i") limit 20;
    +------------------+---------------+
    | DateTime         | Traffic_total |
    +------------------+---------------+
    | 2014-09-20 00:00 |          4.23 |
    | 2014-09-20 00:01 |          3.30 |
    | 2014-09-20 00:02 |          2.25 |
    | 2014-09-20 00:03 |          1.66 |
    | 2014-09-20 00:04 |          1.10 |
    | 2014-09-20 00:05 |          0.98 |
    | 2014-09-20 00:06 |          1.35 |
    | 2014-09-20 00:07 |          2.81 |
    | 2014-09-20 00:08 |          1.45 |
    | 2014-09-20 00:09 |          3.21 |
    | 2014-09-20 00:10 |          3.11 |
    | 2014-09-20 00:11 |          2.80 |
    | 2014-09-20 00:12 |          2.68 |
    | 2014-09-20 00:13 |          6.05 |
    | 2014-09-20 00:14 |          5.21 |
    | 2014-09-20 00:15 |          6.80 |
    | 2014-09-20 00:16 |          7.60 |
    | 2014-09-20 00:17 |          7.04 |
    | 2014-09-20 00:18 |          7.81 |
    | 2014-09-20 00:19 |          4.27 |
    +------------------+---------------+
    20 rows in set (1.52 sec)

    5)查询一天中主机流量的最大值,最小值和平均值。

    1
    2
    3
    4
    5
    6
    7
    mysql> select date as DateTime,round(min(traffic)/2014/1024,2) as TotalMinIN,round(avg(traffic)/1024/1024,2) as TotalAvgIN,round(max(traffic)/1024/1024,2)  as TotalMaxIN from (select from_unixtime(clock,"%Y-%m-%d"as date,sum(value) as traffic from history_uint where itemid in (58855,58860)  and from_unixtime(clock)>='2014-09-20' and from_unixtime(clock)<'2014-09-21' group by from_unixtime(clock,"%Y-%m-%d %H:%i") ) tmp;
    +------------+------------+------------+------------+
    | DateTime   | TotalMinIN | TotalAvgIN | TotalMaxIN |
    +------------+------------+------------+------------+
    | 2014-09-20 |       0.01 |       4.63 |     191.30 |
    +------------+------------+------------+------------+
    1 row in set (1.74 sec)

    6)查询主机组里面所有主机CPU Idle平均值(原始值)。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    mysql> select from_unixtime(hi.clock,"%Y-%m-%d %H:%i"as DateTime,g.name as Group_Name,h.host as Host, hi.value as Cpu_Avg_Idle from hosts_groups as hg join groups g on g.groupid = hg.groupid join items i on hg.hostid = i.hostid join hosts h on h.hostid=i.hostid join history hi on  i.itemid = hi.itemid where g.name='上海机房--项目测试' and i.key_='system.cpu.util[,idle]' and  from_unixtime(clock)>='2014-09-24' and from_unixtime(clock)<'2014-09-25' group by h.host,from_unixtime(hi.clock,"%Y-%m-%d %H:%i") limit 10;
    +------------------+----------------------------+----------+--------------+
    | DateTime         | Group_Name                 | Host     | Cpu_Avg_Idle |
    +------------------+----------------------------+----------+--------------+
    | 2014-09-24 00:02 | 上海机房--项目测试         | testwb01 |      94.3960 |
    | 2014-09-24 00:07 | 上海机房--项目测试         | testwb01 |      95.2086 |
    | 2014-09-24 00:12 | 上海机房--项目测试         | testwb01 |      95.4308 |
    | 2014-09-24 00:17 | 上海机房--项目测试         | testwe01 |      95.4580 |
    | 2014-09-24 00:22 | 上海机房--项目测试         | testwb01 |      95.4611 |
    | 2014-09-24 00:27 | 上海机房--项目测试         | testwb01 |      95.2939 |
    | 2014-09-24 00:32 | 上海机房--项目测试         | testwb01 |      96.0896 |
    | 2014-09-24 00:37 | 上海机房--项目测试         | testwb01 |      96.5286 |
    | 2014-09-24 00:42 | 上海机房--项目测试         | testwb01 |      96.8086 |
    | 2014-09-24 00:47 | 上海机房--项目测试         | testwb01 |      96.6854 |
    +------------------+----------------------------+----------+--------------+
    10 rows in set (0.75 sec)

    7)查询主机组里面所有主机CPU Idle平均值(汇总值)。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    mysql> select from_unixtime(hi.clock,"%Y-%m-%d %H:%i"as Date,g.name as Group_Name,h.host as Host, hi.value_avg as Cpu_Avg_Idle   from hosts_groups as hg join groups g on g.groupid = hg.groupid join items i on hg.hostid = i.hostid join hosts h on h.hostid=i.hostid join trends hi on  i.itemid = hi.itemid     where g.name='上海机房--项目测试' and i.key_='system.cpu.util[,idle]' and  from_unixtime(clock)>='2014-09-10' and from_unixtime(clock)<'2014-09-11' group by h.host,from_unixtime(hi.clock,"%Y-%m-%d %H:%i") limit 10;
    +------------------+----------------------------+----------+--------------+
    Date             | Group_Name                 | Host     | Cpu_Avg_Idle |
    +------------------+----------------------------+----------+--------------+
    | 2014-09-10 00:00 | 上海机房--项目测试         | testwb01 |      99.9826 |
    | 2014-09-10 01:00 | 上海机房--项目测试         | testwb01 |      99.9826 |
    | 2014-09-10 02:00 | 上海机房--项目测试         | testwb01 |      99.9825 |
    | 2014-09-10 03:00 | 上海机房--项目测试         | testwb01 |      99.9751 |
    | 2014-09-10 04:00 | 上海机房--项目测试         | testwb01 |      99.9843 |
    | 2014-09-10 05:00 | 上海机房--项目测试         | testwb01 |      99.9831 |
    | 2014-09-10 06:00 | 上海机房--项目测试         | testwb01 |      99.9829 |
    | 2014-09-10 07:00 | 上海机房--项目测试         | testwb01 |      99.9843 |
    | 2014-09-10 08:00 | 上海机房--项目测试         | testwb01 |      99.9849 |
    | 2014-09-10 09:00 | 上海机房--项目测试         | testwb01 |      99.9849 |
    +------------------+----------------------------+----------+--------------+
    10 rows in set (0.01 sec)

    8)其它与Zabbix相关的SQL语句。

        查询主机已经添加但没有开启监控主机:

    1
    select host from hosts where status=1;

        查询NVPS的值:

    1
    2
    3
    4
    5
    6
    7
    mysql> SELECT round(SUM(1.0/i.delay),2) AS qps FROM items i,hosts h WHERE i.status='0' AND i.hostid=h.hostid AND h.status='0' AND i.delay<>0; 
    +--------+
    | qps    |
    +--------+
    | 503.40 |
    +--------+
    1 row in set (0.11 sec)

        查询IDC机房的资产信息:

    1
    2
    3
    4
    5
    6
    7
    8
    mysql> select name,os,tag,hardware from host_inventory where hostid in (select hostid from  hosts_groups  where groupid=69) limit 2;
    +-------+----------------------------+------+-------------------+
    name  | os                         | tag  | hardware          |
    +-------+----------------------------+------+-------------------+
    | SHDBM | CentOS release 5.2 (Final) | i686 | ProLiant DL360 G5 |
    | SHDBS | CentOS release 5.2 (Final) | i686 | ProLiant DL360 G5 |
    +-------+----------------------------+------+-------------------+
    rows in set (0.00 sec)

        查询Zabbix interval分布情况:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    mysql> select delay,count(*),concat(round(count(*) / (select count(*) from items where status=0)*100,2),"%"as percent from items where status=0 group by delay order by desc;
    +-------+----------+---------+
    | delay | count(*) | percent |
    +-------+----------+---------+
    |  3600 |    41168 | 38.92%  |
    |   300 |    35443 | 33.51%  |
    |   600 |    16035 | 15.16%  |
    |    60 |    12178 | 11.51%  |
    |     0 |      902 | 0.85%   |
    | 36000 |       46 | 0.04%   |
    |    30 |        1 | 0.00%   |
    +-------+----------+---------+
    rows in set (0.68 sec)

        总结:通过SQL语句可以查询出任何监控项目的数据,并且在SQL语句的末尾通过into outfile '/tmp/zabbix_result.txt'直接把查询的结果保存到系统上面,方便后续操作.

     

    引用:http://www.xici.net/d221092545.html

     

    转载于:https://www.cnblogs.com/shuowen/p/9419596.html

    展开全文
  • 由于省、市、县城(区)这些数据是存储了MySQL数据库中的,我们要通过后台servlet获取数据库中的数据,然后再通过转发或者重定向的方式将数据呈现到前台页面中。 1.2、需要导入的jar包有: mysql驱动包:mysql-...

    1、在做这个小项目前的准备工作:

    1.1、分析:

        由于省、市、县城(区)这些数据是存储到了MySQL数据库中的,我们要通过后台servlet获取数据库中的数据,然后再通过转发或者重定向的方式将数据呈现到前台页面中。

    1.2、需要导入的jar包有:

    mysql驱动包:mysql-connector-java-5.1.7-bin.jar

    c3p0数据库连接池:c3p0-0.9.2.1.jar、mysql-connector-java-5.1.7-bin.jar(c3p0依赖包)

    前台c标签(需要通过遍历的方式呈现——c:forEach):jstl-1.0.2.jar、standard-1.0.1.jar(jstl依赖包)

    将集合或者数组转换成json数据格式(Jackson包):jackson-annotations-2.2.1.jar、jackson-core-2.2.1.jar、jackson-databind-2.2.1.jar

    前台页面需要用到jquery,故还需要导入jquery-1.7.2.js库文件

    1.3、该小项目用到的技术:

    jdbc的知识、servlet的知识、jquery的知识、Ajax的知识(局部刷新)、标签的知识、EL表达式的知识、JSP的知识

    2、开发过程:

    2.1、准备数据源

    创建一个数据库,命名为thereaction并创建三个表——province(省)、city(市)、county(县/区)
     

    2.2后台开发

    创建三个Javabean分别是Province、City、County。(由于太过简单,这里就不粘代码了)
    创建Java类和c3p0连接池实现与数据库的连接:DAO.java(实现获取数据库数据的功能)、jdbctools.java(实现获取数据库连接、释放连接的功能)、c3p0-config.xml
    jdbctools.java代码如下:
    package com.xiaojie.dao;
    
    import java.io.IOException;
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    
    import javax.sql.DataSource;
    
    import com.mchange.v2.c3p0.ComboPooledDataSource;
    
    public class Jdbctools {
    	private static DataSource ds=null;  
        //数据库连接池应只被初始化一次  
        static{  
            ds=new ComboPooledDataSource("helloc3p0");  
        }  
        //获取数据库连接  
        public static  Connection getConnection() throws ClassNotFoundException, SQLException, IOException{  
            return ds.getConnection();      
        } 
        public static void shifanglianjie(Connection ct, PreparedStatement ps,ResultSet rs) { 
        	if(rs!=null){
        		try {
    				rs.close();
    			} catch (SQLException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
        	}
        	if(ps!=null){
        		try {
    				ps.close();
    			} catch (SQLException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
        	}
        	if(ct!=null){
        		try {
    				ct.close();
    			} catch (SQLException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
        	}
        }
    
    }
    
    DAO.java的代码如下
    package com.xiaojie.dao;
    
    import java.io.IOException;
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.util.ArrayList;
    import java.util.List;
    
    import com.xiaojie.beans.City;
    import com.xiaojie.beans.County;
    import com.xiaojie.beans.Province;
    
    public class DAO {
    	public List<Province> getprovince(String sql ,Object...args) throws ClassNotFoundException, SQLException, IOException{
    		List<Province> provinces=new ArrayList<Province>();
    		//准备去查数据库
    		Connection ct=null;
    		ct=Jdbctools.getConnection();
    		System.out.println("获取到数据库的连接了");
    		PreparedStatement ps=null;
    		ResultSet rs=null;
    		ps=ct.prepareStatement(sql);
    		for(int i=0;i<args.length;i++){
    			ps.setObject(i+1, args[i]);
    		}
    		rs=ps.executeQuery();
    		while(rs.next()){
    			provinces.add(new Province(rs.getInt("province_id"),rs.getString("province_name")));
    		}
    		Jdbctools.shifanglianjie(ct, ps, rs);
    		return provinces;
    		
    	}
    	public List<City> getcity(String sql ,Object...args) throws SQLException, ClassNotFoundException, IOException{
    		List<City> cities=new ArrayList<City>();
    		//准备去查数据库
    		Jdbctools jt=new Jdbctools();
    		Connection ct=null;
    		ct=jt.getConnection();
    		PreparedStatement ps=null;
    		ResultSet rs=null;
    		ps=ct.prepareStatement(sql);
    		for(int i=0;i<args.length;i++){
    			ps.setObject(i+1, args[i]);
    		}
    		rs=ps.executeQuery();
    		while(rs.next()){
    			cities.add(new City(rs.getInt("city_id"),rs.getString("city_name")));
    		}
    		jt.shifanglianjie(ct, ps, rs);
    		return cities;
    		
    	}
    	public List<County> getcounty(String sql,Object...args ) throws SQLException, ClassNotFoundException, IOException{
    		List<County> counties=new ArrayList<County>();
    		//准备去查数据库
    		Jdbctools jt=new Jdbctools();
    		Connection ct=null;
    		ct=jt.getConnection();
    		PreparedStatement ps=null;
    		ResultSet rs=null;
    		ps=ct.prepareStatement(sql);
    		for(int i=0;i<args.length;i++){
    			ps.setObject(i+1, args[i]);
    		}
    		rs=ps.executeQuery();
    		while(rs.next()){
    			counties.add(new County(rs.getInt("county_id"),rs.getString("county_name")));
    		}
    		jt.shifanglianjie(ct, ps, rs);
    		return counties;
    		
    	}
    }
    
    c3p0-config.xml的代码如下:
    <?xml version="1.0" encoding="UTF-8"?>
    <c3p0-config> 
        <named-config name="helloc3p0"> 
    <!--     连接数据源的基本属性 -->
        <property name="user">root</property> 
         <property name="password"></property> 
         <property name="driverClass">com.mysql.jdbc.Driver</property> 
         <property name="jdbcUrl">jdbc:mysql:///thereaction</property> 
        
    <!--     若数据库中连接数不足时,一次向数据库服务器申请多少个连接  -->
        <property name="acquireIncrement">5</property> 
    <!--     	初始化数据库连接池时连接的数量 -->
        <property name="initialPoolSize">5</property> 
    <!--     数据库连接池中的最小的数据库连接数 -->
        <property name="minPoolSize">5</property> 
        <!--     数据库连接池中的最大的数据库连接数 -->
        <property name="maxPoolSize">10</property> 
    <!--     c3p0数据库连接可以维护的statement的个数 -->
        <property name="maxStatements">20</property> 
    <!--     每个连接同时可以使用的statement对象的个数 -->
        <property name="maxStatementsPerConnection">5</property> 
        </named-config> 
    </c3p0-config> 

    创建servlet.java 文件
    package com.xiaojie.servlet;
    
    import java.io.IOException;
    import java.lang.reflect.Method;
    import java.sql.SQLException;
    import java.util.List;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import com.fasterxml.jackson.databind.ObjectMapper;
    import com.xiaojie.beans.City;
    import com.xiaojie.beans.County;
    import com.xiaojie.beans.Province;
    import com.xiaojie.dao.DAO;
    /**
     * Servlet implementation class ThreeactiondServlet
     */
    @WebServlet("/threeactiondServlet")
    public class ThreeactiondServlet extends HttpServlet {
    	private static final long serialVersionUID = 1L;
    
    	/**
    	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
    	 */
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    	    String methodname=request.getParameter("method");  
    	    try {  
    	        Method method=getClass().getDeclaredMethod(methodname,HttpServletRequest.class,HttpServletResponse.class);  
    	        method.invoke(this, request,response);//调用各自的方法  
    	    } catch (Exception e) {  
    	        e.printStackTrace();  
    	    }
    	}
    	private DAO dao=new DAO();
    	protected void province(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException, ClassNotFoundException, SQLException {
    		System.out.println("province的servlet进入了");
    		String sql="select province_id,province_name from province";		
    		List<Province> provinces=dao.getprovince(sql);
    		request.setAttribute("provinces", provinces);
    		System.out.println(provinces);
    		//注意:这里不能用重定向的形式,因为我们好不容易在request请求域中存储了省的信息,目的是在前台页面中能够从请求域中获取到我们存在数据库中的值
    		//故这里只能用转发的方式
    		request.getRequestDispatcher("/index2.jsp").forward(request, response);
    	}
    	protected void city(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException, ClassNotFoundException, SQLException {
    		System.out.println("city的servlet进入了");
    		String province_id=request.getParameter("province_id");
    		String sql="select city_id,city_name from city where province_id=?";
    		List<City> cities=dao.getcity(sql,Integer.parseInt(province_id));
    		ObjectMapper mapper=new ObjectMapper();
    		String result=mapper.writeValueAsString(cities);
    		System.out.println(result);
    		response.setContentType("text/javascript");
    		response.getWriter().print(result);
    	}
    	protected void county(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException, ClassNotFoundException, SQLException {
    		System.out.println("county的servlet进入了");
    		String city_id=request.getParameter("city_id");
    		String sql="select county_id,county_name from county where city_id=?";
    		List<County> counties=dao.getcounty(sql,Integer.parseInt(city_id));
    		ObjectMapper mapper=new ObjectMapper();
    		String result=mapper.writeValueAsString(counties);
    		System.out.println(result);
    		response.setContentType("text/javascript");
    		response.getWriter().print(result);
    	}
    }
    
     

    2.3前台开发

    首先通过重定向的方式到后台获取数据将省份的信息显示在前台页面,这里创建一个index.jsp
    <%
     response.sendRedirect("threeactiondServlet?method=province");
    %>
    通过ajax技术实现三级联动的效果,这里创建一个index2.jsp
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%@ taglib prefix="c" uri="http://java.sun.com/jstl/core_rt" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>三级联动</title>
    <script type="text/javascript" src="jquery-1.7.2.js"></script>
    <script type="text/javascript">
    	$(function(){
    		alert("jquery起作用了");
    		$("#province").change(function(){
    			//使#city只保留第一个option子节点
    			$("#city option:not(:first)").remove();
    			var province_id=$(this).val();
    			if(province_id!=""){
    				var url="<%=request.getContextPath()%>/threeactiondServlet?method=city";
    				var args={"province_id":province_id,"time":new Date()};
    				$.getJSON(url,args,function(data){
    						for(var i=0;i<data.length;i++){
    							var city_id=data[i].city_id;
    							var city_name=data[i].city_name;
    							$("#city").append("<option value='"+city_id+"'>"+city_name+"</option>");
    						}				
    				});
    			}
    		
    			
    		});
    		$("#city").change(function(){
    			//使#county只保留第一个option子节点
    			$("#county option:not(:first)").remove();
    			var city_id=$(this).val();
    			if(city_id!=""){
    				var url="<%=request.getContextPath()%>/threeactiondServlet?method=county";
    				var args={"city_id":city_id,"time":new Date()};
    				$.getJSON(url,args,function(data){
    						for(var i=0;i<data.length;i++){
    							var county_id=data[i].county_id;
    							var county_name=data[i].county_name;
    							$("#county").append("<option value='"+county_id+"'>"+county_name+"</option>");
    						}				
    				});
    			}
    		
    			
    		});
    	});
    </script>
    </head>
    <body>
    
    <center>
    	省:<select id="province" >
    		<option value="">请选择...</option>
    		<c:forEach items="${provinces }" var="province">
    			<option value="${ province.province_id}">${ province.province_name}</option>
    		</c:forEach>
    	</select>
    	市:<select id="city">
    		<option value="">请选择...</option>
    	</select>
    	县:<select id="county">
    		<option value="">请选择...</option>
    	</select>
    </center>
    </body>
    </html>
     

    2.4、最后的效果

    运行index.jsp 文件得到的效果
    如有疑问请联系本人qq:1913284695(附源码下载
    或者微信:fyydbc
     
     
     
     
    展开全文
  • 我们今天就给大家介绍一个用途非常广泛功能:批量导入,很多系统中,这也是必须实现功能。而且当Excel表结构越复杂...项目进行简化,只有批量导入功能,采用Struts2框架,将Excel数据导入Mysql数据库中。 项...
  • 数据一般存放Excel表中,逐条迁移到数据库中太麻烦,而且很多时候企业的数据量都是以万起步,单条导入显然不现实。那么该如何解决呢? 我们今天就给大家介绍一个用途非常广泛的功能:批量导入,很多系统中,这...
  • 数据一般存放Excel表中,逐条迁移到数据库中太麻烦,而且很多时候企业的数据量都是以万起步,单条导入显然不现实。那么该如何解决呢?我们今天就给大家介绍一个用途非常广泛的功能:批量导入,很多系统中,这也...
  • 在unity学习 自然会遇见一个问题 就是关于Unity 前台页面制作登录模块 如何访问到数据库并且进行验证 在asp.net 我们自然会想到 在前台页面 运用jQuery 进行一次ajax访问 获取后台数据验证 那么 在unity ...
  • 在实际案例中我们经常需要展示一些数据,而这些数据都是存放在后台的数据库中的而且可能数量庞大,在前台的界面中一下子全都展示出来肯定是不现实的,另外一次性让后台传输如此多的数据到前台也会有很大的延迟,使...
  • 在myeclips10上,连接hbase数据库,表单的信息获取成功。 **question_one:**不知道如何把map型转换成json或者其他格式传到前台, **question_two**:不知道如何在hbase设计多对一、多对多的数据关系
  • 有效性规则 1205.8 疑难解答 1215.9 现实世界—批量数据输入 121第6章 排序、查找和筛选表中的数据 1236.1 理解排序和筛选的作用 1236.2 排序表的数据 1236.2.1 冻结表中某个字段的显示 1246.2.2 单个字段上排序...
  • 1205.8 疑难解答 1215.9 现实世界—批量数据输入 121第6章 排序、查找和筛选表中的数据 1236.1 理解排序和筛选的作用 1236.2 排序表的数据 1236.2.1 冻结表中某个字段的显示 1246.2.2 单个字段上排序数据 1246.2.3...
  • 1205.8 疑难解答 1215.9 现实世界—批量数据输入 121第6章 排序、查找和筛选表中的数据 1236.1 理解排序和筛选的作用 1236.2 排序表的数据 1236.2.1 冻结表中某个字段的显示 1246.2.2 单个字段上排序数据 1246.2.3...
  • 1205.8 疑难解答 1215.9 现实世界—批量数据输入 121第6章 排序、查找和筛选表中的数据 1236.1 理解排序和筛选的作用 1236.2 排序表的数据 1236.2.1 冻结表中某个字段的显示 1246.2.2 单个字段上排序数据 1246.2.3...
  • Java深入了解DTO及如何使用DTO

    万次阅读 多人点赞 2016-11-22 09:40:38
    传统编程,我们一般都是前台请求数据,发送Webservice,然后WebService向数据库发出请求,获取数据,然后一层层返回;模型如下: 这种比较原始请求方式带来缺点有很多,多次 请求耗费一定网络资源,...
  • 问题:更新过程删除掉缓存后刚好有业务查询,那么这个时候返回的数据会是空,会影响用户体验 方案2 [被动]前台获取数据时发现没有缓存数据就会去数据库同步数据缓存 问题:当并发请求获取缓存数据不存在的时候...
  • 如果要没有调度程序情况下仍能连接到数据库, 请将该值设置为与例程名相同。此参数自 8.1.3 版起已废弃。 值范围: 根据操作系统而定。 默认值 :0 mts_sessions: 说明 : 指定允许共享服务器体系结构用户会话...
  • Visual C++编程技巧精选500例.pdf

    热门讨论 2012-09-01 15:01:50
    265 如何在程序中将其他窗口程序调至前台? 266 如何获取当前系统时间? 267 如何设置当前系统时间? 268 如何计算时间差? 269 如何获取系统显示元素颜色? 270 如何获取系统当前显示模式? 271 如何获取系统支持...
  • url: '/News/QueryAllNews', //指向后台的Action来获取当前用户的信息的Json格式的数据 title: '新闻公告', //标识 iconCls: 'icon-save', height: 368, nowrap: true, autoRowHeight: false, striped: true,...
  • 克隆mall-admin-web项目,并导入IDEA完成编译:前端项目地址; mall-admin-web项目安装及部署请参考:mall前端项目安装与部署。 Docker环境部署 使用虚拟机安装CentOS7.6请参考:虚拟机安装及使用Linux...
  • 刚刚和八千哥弄一个问题,这个很诡异的问题,困扰了我这么长时间。...问题从此开始了,cows有一段从116的数据mycows是从118。但是程序无论如何都是取的从116的,经过测试发现,问题用hibernate...
  • 缓存分析

    2020-05-23 11:04:23
    因此,我们可以考虑在前台系统中,增加一层缓存,把这些数据缓存起来,请求到来时,不再调用数据接口,而是直接读取缓存中的数据。 这样就能大大减少首页分类加载所需时间,提高并发性能。 加不加缓存的标准: ...
  • python字符串与绘图复习变量None变量参与运算没有赋值的情况不会改变绘制立方体绘制五角星时间计算强化实现贷款计算连续输入多...所有的数据都是对象字符串格式化了解进制图形绘制重点作业以及学习认知方法day3 ...
  • 105页的数据结构和算法 142页的Spring 58页的过滤器和监听器 30页的HTTP xxxx页的Redis:待更新...(最新首发公众号,导航更新可能有延迟) Hibernate AJAX ...... :coffee:Java基础 初学者学Java常遇到的问题,我...
  • 软件开发过程中,解决技术问题使用的方法是文献法,通过查阅课本、图书馆资料和网络在线文献等,解决软件开发过程中的技术问题,比如数据库、建模工具的使用、软件测试等。 六、选题的特色及创新点 选题的特色:...
  • Redis实战使用

    2018-03-08 12:34:12
    适用场景 什么样情况才会用到缓存呢??一个项目中有些数据长时间不会发生变动,但是用户又访问特别频繁。...首先,我们会判断缓存中是否有该数据,如果没有就从数据库中获取,返回给前台的同时存入缓存一份...
  • asp.net知识库

    2015-06-18 08:45:45
    如何获取MSSQLServer,Oracel,Access中的数据字典信息 C#中利用GetOleDbSchemaTable获取数据库内表信息[原创] 如何解决ACCESS中SELECT TOP语句竟然返回多条记录的问题? Asp.net 利用OleDb的GetOLEDBSchemaTable方法...

空空如也

空空如也

1 2 3
收藏数 57
精华内容 22
关键字:

如何在前台获取到数据库中的数据