代码改变世界

两天四疑问

2004-09-03 10:56  FantasySoft  阅读(1191)  评论(3编辑  收藏  举报

        9月份的前两天,我仍然做着网站开发的工作。在开发的过程中,遇到了不少的问题,现在将典型的几个列示如下,供各位参考。
        第一个疑问是关于Javascript的,大家看一下以下的代码:

<html>
  
<head>
    
<script language="javascript">
      
function order()
      
{
            alert();
      }

    
</script>
  
</head>
  
<body>
  
<form>     
     
<input type="button" name="order" value="Click Me" onclick="order()" />
  
</form>
    </body>
</html>

        代码很简单,如果按了"Click Me"按钮后,是否会如愿弹出一个对话框呢?事实上,是不会的。原因是button的name与Javascript方法名字相同了,结果就造成了order方法没有被调用。解决办法是只要将方法名字做修改即可。虽然我知道了错误的原因,但是我却不知道为什么会这样,毕竟两者的作用域是不同的啊。
        第二个疑问是关于SQL的,大家再看一下以下的SQL语句:
        SELECT SUM(PRICE) AS SUM_PRICE FROM PRODUCT WHERE ID IN (1,3,4);
        SQL语句也很简单,就是将PRODUCT表中的PRODUCT ID为1、3、4的产品的价格加起来,得到一个总价,并且返回的列名为SUM_PRICE。需要额外说明的一点是PRICE是INT类型的,那么大家会觉得返回的SUM_PRICE是什么类型呢?由于我使用的是自己封装过的一个SqlExecutor类去处理返回的数据,而这个SqlExecutor使用ResultSet.getObject(string columnName)将所有返回数据存进一个SqlResults类中,而这个类包含是两个ArrayList,一个存放数据,一个存放columName。而getInt,getLong之类的方法则是定义在SqlResults类的,这些方法的工作则是从ArrayList中取出需要的数据,并且进行相应的类型转换。而对于这个返回的SUM_PRICE,我很自然的使用了getInt方法,结果是报出了类型转换的错误。查看源代码,发现getInt方法只是对返回数据进行了Integer和BigDecimal类型的检查。当时我仔细想了一下,由于是INT类型相加,那么有可能超出INT的范围,返回的就应该是Long类型才对了。接着,我就将getInt改为getLong了,类型转换的错误仍然存在。getLong方法中只是增加了对Long类型的检查。最后还是通过getObject方法得到了返回的类型,竟然是Doulbe!其实也很好理解了,由于SUM操作得到的数值是很难预料的,使用数值范围最大的类型来存放返回的数值也是为了得到最大的精度。后来我使用ResultSet.getInt方法尝试了一下,JDK提供的方法是工作得很好的。因此以后在封装自己的DAO类的时候,要注意这个地方了;
        第三个疑问是关于Tomcat的Session。问题的现象是,如果直接使用IP+端口号进行访问的话,session是会工作得很好的,但是如果使用了域名隐藏指向之后(例如,www.abc.com 隐藏指向了http://210.120.50.59:8080/webApp),session就莫名其妙的丢失了。这个问题到现在还没有解决呢,还请高手指点一二了;
        第四个疑问仍然与Tomcat有关。Tomcat的Connection Pool在工作了一段时间之后,当我需要从连接池取连接的时候,会报出Cannot get a connection, pool exhausted的异常,但是我很仔细的看过了自己的代码,都使用了finally将连接关掉了,而且就自己在测试,哪里会使用那么多的连接呢?这个问题也是悬而未决的,让我很郁闷。
        两天四疑问,路漫漫其修远兮,吾将上下而求索了。