2004年07月31日

昨天下午王师姐,给kesney,yyd和我开了个会,了解了一下大家目前的工组情况,陈述了一下当前要完成的工作,大致说了一下预期的项目进展,准备开始开发了。

呼呼,假期结束了,学习的契机又出现了,马上投入到无限的开发中来吧!!!

2004年07月30日

oracle问题:

  • java+oracle中的sql语句执行中的两个问题:
    • 日期型:无法通过javaDate类型直接写入oracle数据库,必须经过String类型做中间转,如:to_date(‘”+time+”‘,’yyyy-mm-dd hh24:mi:ss’)),但是可以用sysdate直接取数据库的当前时间。所以在写关于日期型的时候可以在外面一律使用String类型,凡参与data的变量一律转换成String,然后在与数据库接口的时候,使用to_date(),to_char()来完成转换
    • 数字型:对于oracle中的number型,首先声明小数的时候可以用number10,2)的形式声明有两位小数,然后在写入的时候实际上有没有‘ ‘都是一样的。
  •  oracle数据的导入有时候会很成问题,比如说今天sequence就死活导不进去

java问题:

  •  网报程序中对于LevServlet1中的forward也未必都能forward,调用时程序还会继续向下执行,这时候要很好的加上一个返回return
  • File.list()列出的所谓的abstract path实际上就是文件名。

  • String.substring(i,j)获得的实际上是String[i]到String[j-1]的部分,比如说String str=”012345″;str.substring(2,5)=”234″

  • trim()是去掉首尾的空格,那空格构成的字符串经trim以后会变成什么样子呢?String str=” “;str.trim()=”"

  • String nullStr=null;System.out.println(nullStr);打印出来的是null

  • Integer.parseInt()方法对于”a123″,”123a”,”1 2″,” 12″,这样的字符串在转换的时候都会报异常,就是说这个方法只对完全正常的字符串有效

  •  tomcat的输出日志catalina.out带日期,要有看的懂的提示,多system.out.println()出来一点内容

项目问题:

  • 封装数据库,封装操作一定要设计好,层次分清楚,做好了就不能改接口

  • 在公共组件部分,要throws异常,而不是处理异常,应该在最终使用的程序中处理异常,因为公共组件你并不知道会用在哪里,而只有最终的使用者他才知道用在哪里,他才知道这个异常是怎么造成的,遇到异常以后该打印什么样的提示信息,该怎么处理这个异常。你如果在公共组件中处理了异常,那么使用者就无法捕获这个异常,他并不知道执行过程中实际除了错误,这样是很不好的。

  • 写数据库组件的时候,把resultset去掉,都转换成vector用起来就比较方便了

  •  dbf中为空的值,在java中查出来以后通过getString()取到的将是“null”这个字符串,把这个字符串导入数据库以后就不是空值了,而是‘null’这个串了,例子,教育部给的bmd.dbf的导入过程

    然而在教育部给的招生单位的库中所有的值都不是空值,看似是空值的情况实际上是空格,这样导入以后就不能用‘null’这个串来判断,而应该用是否为空格构成的字符串来判断

 

一直以来,我们都把北大和浙大的考试科目数据上传作为检验系统的指标,所以各位重视这两个学校给我们的数据。前两天10335的浙大经过了多次验证,是没有问题的,可是昨天北大给我们出了个难题。

上传专业研究方向没有问题,上传考试科目的时候出了错,6127条数据,只能传上去5394条。

查错,因为数据太多了,想从其中发现错误,大海捞针一样。

首先考虑到按照异常提示,进行查找。系统报错ora-01401 插入的数值相对列过长,于是迅速怀疑其数据是否过长,打开dbf文件一看,过长的数据都已经被截掉了,但是是否会在半角全角上出问题了,这就不得而知了。为了证明这个问题,我在另外一个数据上把那个较长的字段长度改长,这时不再报ora-01401的错误了,报ora-00917错误,缺少逗号。于是立刻怀疑是数据中有不法字符,但是茫茫数据,如何定位错误数据呢?

我决定单写一个导入程序,逐条作检查,每次打印sql语句以定位错误数据。中间遇到了无法访问系统dbf数据库的问题,为了节省时间我采用了jdbc-odbc来访问,打印出来的结果一下在证明了一部分问题,关于缺少逗号这个错误,是因为在其中一个字段上存在单引号造成的。最终写入数据库中的数据成了6123条,有三条数据是因为单引号问题。

但是这仍然存在着问题,就是另外差的那条数据:

java.sql.SQLException: ORA-00001: unique constraint (APPLY.KSKM) violated

就是这个错误,这个有时候发生在第511条数据上,有时候发生在第767条数据上,而这两天数据根本就不一样,而以第767条数据出错时候居多。于是我在数据库和dbf文件中分别查找这条数据,结果发现dbf中这条数据是唯一的,而在日oracle中这条数据也存在,但select count(*)的结果分明告诉我除了那三条因为单引号没有被写入的数据以外,还有一条数据没有被写入,并且报错就报在第767条数据这里。

除了这一点比较奇怪以外,还有就是错误的不确定性,中间有一次尝试的时候就没有报错,6124条数据被导入。然后我再试,无论是删掉前导入的数据后导入,还是在原来的基础上通过程序删除数据后导入都无济于事。

我晕,以后写程序一定要在底层考虑周全,防患于未然.

2004年07月27日

 

  • 使用 HttpServletResponse.sendRedirect() 方法:这会导致向客户端浏览器返回一个特殊的 HTTP 返回代码(连同要重定向的页面),然后客户端浏览器又对重定向的目标发出新的请求。如果需要在这两个请求之间共享数据,那就必须将数据存储在会话或应用程序范围中。这类似于 ASP 中的 RESPONSE.REDIRECT() 函数。
  • 使用 servlet 中的 RequestDispatcher.forward() 方法或 JSP 页面中的特殊标签:这会导致调用此方法的资源终止,同时终止对作为转发目标的资源的调用。对客户端浏览器来说,这看起来就像是单个请求。例如,如果将请求从 servlet 转发到 JSP 页面,则您可能要附加该 servlet 中的某些处理结果,以便这些结果可以在 JSP 页面中显示出来。

 

所以response.sendRedirect()不能用request对象传递数据,而forward是可以的。

2004年07月26日

作了很长时间的web开发,似乎是学到很多东西,也能编出一些东西出来,但是最近才觉得学无止境,光是做不思考不总结不学习是不行的。

今天就碰到了post和get方式有怎样不同的问题,下面是我收集的一些解释: 

 

GET与POST的区别在于:(对于CGI

如果以GET方式传输,所带参数附加在CGI程式的URL后直接传给server,并可从server端的QUERY_STRING这个环境变量中读取;

如果以POST方式传输,则参数会被打包在数据报中传送给server,并可从CONTENT_LENGTH这个环境变量中读取出来。

还有一种情况是,你用的是GET方式,但传送的参数是路径,如:

—-< ahref=”/cgi-bin/a.pl/usr/local/bin/pine” >CGI< /a >

—-这时所传递的参数”/usr/local/bin/pine”存放在PATH_INFO这个环境变量中。环境变量的读取方式为$str=$ENV{‘QUERY_STRING’};

 

理论上说,GET是从服务器上请求数据,POST是发送数据到服务器。事实上,GET方法是把数据参数队列(query string)加到一个URL上,值和表单是一一对应的。比如说,name=John。在队列里,值和表单用一个&符号分开,空格用+号替换,特殊的符号转换成十六进制的代码。因为这一队列在URL里边,这样队列的参数就能看得到,可以被记录下来,或更改。通常GET方法还限制字符的大小。事实上POST方法可以没有时间限制的传递数据到服务器,用户在浏览器端是看不到这一过程的,所以POST方法比较适合用于发送一个保密的(比如信用卡号)或者比较大量的数据到服务器。

Post是允许传输大量数据的方法,而Get方法会将所要传输的数据附在网址后面,然后一起送达服务器,因此传送的数据量就会受到限制,但是执行效率却比Post方法好。

 

 

对于GET提交的数据,WWW服务器将把数据放在环境变量QUERY_STRING中;对于POST方法,数据被送到WWW服务器的STDOUT中,然后CGI从自己的STDIN中读取。使用传统的CGI方法,用户必须自己编程来处理这些数据。

 

 

GET与POST的区别在于,如果以GET方式传输,所带参数附加在CGI程式的URL后直接传给server,并可从server端的QUERY_STRING这个环境变量中读取;如果以POST方式传输,则参数会被打包在数据报中传送给server,并可从CONTENT_LENGTH这个环境变量中读取出来。还有一种情况是,你用的是GET方式,但传送的参数是路径,如:

—-< ahref=”/cgi-bin/a.pl/usr/local/bin/pine” >CGI< /a >

—-这时所传递的参数”/usr/local/bin/pine”存放在PATH_INFO这个环境变量中。环境变量的读取方式为$str=$ENV{‘QUERY_STRING’};

总结起来:

get方式:以URL字串本身传递数据参数,在服务器端可以从’QUERY_STRING’这个变量中直接读取,效率较高,但缺乏安全性,也无法来处理复杂的数据(只能是字符串,比如在servlet/jsp中就无法处理发挥java的比如vector之类的功能);

post方式:就传输方式讲参数会被打包在数据报中传输,从CONTENT_LENGTH这个环境变量中读取,便于传送较大一些的数据,同时因为不暴露数据在浏览器的地址栏中,安全性相对较高,但这样的处理效率会受到影响。

 

 

——————-

9月25日

今天又看到一篇文章来解释这个问题:

版权声明:CSDN是本Blog托管服务提供商。如本文牵涉版权问题,CSDN不承担相关责任,请版权拥有者直接与文章作者联系解决。

关于你上次提到的问题:
// –TCP/IP 协议详解卷3
13.3.1 报文类型:请求与响应
HTTP / 1 . 0报文有两种类型:请求和响应。HTTP / 1 . 0请求的格式是:
reqe t – l i n e
headers ( 0或有多个)
<blank line>
body (只对POST请求有效)

request – l i n e的格式是:
request request-URI HTTP版本号

支持以下三种请求:
1) G E T请求,返回re q u e s t – U R I所指出的任意信息。
2) H E A D请求,类似于G E T请求,但服务器程序只返回指定文档的首部信息,而不包含实际的文档内容。该请求通常被用来测试超文本链接的正确性、可访问性和最近的修改。
3) P O S T请求用来发送电子邮件、新闻或发送能由交互用户填写的表格。这是唯一需要在请求中发送b o d y的请求。使用P O S T请求时需要在报文首部C o n t e n t – L e n g t h字段中
指出b o d y的长度。
// –TCP/IP 协议详解卷3

明白?get 请求表示客户端请求一个uri,服务器返回客户端请求的uri,post请求表示客户端请求的时候还要提交数据,比喻提交form表单,要提交的数据会放到请求报文的body部分。服务器收到后这样的请求后通常需要来处理这些数据。
应聘j2ee开发时问这个问题说明提问着的重点是服务器对这两种请求的处理有什么不同,而不是这两种请求的报文有什么不同。当然作为一个jsp servlet的开发者一般你是不会感觉到着两种请求有什么不同的,因为web服务器已经对这些请求进行处理了,web服务器调用相应的 jsp/servlet来响应客户端请求的时候,对于post的请求,web服务器已经把客户端提交的数据取出来,添到request对象中去了。不过,对于get、post的请求servlet 的 doGet、 doPost方法会被响应调用。也就是说如果客户端送来的是一个get的请求,那么你写到servlet中的dopost()方法中的代码是不会执行的,反之如果是post的请求,写在doget()中代码是不会被调用的(对于所有方式的请求,写在doservice的代码是会被调用的,因为在HttpServlet类中doGet doPost的请求都是由doService来分发的,具体的看关于servlet的生命周期介绍)。

今天大概看了一下J2EE,感觉j2ee就是j2se的一个扩展,现在我们开发web系统所用到的servlet实际上是属于j2ee的范围的,j2ee里边主要是一些javax的包,包括xml,email,security,reusource,ejb,sql方面的内容。感觉j2ee不是自成体系的东西,而是在j2se的基础上作的一些关于web开发的扩展,更适合于开发web系统而已,而j2se里边的各个包提供的则是基础的工具。

 

总体的感觉就是:j2ee是利用j2se便于web开发,利于企业级开发的一个技术框架。

2004年07月25日

另类.NET编程语言之旅

作者: BUILDER.COM
Friday, July 5 2002 10:15 AM

照微软的说法,有了.NET平台,开发者要采用何种语言不过成了个人喜好的问题。.NET平台给我们带来了方便的代码重用性、功能强大的类库,以及可能是理论上的平台独立性,而这一切用任何编程语言都可以实现。至少,只要你选择的是C++、C#或者VB其结果就应该是这样。难道不是吗?

<a href="http://ad.cn.doubleclick.net/click%3Bh=v2|3153|3|0|%2a|y%3B7720504%3B0-0%3B0%3B6694713%3B31-1|1%3B4892528|4910424|1%3B%3B%3fhttp%3a%2f%2fhttp://ad.www.net.cn/ad/zdnet/zdnet_largeformat_index.htm" target="_blank"><img src="http://m2.cn.doubleclick.net/638159/cn_336_280.swf " width="468" height="60" border="0" /></a>

你可能会觉得这有点言过其实吧,谁不知道上面那3大语言微软出品的用的最普遍,那要不能用在自家平台上还不成怪事了?其实你错了。事实上,现在已经有若干编程语言开发商甚至一些爱好者都在致力于为.NET开发非微软语言的版本。当.NET还处于测试阶段的时候这些工作就已经开始了。下面就让我们看看这些替代语言,你完全可以通过它们利用.NET平台的特性构建Web或Windows应用程序。

Python和Perl

凭借其内建的正则表达式支持和难以置信的强大字符串操作特性,Perl长期以来一直是编写Web脚本语言中的翘楚。另一方面,Python则以其明晰的语法和快捷的开发速度而著称于世。ActiveState 已经付出了相当大的努力把这两种编程语言带入主流。

ActiveState的PerlNET 结合该公司出品的Perl Dev Kit 可以让Perl 程序员利用Perl开发.NET组件,同时,Perl for ASP.NET 则令我们用Perl开发ASP.NET应用程序和Web服务成为可能。此外, ActiveState还推出了两款“研究性”产品,这就是Perl for .NET 和 Python for .NET,它们总有一天能让开发者利用这两种语言开发出真正的.NET应用程序。

虽然从本质上说这些语言是不能进行.NET开发的,但是,ActiveState推出的Visual PerlVisual Python可以集成到Visual Studio .NET,从而使得开发者可以直接通过Visual Studio .NET IDE用Perl或者Python构建应用程序。这两种产品都支持Visual Studio的调试器、编辑环境、源代码控制和动态帮助特性。Visual Perl支持ActiveState的Perl Dev Kit,同时Visual Python则增加了对智能感应特性的支持。ActiveState还提供了Visual XSLT 插件,通过它你可以在Visual Studio .NET环境下创建和调试XSLT文档

J++的回归?

因了微软的恶毒,J++的命运真可谓心比天高,身为下贱!不过,毕竟这种微软的Java实现毕竟还有一丝气息。时光荏苒,这回用于.NET的J++又回来了,这就是所谓的J#.NET,它可以无缝地插入Visual Studio .NET。然而,由于微软和Sun之间的诉讼之争,J#.NET却只能支持旧有的JVM规范,所以建议你在做这一升级上最好小心为妙。话又说回来, J#.NET毕竟为Java应用程序提供了一条在.NET平台上运行和获取CLR特性的途径。至于你为什么要用到它可就不是我的事了。

COBOL,没错,就是COBOL

有的人看到这肯定会私下窃笑,但你总得承认,COBOL确实是最常用的编程语言之一。虽然年纪是大了点,但你可别忘了,正是COBOL构成了许多企业系统看不见的脊梁。Fujitsu推出的NetCOBOL for .NET,或者简称为NetCOBOL,其中就包含了能够产生Microsoft .NET代码的COBOL-85编译器,从而把现有的COBOL迁移到.NET运行时。虽然用COBOL构建ASP.NET应用程序或者XML Web服务看起来未免过于牵强,但这却是不折不扣的事实。对新开发项目而言, NetCOBOL同Visual Studio .NET相集成,支持.NET Windows Forms设计器。从而令开发人员可以采用Object COBOL创建Windows和Web应用程序。

建造.NET的埃菲尔铁塔

Eiffel 被它的支持者称呼为最纯洁的面向对象语言。它有一只规模不大但忠心耿耿的追随队伍。创造Eiffel 的Interactive Software Engineering公司生产了相应的Visual Studio.NET插件而且干脆制造了自己的Eiffel IDE,这就是EiffelStudio,有了它,开发者照样可以开发出.NET应用程序。

Scheming for .NET

Scheme开发者也没有在这场运动中落伍,Hotdog编译器目前已经处于开发状态而且有望支持后端的JVM、C和.NET编译器。这显然会令Scheme开拓一番全新的视野。

Delphi

Delphi程序员不久就能加入.NET的大军。Borland已经在4月的软件开发西部会议上宣布了开发支持.NET的Delphi产品的计划。Borland还计划针对.NET开发其他版本的产品,包括Kylix、 C++ Builder和Jbuilder。你可以参考Borland网站上的Delphi声明截屏

Mono:真正的可移植.NET

最后我们向你郑重介绍Mono项目,它很有希望成为事实上的跨平台.NET开发项目。Mono是开放源代码项目,其目的是把.NET框架和运行时移植到Linux。这个组织已经取得了显著的进步:Mono的C#编译器在功能上已经实用一段时间了,最近ASP.NET解析器也可用了。除了C#以外,Mono还有望支持Java和Visual Basic .NET。为了更加深入了解,你不妨参考下“Ximian的Mono项目:.NET for monkeys, penguins, and gnomes.”

责任编辑:炒饭

昨天进行了网报系统的第一次测试,经过上午的准备、下午晚上的测试,终于不负众望挖掘出大量的问题,网报系统的开发还是有问题可挖,有经验可以总结的。大家在愉快的气氛中结束了首轮测试。

首先就测试工作而言,我大概总结了一下,有以下这么几点可以作为经验积累(排名不分先后):

  1. 组织类似活动,维持大家一个轻松乐观的心态是很重要的,尽量让大家觉得这是一件很有趣的事情,同时又避免陷自己于傻瓜的境地;
  2. 能够即时发现问题,善于发现苗头并组织大家找出bug;
  3. 活动时间上的要求,要提得明确;
  4. 及时记录问题,保证最后的文档记录了测试到的问题;
  5. 准备一定要充分。本次测试的准备过程有以下几点就做得不够好:
  • 中午发现网报中的统计查询没有做测试,现补了两个测试用例;
  • 测试开始前,关于tomcat启动时候的大缓存参数没有了解清楚,日志文件怎么样记录没有搞明白;
  • 考试科目生效的静态代码生成没有成功影响了后边的测试进展。

那么总的看来,这次测试是很简单的一次测试,历时只有一天,也没有用写代码,测试只专注于系统的功能能否顺利实现,完全处于模拟用户的出发点。但就测试技术来说:

  1. WEB系统中,并发访问应该作为开发过程中和测试过程中的一个重点,昨天的测试中发现一个很大的问题就是在网报中的查询统计上,用户访问量逐渐增加时,系统无法及时地释放数据库连接资源,最终不单造成tomcat访问出问题,数据库也受到了很大的影响,极大地影响了后边的系统性能;
  2. 非法数据输入一直是问题。个人觉得一个好的程序员写出来的程序应该要考虑到系统会出现的各种问题的,再结合语言和运行环境,是不应该让程序在恶劣的输入或者恶劣的环境下出异常或崩溃掉的。尤其对于和用户交互的这一点上,必须考虑到用户可能给系统的各种输入值,并给以适当的反馈;昨天测试过程中发现效验码生成中大于800时的问题就是在这个方面,发布消息时候不能有单引号也是这样。
  3. 测试人员应该有一定的经验和丰富的想象力,比如说单双引号的问题,比如说半角全角的问题,等等。

最后,总觉得测试的过程中感想很多,但是到了总结的时候却很简单,看来还要很好的整理头脑啊!

2004年07月23日
朋友,你用电脑么?
用电脑你用windows么?
用windows你知道扫雷么?
 
朋友,你玩游戏么?
玩游戏的你玩过扫雷么?
你能把扫雷玩到什么程度?
 
从今天起,我将试着随着我扫雷的经验的不断增长,成绩的不断上升,来介绍我扫雷过程中的一些心得体会。

张艺谋同志再次发挥了他蒙洋人的能力,用强烈的视觉感受刺激观众,同时掺和了一点无间道的成功点,靠着不息血本的花钱制作堆砌亮点,以后再也不看张艺谋的东西了,看就看冯小刚的。