对最近遇到的一些BT问题总结

来源:互联网 发布:中国历年gdp数据excel 编辑:程序博客网 时间:2024/05/21 22:55

首先要讲到的是一个非常bt的问题,如下

rs=stmt.executeQuery(sql);

和 stmt.execute(sql);
     rs=stmt.getResultSet();

这两个,一般没有遇到的人都会将,这有什么区别啊,不就是等同的吗?但事实上,却并非如此,比如说,你在以段代码中要执行两次查询,第一次查询是获得记录的总数,好赋值,第二次查询是查询出整个数据库的记录,将其放到一个list中,问题来了,如果你全部用第一种方式,那我告诉你,你也许会很郁闷的说,第二次怎么得不到数据了,原因是ResultSet这玩意有个游标,那东西一个劲的往下走,而且貌似,不是我们想想中的那种覆盖的(我说的是想普通变量那种赋值方式覆盖如,

rs=stmt.executeQuery(sql1);

rs=stmt.executeQuery(sql2);

)事实上,这样,最后的rs不会是你期望的,那么,解决的办法是第二个地方用第二种方法,也就是

stmt.execute(sql);
rs=stmt.getResultSet();

这样就覆盖了,我查过文档,说stmt.getResultSet();这种方法会把先前的那个rs释放掉,重新给一个新的你,问题就是这么解决的,当然,调试的过程中用到了很多的print语句,最后追踪到了是rs 的问题。

 

下面将说一说多googlemap的多marker多infowindow的问题这个是我遇到的一个比较陌生的问题,因为前期对javascript接触的比较少,所以以开始遇到了什么全局变量和一些局部变量的误用情况,以及对匿名函数不是很理解而导致的。我最开始的设计思路是这样的,首先建立一个markers数组,一个infowindows数组,和一组contentStrings数组,分别用来保存在map上的哪些marker,infowindow,对象和contentString字符串,初始化函数初始化map后,将用一个循环语句将marker都填充到map上,同理,一个循环来初始化多个infowindow对象,没添加一个就给地图添加一个事件google.maps.event.addListener(marker, 'click', function() {
    infowindow
.open(map,marker);
  
});

然后在使用一个函数来不断的更新contentString,然后给infowindow来设置新的congtent,想法很清晰,而且符合面向对想思路,但是运行不出希望看到的结果,终于在一篇文章中发现了,然后,一个map上只能有一个infowindow对象,至于为什么,到底是不是他说的只能有一个对象,我自己也不能理解,但是按照管方提供的那种方式,可以为每个marker设置一个秘密信息,当点击marker的时候会谈出来,确实是的,这个例子大家可以去看看http://code.google.com/intl/zh-CN/apis/maps/documentation/javascript/examples/event-closure.html,

你可以发现,在函数里面,他都是使用了局部变量,这里为什么使用局部变量就可以,而我的全局对象按照道理来说,绝对是一个infowindow对象,按照道理也应该是可以的,那么就可以调用其open方法,但是却并非如此,在javascript调试器里面看到的情况提示说调用了没有定义的open方法,那也就是说,你那个全局的infowindow对象系统并不知道是什么,用一个alter语句打印一下,发现确系是undefined,非常的糊涂了,我命名定义的是一个全局数组,而且,在用open方法的代码前已经对infowindows数组中的对象进行了初始化,如下

  contentStrings[i]=" ";

          infowindows[i] = new google.maps.InfoWindow({

               content: contentStrings[i]

               });

这段代码是是在全局范围内的,绝对是已经定义过了的。结果在调用infowindow。opem之前使用alert()函数打印时,居然也是输出undefined,这他不能让人相信了吧。我就定义了这么一个全局变量,而且,没有局部变量和其同名,居然给我打印undefined。在google上一顿狂搜,结果还是在官方文档上给出了解决办法,

  attachSecretMessage(marker, i);
  
}
}

// The five markers show a secret message when clicked
// but that message is not within the marker's instance data

function attachSecretMessage(marker, number){
  
var message =["This","is","the","secret","message"];
  
var infowindow =new google.maps.InfoWindow(
      
{ content: message[number],
        size
:new google.maps.Size(50,50)
      
});
  google
.maps.event.addListener(marker,'click',function(){
    infowindow
.open(map,marker);
  
});
} 

可以看出,infowindow是局部对象,这里,你有几个marker,就可以生成一个marker就对应一个infowindow对象,但是问题紧接着就出现了,那怎么去更新那个infowindow对象里面的content呢?现在那个对象都是局部对象,很显然,等函数以运行玩,它就没了,那你还到哪里去找那个对象啊?办法还是给我想出来了,不说太多了,直接贴出我的整个代码,其中,设计到变量的定义的部分在init.js中,我就不给出了

<%@ page language="java" import="java.util.*"%>
<%@ page contentType="text/html;charset=utf-8" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html> 
<head> 
<meta name="viewport" content="initial-scale=1.0, user-scalable=no" /> 
<meta http-equiv="content-type" content="text/html; charset=UTF-8"/> 
<title>Google Maps JavaScript API v3 Example: Map Language</title> 
<link href="http://code.google.com/apis/maps/documentation/javascript/examples/default.css" rel="stylesheet" type="text/css" /> 
<script type="text/javascript" src="</script'>http://maps.google.com/maps/api/js?sensor=false&language=zh"></script> 
<script type="text/javascript"  src="js/GetText.js"></script>
<script type="text/javascript"  src="js/ini.js"></script>
<script type="text/javascript"> 
  function initialize() {
    go2();
    
    var myLatlng = new google.maps.LatLng(30.538829653161645,114.35734391212463);
    var myOptions = {
      zoom: 16,
      center: myLatlng,
      mapTypeId: google.maps.MapTypeId.ROADMAP
    };
    map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);
   for(var i=0;i<markers.length;i++){
   markers[i].setMap(map);        

 //alert(infowindows[i]);infowindows[i]对象是定义了的
       //alert(infowindows[i]+"全局的");不用在这里初试话都可以访问到
       var infowindow=infowindows[i];
       var marker=markers[i];
       //alert(infowindow+"全局赋值的");//确实是按照说项输出的全局赋值的
       //alert(contentStrings[i]);
       attachSecretMessage(markers[i],i);
   }
  //setTimeout("addinfo()",2000);

  }
  
  function attachSecretMessage(marker, number) {
  var message = contentStrings;
  var infowindow = new google.maps.InfoWindow(
      { content: message[number]
        //size: new google.maps.Size(50,50)
      });
  google.maps.event.addListener(marker, 'click', function() {
    infowindow.open(map,marker);
    addinfo(infowindow,number);
  });
}
  
  
  
  
  function addinfo(infowindow,m){
      
     // for(var m=0;m<contentStrings.length;m++){
      //alert(temperatures[m]);//输出的是temperatures0,符合所想
       contentStrings[m] = "<table width='200' border='1'>"+
   "<tr>"+
     "<td width='52'><img src='img/temperature.gif'></td>"+
     "<td width='132'>"+document.getElementById(temperatures[m]).value+"</td>"+
    "</tr>"+
   "<tr>"+
    "<td><img src='img/illumination.gif'></td>" +
    "<td>"+document.getElementById(illuminations[m]).value+"</td>" +
   "</tr>"+
   "<tr>"+
   "<td><img src='img/moisture.gif'></td>"+
   "<td>"+document.getElementById(moistures[m]).value+"</td>" +
   "</tr>"+
   "<tr>"+
   "<td><img src='img/time.gif'></td>"+
   "<td>"+document.getElementById(times[m]).value+"</td>"+
   "</tr>"+
   "</table>";
   infowindow.setContent(contentStrings[m]); 
      //}
      
      //判断传感器是否着火的代码
      
      //首先设置一隐藏文本框old狂来保存以前的数据
      var newtemper =document.getElementById(temperatures[m]).value;
   var oldtemper=document.getElementById(temperolds[m]).value;
   if(oldtemper!=""){
    if((newtemper-oldtemper)>2){//如果说温度变化每两秒超过了2度,那报警,很可能着火了
     //for(var s=1;s<4;s++){
         //alert("zhixingle");
      setTimeout(function(){markers[m].setIcon(imagewrong);},100);//0.4秒图像变化下
      setTimeout(function(){markers[m].setIcon(image);},200);
      //markers[m].setIcon(image);
      //alert("执行了");
     //}
     document.getElementById(temperolds[m]).value=newtemper;//提示后赋值为新的值
     //markers[m].setIcon(image);//提示后要设置为正常图片
    }
    else{
    document.getElementById(temperolds[m]).value=newtemper;//没问出现问题直接赋值
    } 
   }
   else{
     //alert("zhixingle赋值");
     document.getElementById(temperolds[m]).value=newtemper;
   }
   setTimeout(function(){addinfo(infowindow,m);},2000);
    
    }
    
    function initemperold(){
    var o = document.getElementById("temperold");
    for(var n=0;n<markers.length;n++){
     var input = document.createElement("input");
     input.id=temperolds[n];
     input.type="hidden";
     input.value="";
     o.appendChild(input);
    }
    }
</script> 
<style type="text/css">
<!--
#map_canvas {
 height: 500px;
 width: 800px;
 float:right;
}
#txtHint{
 float:right;
}
#shidu{
 float:right;
}
-->
</style>
</head> 
<body onload="go2(), initialize()"> 
  <div id="map_canvas"></div> 
  
 <div id="txtHint" ><b>information will be show here.</b></div>
 <div id="temperold"></div>
 <script language="javascript"> initemperold();</script>
  <div id="shidu">
  <input type="button" value="显示湿度" onclick="alert(document.getElementById('temperature0').value)">
  </div>
</body> 
</html>
没错,就是紧接着,趁那个对象还在,使用一个函数来不停的更新信息

最后,遇到的问题也比较棘手,不过提示,当出现你获取的字符串和你预计的不同时,比如少了一点类容,考虑里面是否有" ,"这样的字符存在,最好用一对   ' '    将你的字符串引起来。

原创粉丝点击