@OverWrite BlogJava

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  128 随笔 :: 0 文章 :: 29 评论 :: 0 Trackbacks

2008年1月17日 #

httpclient已停止维护,其替代产品为 Apache HttpComponents 。 官方声明如下(详细信息点击这里):
The Commons HttpClient project is now end of life, and is no longer being developed. It has been replaced by the Apache HttpComponents project in its HttpClient and HttpCore modules, which offer better performance and more flexibility.

HttpClient 是 Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的
客户端程工具包,并且它支持 HTTP 协议最新的版本和建议。本文首先介绍 HTTPClient,然后根据作者实际工作经验给出了一些常见问题的解决方法。 

所以打算用HttpClient的朋友,可以考虑使用HttpComponents 了。
HttpComponents 入门,笔者认为 iteye上的一篇文章写的不错,大家可以参考 《HttpComponents入门解析》
posted @ 2012-08-12 17:50 vesung 阅读(392) | 评论 (0)编辑 收藏

现在本本屏幕越来越小, 在上面运行eclipse就会显得字体小, 那么如何调整字体大小那?
方法一:
    打开菜单 window->preferences->general->appearance->colors and fonts
打开basec里面的text font 进行编辑会弹出一个字体编辑的窗口, 在里面调整字体即可。

方法二:
    因为eclipse版本众多,所以菜单路径也会有所差异。 还有一种方法可以不用担心不同版本的差异:
    开始先打开菜单 window->preferences   在左上角数据font 回车, eclipse就会自动搜索出可以设置字体的地方了。 接下来打开basec里面的text font 进行编辑会弹出一个字体编辑的窗口, 在里面调整字体即可。 


一点小技巧希望对大家能有所帮助。
posted @ 2012-07-26 14:46 vesung 阅读(43754) | 评论 (1)编辑 收藏

这篇文章在chinaunix上看到,写的很不错。希望能对学习linux的人有所帮助。

随着Linux应用的扩展许多朋友开始接触Linux,根据学习Windwos的经验往往有一些茫然的感觉:不知从何处开始学起。作为一个 Linux系统管理员,我看了许多有关Linux的文档和书籍,并为学习Linux付出了许多艰苦的努力。当真正获得了一份正式的Linux系统管理工作 后,我更加深刻地理解了Linux的灵魂:服务与多用户。Linux系统知识是非常广博的,但是只要掌握了重点知识,管理它并没有想象中的那么可怕。在下 面我会将作为系统管理员的一些工作心得和总结出来的经验系统地介绍给大家。

一、 学习的目的

通过Linux的学习掌握UNIX的目的想必不用多说了,在这个网络人才身价倍增的年代,想靠技术吃饭又不想掌握网络和编程技术是不明智的。当一人第一次 听说Linux并跃跃欲试的时候,总会提出几个?,它是什么(What)? 为什么要用它(Why)? 怎样学习它(How)?做为开放源码运动的主要组成部分,Linux的应用越来越广泛,从我们平时的娱乐、学习,到商业、政府办公,再到大规模计算的应 用。为了满足人们的需求,各种各样的、基于Linux的应用软件层出不穷。只要具备了LinuX的基本功,并具有了自学的能力之后,都可以通过长期的学习 将专项内容予以掌握。

二、 从命令开始从基础开始

常常有些朋友一接触Linux 就是希望构架网站,根本没有想到要先了解一下Linux 的基础。这是相当困难的。虽然Linux桌面应用发展很快,但是命令在Linux中依然有很强的生命力。Linux是一个命令行组成的操作系统,精髓在命 令行,无论图形界面发展到什么水平这个原理是不会变的,Linux命令有许多强大的功能:从简单的磁盘操作、文件存取、到进行复杂的多媒体图象和流媒体文 件的制作。这里笔者把它们中比较重要的和使用频率最多的命令,按照它们在系统中的作用分成几个部分介绍给大家,通过这些基础命令的学习我们可以进一步理解 Linux系统:

●安装和登录命令:login、 shutdown、 halt、 reboot 、mount、umount 、chsh
●文件处理命令:file、 mkdir、 grep、dd、 find、 mv 、ls 、diff、 cat、 ln
●系统管理相关命令: df、 top、 free、 quota 、at、 lp、 adduser、 groupadd kill、 crontab、 tar、 unzip、 gunzip 、last
●网络操作命令:ifconfig、 ip 、ping 、 netstat 、telnet、 ftp、 route、 rlogin rcp 、finger 、mail 、nslookup
●系统安全相关命令: passwd 、su、 umask 、chgrp、 chmod、chown、chattr、sudo、 pswho

三、 选择一本好的Linux书籍

无论在论坛还是读者反馈中,我们看到最多的问题往往是某个新手,在安装或使用linux的过程中遇到一个具体的问题就开始提问,很多都是重复性的问题,甚 至有不少人连基本的问题描述都不是很清楚。这说明很多初学linux的人还没有掌握基本功。怎样才能快速提高掌握linux的基本功呢? 最有效的方法莫过于学习权威的linux工具书,工具书对于学习者而言是相当重要的。一本错误观念的工具书却会让新手整个误入歧途。目前国内关于 linux的书籍有很多不过精品的不多,笔者强烈建议阅读影印本的“o'reilly原版linux图书”,而且出版社还提供了一个非常好的路线图


四 、养成在命令行下工作

一定要养成在命令行下工作的习惯,要知道X-window只是运行在命令行模式下的一个应用程序。在命令行下学习虽然一开始进度较慢,但是熟悉后,您未来 的学习之路将是以指数增加的方式增长的。从网管员来说,命令行实际上就是规则,它总是有效的,同时也是灵活的。即使是通过一条缓慢的调制解调器线路,它也 能操纵几千公里以外地远程系统。

五、用Unix思维思考Linux

由于Linux是参照Unix的思想来设计的,理解和掌握它就必须以Unix的思维来进行,而不能以Windows思维。不可否认,windows 在市场上的成功很大一部分在于技术思想的独到之处。可是这个创新是在面对个人用户的前提下进行的,而面对着企业级的服务应用,它还是有些力不从心。多年来 在计算机操作系统领域一直是二者独大:unix在服务器领域,Windows在个人用户领域。由此可见,用户需求决定了所采用的操作系统。不管什么原因, 如果要学习Linux,那么首先要将思维从Windows的“这个小河” 中拖出来,放入Unix的海洋。

六 、学习shell

对于Shell(中文名称壳),习惯Windows的读者肯定是非常陌生的,因为Windows只有一个“Shell”(如果可以说是Shell的话), 那就是Windows自己。用一句话容易理解的解释就是,shell是用户输入命令与系统解释命令之间的中介。最直观的说法,一种Shell有一套自己的 命令。举一个容易理解的例子,Linux的标准Shel是Bash Shel;Solaris的shell是B shell;Linux的Shell是以命令行的方式表现出来的。读者可能会不理解,Windows从命令行“进化”到了图形界面,那么Linux现在还 使用命令行岂不是一种倒退?

当初我刚刚接触Linux时就曾有过这种想法。可是后来发现,如果使用图形界面,那么分配给应用软件的资源就少了,在价格昂贵的服务器上,能够以较低的硬件配置实现同样的功能是非常重要的。

下面举例说明,一台服务器有1GB内存,假设其中512MB用于处理图形界面,若要安装一个需要784MB内存的数据库软件,惟一的办法就是扩大内存。但 是如果使用命令行,系统可能只需要64MB内存,其它的内存就可以供数据库软件使用了。使用命令行,不仅是内存,而且CPU及硬盘等资源的占用都要节省很 多。所以,作为服务器使用命令行是优点而不是缺点。既然Shell有这么多优点,就必须要学习它。
七、勤于实践

要增加自己Linux 的技能,只有通过实践来实现了。所以,赶快找一部计算机,赶快安装一个 Linux 发行版本,然后进入精彩的Linux世界。相信对于你自己的 Linux 能力必然大有斩获。此外,人脑不像计算机的硬盘一样,除非硬盘坏掉了或者是资料被你抹掉了,否则储存的资料将永远而且立刻的记忆在硬盘中。在人类记忆的曲 线中,你必须要不断的重复练习才会将一件事情记得比较熟。

同样的,学习 Linux 也一样,如果你无法经常学习的话,学了后面的,前面的忘了。你对Linux命令熟悉后你可以开始搭建一个小的Linux网络,这是最好的实践方法。 Linux是网络的代名词,Linux网络服务功能非常强大,不论是邮件服务器、Web服务器、DNS服务器等都非常完善。当然你不需搭建所有服务,可以 慢慢来。需要说明的是这个Linux网络对于初学者有两三台计算机即可。自己多动手,不要非要等着别人帮你解决问题。

八、学会使用文档

和私有操作系统不同,各个Linux的发行版本的技术支持时间都较短,这对于Linux初学者是往往不够的。其实当你安装了一个完整的Linux系统后其 中已经包含了一个强大的帮助,只是可能你还没有发现和使用它们的技巧。主流Linux发行版都自带非常详细的文档(包括手册页和FAQ),从系统安装到系 统安全,针对不同层次的人的详尽文档,仔细阅读文档后40%问题都可在此解决。查阅经典工具书和Howto,特别是Howto是全球数以万计的 Linux、Unix的经验总结非常有参考价值通常40%的问题同样可以解决。安装一个新的软件时先看README,再看INSTALL然后看FAQ,最 后才动手安装,这样遇到问题就知道为什么。如果说明文档不看,结果出了问题再去论坛来找答案反而浪费时间。

当查找文档时, 一定要看文档是在何种版本、何种环境及何种状态下出现的何种结果。对于文档的有效性, 一时还无法在操作前就知道结论如何,那么对某个专题或问题,阅读相关的多篇文章将会节省大量的时间,还可以保证尽量“干净”的环境,有效避免因为不同操作 所造成的更多问题。操作时要仔细核对各个步骤及输出的结果,尽量保持与文档一致。

九、在Linux论坛获取帮助

如果上面的措施没有解决问题,此时你就需要Linux社区的帮助了。需要说明的是你要有周全的思考,准备好你的问题,不要草率的发问,否则只会得到到草率 的回答或者根本得不到任何答案。越表现出在寻求帮助前为解决问题付出的努力,你越能得到实质性的帮助。最好先搜寻一下论坛是否有您需要的文章。这样可以获 得事半功倍的效果。

你需要提供精确有效的信息。这并不是要求你简单的把成吨的出错代码或者数据完全转储摘录到你的提问中。如果你有庞大而复杂的测试条件,尽量把它剪裁得越小 越好。可能你会遇到这种情况,对于一个问题会出现不同内容回答,这时你需要通过实践来验证。另外把这个问题放在其他Linux社区请求帮助也是一种选择。 如果得不到答案,请不要以为我们觉得无法帮助你。有时只是看到你问题的人不知道答案罢了。这时换一个社区是不错的选择。

十、学习专业英文

如果你想深入学习Linux,看不懂因为文档实在是太难了。写的最好的,最全面的文档都是英语写的,最先发布的技术信息也都是用英语写的。即便是非英语国家的人发布技术文档,也都首先翻译成英语在国际学术杂志和网络上发表。

通过man、info等命令,可以从在线帮助中快速地获得所需要的命令和操作方法。不要害怕海量的系统帮助,仔细阅读几个man或info文档就会发现, 这些帮助几乎都按照固定格式写成一命令名称、参数、参数说明、使用例子、参考等。当英语成为一种习惯,就会自觉地查找或订阅互联网上感兴趣的英文材料。这 样,在不知不觉中就已经和世界同步。

十一、在社区共享你的经验

随着Linux应用的扩展,出现了不少Linux社区。其中有一些非常优秀的社区:水木清华、其中有一些非常优秀的社区:www.linuxforum.net(国内最高水平GNU站点)、http://www.chinaunix.net/ (中国最大的Unix技术社区),随着知识的不断积累,就可以把自己动手解决一些前人没有遇到的问题写出文档在网络上共享给其他读者。这个时候,也就成为 了一名“高手”。Linux的使用者一般都是专业人士,他们有着很好的电脑背景且愿意协助他人,Linux高手更具有鼓励新手的文化精神。

最后是一个笔者的Linux学习的路线图(roadmap):

●了解Linux 的基础知识,这些包含了用户管理、群组的概念、权限的观念等;
●掌握至少50个以上的常用命令;
●掌握.tgz、.rpm等软件包的常用安装方法
●学习添加外设,安装设备驱动程序(比如网卡)
●熟悉Linux文件系统 和目录结构。
●掌握vi,gcc,gdb等常用编辑器,编译器,调试器 。
●理解shell别名、管道、I/O重定向、输入和输出以及shell脚本编程。
●网络的基础包括: 掌握路由概念、OSI七层网络模型、TCP/IP模型及相关服务对应的层次对于Linux学习非常重要的。然后学习Linux环境下的组网。
posted @ 2008-07-31 17:49 vesung 阅读(387) | 评论 (0)编辑 收藏

国外开发者博客中有一篇有趣的文章,将程序员按水平像软件版本号那样划分为不同的版本。相对于在招聘时分为初级,中级,高级程序员,直接表明需要某种语言N版本的程序员或许更方便直接。根据作者的观点,可将WEB开发者大致分为以下几个版本:

Alpha:阅读过一些专业书籍,大多数能用Dreamweaver或者FrontPage帮朋友制作一些Web页面。但在他们熟练掌握HTML代码以前,你大概不会雇佣他们成为职业的WEB制作人员。

Beta:已经比较擅长整合站点页面了,在HTML技巧方面也有一定造诣,但还是用Tables来制作页面,不了解CSS,在面对动态页面或数据库连接时还是底气不足。

Pre Version 1 (0.1):比Beta版的开发者水平要高。熟悉HTML,开始了解CSS是如何运作的,懂一点JavaScript,但还是基于业余水准,逐步开始关心动态站点搭建和数据库连接的知识。这个版本的WEB开发人员还远不能成为雇主眼中的香饽饽。

1.0: 能够基本把控整个站点开发,针对每个问题尽可能的找到最直接的解决办法。但对可测性,可扩展性以及在不同(层)框架下如何选择最合适的WEB设计工具尚无概念。这个版本的WEB开发者有良好的技术基础,需要有进一步的帮助和指导。

 

2.0:懂面向对象的编程语言,理解分层开发的必要性,关注代码分离,对问题寻找更完美的解决方法,偶然也会考虑设计模式的问题,但对此仍然概念不清。属于优秀的初级开发者,能完成较松散的代码开发(相对大型严谨的站点开发而言),在面对较复杂问题寻找解决办法时需要周边人的帮助。

3.0:开始较为深入的理解面向对象编程和设计模式,了解他们的用途,当看到好的设计模式时能看透其本质,逐步关注分层的架构解决办法和可测试性。理解不同的开发语言并能说出他们的异同(例如各自的优势)。属于优秀的中级别开发者,雇主也确信他们最终能找到问题的解决办法,这个版本的人可以给1.0和2.0的开发者以指导。但他们对架构的理解仍然不够清晰,值得一提的是,只要给予一些指导,他们能很快理解并熟记做出的决定,以及选定方案的优势所在。

4.0:理解模式,重视用户的反馈。着手研究方法论,架构设计和软件开发的最佳入口。头脑中已经形成了超越开发语言,技术架构的整体方案,可根据需求解构程序。能从理论的角度,不同模式如何融合成最佳形态,将多种X-驱动的模式应用到不同的方案中。是精通多语言的高手,理解不同系统和方法论的细微差别,属于高级程序员。这个级别的人能够轻易的辅导2.0和3.0的程序员,将他们推向更高的级别。

5.0:从系统的角度考虑问题。对各种系统结构有深入研究,能对整个代码架构中的问题进行改进。在团队粘合性以及代码安全性方面有杰出贡献。对1.0到4.0版本的开发人员出现的问题能及时察觉,让整个团队保持积极性且保持兴奋的状态创建软件解决办法。举例来说,他们总是对新的技术和信息保持饥渴状态,试图用最简便的方案解决开发任务。在整个IT团队中获得信任,属于高级程序员和架构师。

那么,您属于哪个版本的程序员呢?

posted @ 2008-06-29 23:28 vesung 阅读(619) | 评论 (1)编辑 收藏

中国互联网审查制度的不透明一直为人所诟病。现在还不清楚56.com是因为什么开罪了监管机构,也不知道该网站会关闭多久。这些疑问也表明笼罩整个中国互联网视频领域的风险,即使是那些有明智投资方支持的大型互联网公司也面临着同样的问题。该网站至少募集了3,000万美元资金,投资方中包括风险投资巨头Sequoia Capita和华特•迪斯尼(Walt Disney Co.)旗下的Steamboat Ventures。

网络视频主管部门之一的中国国家广电总局(SARFT)没有回复记者就56.com问题的采访申请。该网站首席财务长张福兴(Jay Chang)拒绝发表评论,其投资方的人士也拒绝置评。

看来清理行动开始下狠手了。
posted @ 2008-06-23 08:54 vesung 阅读(343) | 评论 (0)编辑 收藏

不说废话了,直接看代码:
页面:
<html>
<head>
<script type='text/javascript' src='jquery.js'></script>
<script type='text/javascript'>
//js代码1
<script>

<body>
<table>
 
<tr>
  
<td>级联菜单</td>
  
<td>
    
<select name='city' class='amenu'>
     
<option value=''>-市局全部-</option>
     
<option value='1'>a市</option>
     
<option value='2'>b市</option>
     
<option value='3'>c市</option>
    
</select>
  
</td>
  
<td>
    
<select name='country' class='amenu'>
     
<option value=''>-县局全部-</option>
     
<option value='1'>test</option>
    
</select>
  
</td>
  
<td>
    
<select name='taxOffice' class='amenu'>
     
<option value=''>-所全部-</option>
     
<option value='1'>test</option>    
    
</select>
  
</td>
  
<td>
    
<select name='taxOffical' class='amenu'>
     
<option value=''>-职员全部-</option>
     
<option value='1'>test</option>    
    
</select>
  
</td>
 
</tr>
</table>
</body>

对应的js代码:
js代码1:
//本菜单是4级级联菜单,采用jquery框架来实现
$(document).ready(function(){
 
//为所有class为amenu的元素绑定onchange事件
 $('.amenu').change(function(){
  
//记录本级菜单标志
  var orgLevel = this.name;
  
//下级菜单
  var nextMenu = $(this).parents().next().children[0];
  
//ajax动作提交的对象(后台采用java程序)
  var postUrl = 'pubOrgAjax.do';

  
//如果本菜单是最后一级菜单的话则不做任何动作
  if(orgLevel=='taxOffical') return true;
  
//本级菜单选择为全部选项,则下级菜单也置为全部
  if(this.value == ''){
   
var firstOption = nextMenu.option[0];
   nextMenu.length
=0;
   nextMenu.options.add(firstOption);
   
return true;
  }


  
//ajax动作
  $.post(postUrl,{orgFlag:orgLevel,orgCode:this.value},function(xml){
    
var dicts = $('dict',xml);
    
if(dicts.length<1){alert('返回数据错误,请重新登陆');return false;}
    
//清空nextMenu
    if(nextMenu.options[0].value == ''){
      
var firstOption = nextMenu.options[0].text;
      nextMenu.length 
= 0;
      nextMenu.options.add(
new Option(firstOption,''));
    }
else{
      nextMenu.length 
= 0;
    }

    
//为清空后的nextMenu填充新值
    for(var i=0;i<dicts.length;i++){
      
var newOption = new Option($('name',dicts[i]).text(),$('code',dicts[i]).text());
      nextMenu.options.add(newOption);
    }

    
  }
);
  
 }
);
}
);

后台返回的数据格式:
<?xml version="1.0" cencodeing="gbk"?>
<ajax-response>
<response>
 
<dict>
    
<code>1</code>
    
<name>市局1</name>
 
</dict>
 
<dict>
 
 
</dict>

 
</response>
</ajax-respnse>

posted @ 2008-06-12 09:44 vesung 阅读(9831) | 评论 (5)编辑 收藏

Yahoo本周发表研发一年的Yahoo!BrowserPlus预览版,这是一个用来延伸网络应用的平台,开发人员可透过该平台结合桌面程序,而用户只要透过浏览器就能执行利用该平台开发的网络应用。

现阶段BrowserPlus平台所提供的功能包括自桌面拖曳、客户端的图像处理,以及桌面通知工具等。Yahoo指出,BrowserPlus的最大特色就是可以直接新增或更新服务而不用重新启动浏览器,甚至不需重新下载网页,对使用者而言,这代表在执行这些新应用时不用进行安装或受到其他干扰;开发人员则能透过单一的功能呼叫检视或启动新服务。

Yahoo展示了基于BrowserPlus所设计的应用范例,其中一个为照片上传工具Photo Uploader,该工具参考了Flickr Uploader桌面应用程序的功能,用户可以透过浏览器,从桌面上拖曳照片,并进行诸如旋转、改变大小以及特效等简单的编辑功能。

BrowserPlus属于近来风行的丰富网络应用程序(RIA)平台,Yahoo利用该平台替开发人员处理了复杂的软件发表及更新功能,让开发人员及使用者皆能从中受益。

Yahoo目前仅允许Yahoo及其合作伙伴使用BrowserPlus,预计在公开版本发表后才会供其他开发人员使用。现阶段BrowserPlus支持Windows XP及Mac OS X等操作系统,以及IE、Firefox及Safari等浏览器,未来将支持更多的平台。

Yahoo指出,Yahoo致力于开发开放的平台,其中一项重点是提供开发人员用来开发内容的客户端工具,Yahoo先前已释出Yahoo用户接口链接库(Yahoo!User Interface Library,YUI)开放源码计划,BrowserPlus则是提供以浏览器为基础的网站开发解决方案,该平台之后也将朝开放的目标前进。

丰富网络应用程序平台成为各大业者争相竞逐的领域,市场上类似的平台还包括微软发表的Silverlight、Adobe的AIR,以及Mozilla基金会所开发的Prism等

posted @ 2008-06-05 08:50 vesung 阅读(415) | 评论 (0)编辑 收藏

(转载)
2007年6月项目准备开始了,刚来到一个新的项目组,什么都是新的,除了我自己。

需要一个新的框架来开发项目,香港的同事决定使用Dojo,DWR, 我开始学习使用dojo,时间很短,但是我还是基本上熟悉了dojo的基本控件和架构。在此基础上搭建起了项目的基本框架。这是一个单页面,基于ajax和dojo widget的系统,一切都那么的新奇,又充满挑战,但是既然dojo有这么多后台,又有香港同事的推荐,我显得自信满满。

框架搭建的同事,也开始后了紧锣密鼓的招兵买马,一起都像是从零开始。陆陆续续,招了5个程序员和一个测试员。开始了整个项目的快速开发,由于需求由香港负责,而且需求做的比较细致,基本上问题很少。Dojo 却是麻烦不断。

首先的一个坏消息是当我们做完了几乎全部300个页面的时候,dojo宣布0.43不在得到支持,取而代之是完全不同的dojo0.9。 而且dojo0.9 还不是稳定的版本,问题多多,让我们骑虎难下,最后还是决定按兵不动。 随之而来,是dojo1.0,dojo1.1 的陆续发布,但是一直都无法让我看到希望的曙光。 与之相对的是ext在国内的广泛使用和热烈追捧。

Dojo 的控件有很多奇怪的地方,日期选择控件的行为非常怪异,与国内的使用习惯很不相同。而且样式极其丑陋,当字体放大缩小的时候更是丑陋。显示的格式和保存的格式需要分别指定。我们修改了大量的代码。

dojo 的下拉框也被用户投诉,过滤之后一定要再选择一次或者按回车才能选定结果,前台值和后台值分开操作也带来很多不变。

dojo 的验证文本框颜色现实有bug,我们不得不修改代码

dojo的对话框也有问题,对话框中无法在弹出对话框。对话框的操作和控制很不灵活。

js代码不利于管理,容易发生命名冲突。

 

致命的问题发生在项目的后期,在客户的系统进行测试时发现。dojo的性能非常差,在赛扬2G的电脑上,一个页面显示的时间竟然需要17秒。简直就是噩梦。

另外使用dojo的对话框时出现cpu占用100%而且一直不回落下来。

页面载入完成的时候,它有将整个页面重新刷新一次,又需要花费额外的5到8s时间,不仅花费更多的时间,而且严重影响客户体验。

 

还有开发过程中碰到的无数问题,虽然一个一个被解决,但是无疑是一次一次痛苦的煎熬。

 

最后,在性能面前,我被dojo彻底打败,如此的速度是任何客户都无法忍受的,客户不可能为了这个系统全部升级电脑cpu。而且还有很多未知的问题可能还没有被发觉,不如内存泄露,可能导致资源耗尽,内存耗尽。cpu 的占用可能在使用时间长了之后越来越高,等等,这些都是我担心的问题。

 

使用Ajax或者说Rich client,一定要谨慎啊。使用新的技术和框架,一定要谨慎,这是我的教训,希望给同行们一个参考。

posted @ 2008-06-04 11:32 vesung 阅读(2087) | 评论 (2)编辑 收藏

看两段代码:
import java.util.ArrayList;   
import java.util.List;   
  
public class TailRecursionTest {   
    
public static void main(String[] args) {   
        TailRecursionTest t 
= new TailRecursionTest();   
        
for (int i = 0; i < 10000; i++)   
            t.a(
0);   
    }
   
  
    
public void a(int j) {   
        j
++;   
        List list 
= new ArrayList<Integer>(100000);   
        
// 对list进行处理   
    }
   
}

没啥特殊的,仅仅是为了测试,我们将a方法调用10000次,a方法创建一个有100000个元素的list的局部变量。
第二个程序:
import java.util.ArrayList;   
import java.util.List;   
  
public class TailRecursionTest2 {   
    
public static void main(String[] args) {   
        TailRecursionTest2 t 
= new TailRecursionTest2();   
        t.a(
0);   
    }
   
  
    
public void a(int j) {   
        System.out.println(j);   
        j
++;   
        
if (j == 10000)   
            
return;   
        List list 
= new ArrayList<Integer>(100000);   
        
// 对list进行处理   
        a(j);   
    }
   
}
  

也没啥特殊的,就是将循环换成了递归,a方法做的事情没变。两个都跑一下,程序1顺利结束,程序2出问题了,啥问题?如下:
161  
162  
163  
164  
165  
Exception in thread 
"main" java.lang.OutOfMemoryError: Java heap space   
    at java.util.ArrayList.
<init>(Unknown Source)   
    at TailRecursionTest2.a(TailRecursionTest2.java:
17)   
    at TailRecursionTest2.a(TailRecursionTest2.java:
20)   
    at TailRecursionTest2.a(TailRecursionTest2.java:
20)   
    at TailRecursionTest2.a(TailRecursionTest2.java:
20)   
    at TailRecursionTest2.a(TailRecursionTest2.java:
20

我倒,才运行166次了,heap就满了。问题在哪呢?oh,yep,你肯定想到了,是不是重复创建list这个大集合引起的呢?它不是局部变量吗?怎么也会溢出?是的,list是局部变量,在a的方法栈里引用着,指向heap上的大对象,更关键的问题在于,java是没有尾递归优化的,递归方法是不会使用同一个栈帧,每一次递归调用,都将压入新的栈帧,并且这个栈帧上又new了一个list变量,引用着heap上新的一个大集合。随着栈深度的增加, jvm里维持着一条长长的方法调用轨迹以便你能回来,在方法没有返回之前,这些list变量一直被各自的栈帧引用着,不能被GC,你说,能不OOM吗?

    也许,你想到了个补救方法来挽救程序2,就是每次在处理完list后,我把它设置为null,不让栈帧继续引用着它,咱编写对gc友好的代码,这不就行了,试试:


import java.util.ArrayList;   
import java.util.List;   
  
public class TailRecursionTest2 {   
    
public static void main(String[] args) {   
        TailRecursionTest2 t 
= new TailRecursionTest2();   
        t.a(
0);   
    }
   
  
    
public void a(int j) {   
        System.out.println(j);   
        j
++;   
        
if (j == 10000)   
            
return;   
        List list 
= new ArrayList<Integer>(100000);   
        
// 对list进行处理   
        list = null;  //gc友好   
        a(j);   
    }
   
}
 

得意洋洋,我跑一下看看,这次跑到4000多次,但是:
   
4289  
4290  
4291  
4292  
java.lang.StackOverflowError   
    at sun.nio.cs.ext.DoubleByteEncoder.encodeArrayLoop(Unknown Source)   
    at sun.nio.cs.ext.DoubleByteEncoder.encodeLoop(Unknown Source)   
    at java.nio.charset.CharsetEncoder.encode(Unknown Source) 

总结:在java里,递归最好咱还是别用,老老实实地while、for;就算递归了,最好递归方法不要new太大的对象,除非你能确定递归的深度不是那么大,否则OOM和堆栈溢出的阴影将笼罩着你。
posted @ 2008-06-03 09:14 vesung 阅读(1554) | 评论 (0)编辑 收藏

先看下面表格:

作用域
当前类 同一package 子孙类
其他package
public √   
√   
√   
√   
protected
√   
√   
√   
  × 
default √   
√   
  × 
  × 
private √   
  × 
  × 
  × 

不写时默认为default

我们先看类:

public class  Test 可以在任何地方访问,无论是否为当前package
class Test 只允许当前的package使用,不允许其它package使用
class 不与许prirvate和protected ,所以不讨论了

我们再看方法
private 的只允许类自己使用,子类都不可见。但允许inner类调用,因为inner类属于他自己。

class Test 里面的方法
  public 和default和protected 方法,允许同包的访问,因为类是default的,所以方法不可能大于它

public class Test 里面的方法
  private 只允许自己内部访问
 default 只允许同包的访问
  protected 只允许同包和子类访问
  public 可以任意访问
posted @ 2008-06-02 09:12 vesung 阅读(872) | 评论 (0)编辑 收藏

     摘要:   默认的序列化机制并不难操纵。然而,假若有特殊要求又该怎么办呢?我们可能有特殊的安全问题,不希望对象的某一部分序列化;或者某一个子对象完全不必序列化,因为对象恢复以后,那一部分需要重新创建。 此时,通过实现Externalizable接口,用它代替Serializable接口,便可控制序列化的具体过程。这个Externalizable接口扩展了Serializable,并增添了两个...  阅读全文
posted @ 2008-05-28 12:00 vesung 阅读(671) | 评论 (0)编辑 收藏

JNDI是J2EE中一个很重要的标准,通常我们是在EJB编程中用到, 
Tomcat4.0中提供了在JSP和Servelt中直接使用JNDI的方法,下面谈一下在Tomcat4.0中配置和使用JNDI的方法 
(以通过JNDI连接数据库为例) 
假设使用的数据库是mysql,实验例子在TOMCAT_HOME/webapps/DBTest目录中 

A.将mysql的JDBC连接库mm.mysql-2.0.9-bin.jar放入TOMCAT_HOME/common/lib中 

B.配置TOMCAT_HOME/conf/serer.xml文件在<Service>;段中加入一个Context: 
<Context path="/DBTest" docBase="DBTest" 
debug="5" reloadable="true" crossContext="true"> 
</Context> 
这是DBTest的根路径,这是为了在DBTest中使用做准备. 

C.在上面加入的<Context>;段加入 
<Resource name="jdbc/TestDB" 
auth="Container" 
type="javax.sql.DataSource"/> 

<ResourceParams name="jdbc/TestDB">
<parameter> 
<name>;factory</name> 
<value>;org.apache.commons.dbcp.BasicDataSourceFactory</value> 
</parameter> 

<!-- Maximum number of dB connections in pool. Make sure you 
configure your mysqld max_connections large enough to handle 
all of your db connections. Set to 0 for no limit. 
--> 
<parameter>
<name>;maxActive</name>
<value>;100</value>
</parameter>

<!-- Maximum number of idle dB connections to retain in pool. 
Set to 0 for no limit. 
-->
<parameter> 
<name>;maxIdle</name> 
<value>;30</value> 
</parameter> 

<!-- Maximum time to wait for a dB connection to become available 
in ms, in this example 10 seconds. An Exception is thrown if 
this timeout is exceeded. Set to -1 to wait indefinitely. 
--> 
<parameter> 
<name>;maxWait</name> 
<value>;10000</value> 
</parameter> 

<!-- MySQL dB username and password for dB connections --> 
<parameter> 
<name>;username</name>; 
<value>;test</value> 
</parameter> 
<parameter> 
<name>;password</name> 
<value>;test</value> 
</parameter> 

<!-- Class name for mm.mysql JDBC driver -->; 
<parameter>; 
<name>;driverClassName</name>; 
<value>;org.gjt.mm.mysql.Driver</value> 
</parameter> 

<!-- The JDBC connection url for connecting to your MySQL dB.--> 
<parameter> 
<name>;url</name> 
<value>;jdbc:mysql://localhost:3306/test</value> 
</parameter> 
</ResourceParams> 

这里每一个小段都有英文注解,是Tomcat提供的,我们可以将按照Sample加入,主要修改的是driverClassName, 
url,和用户帐号;需要强调的是"jdbc/TestDB"就是JDNI要查找的Name.

在web.xml中加入 
<resource-ref> 
<description>;DB Connection</description> 
<res-ref-name>;jdbc/TestDB</res-ref-name> 
<res-type>;javax.sql.DataSource</res-type> 
<res-auth>;Container</res-auth> 
</resource-ref> 
这里的jdbc/TestDb要和C中Resource段的name匹配 

posted @ 2008-04-25 09:02 vesung 阅读(426) | 评论 (0)编辑 收藏

一、DataSource接口是一个更好的连接数据源的方法:
  JDBC1.0是原来是用DriverManager类来产生一个对数据源的连接。JDBC2.0用一种替代的方法,使用DataSource的实现,代码变的更小巧精致,也更容易控制。
  一个DataSource对象代表了一个真正的数据源。根据DataSource的实现方法,数据源既可以是从关系数据库,也电子表格,还可以是一个表格形式的文件。当一个DataSource对象注册到名字服务中,应用程序就可以通过名字服务获得DataSource对象,并用它来产生一个与DataSource代表的数据源之间的连接。
  关于数据源的信息和如何来定位数据源,例如数据库服务器的名字,在哪台机器上,端口号等等,都包含在DataSource对象的属性里面去了。这样,对应用程序的设计来说是更方便了,因为并不需要硬性的把驱动的名字写死到程序里面去。通常驱动名字中都包含了驱动提供商的名字,而在DriverManager类中通常是这么做的。如果数据源要移植到另一个数据库驱动中,代码也很容易做修改。所需要做的修改只是更改DataSource的相关的属性。而使用DataSource对象的代码不需要做任何改动。
  由系统管理员或者有相应权限的人来配置DataSource对象。配置DataSource,包括设定DataSource的属性,然后将它注册到JNDI名字服务中去。在注册DataSource对象的的过程中,系统管理员需要把DataSource对象和一个逻辑名字关联起来。名字可以是任意的,通常取成能代表数据源并且容易记住的名字。在下面的例子中,名字起为:InventoryDB,按照惯例,逻辑名字通常都在jdbc的子上下文中。这样,逻辑名字的全名就是:jdbc/ InventoryDB。
  一旦配置好了数据源对象,应用程序设计者就可以用它来产生一个与数据源的连接。下面的代码片段示例了如何用JNDI上下文获得一个一个数据源对象,然后如何用数据源对象产生一个与数据源的连接。开始的两行用的是JNDI API,第三行用的才是JDBC的API:
   Context ctx = new InitialContext(); DataSource ds = (DataSource)ctx.lookup("jdbc/InventoryDB");Connection con = ds.getConnection("myPassword", "myUserName");
  在一个基本的DataSource实现中,DataSource.getConnection方法返回的Connection对象和用DriverManager.getConnection方法返回的Connection对象是一样的。因为DataSource提供的方便性,我们推荐使用DataSource对象来得到一个Connection对象。我们希望所以的基于JDBC2.0技术的数据库驱动都包含一个基本的DataSource的实现,这样就可以在应用程序中很容易的使用它。
  对于普通的应用程序设计者,是否使用DataSource对象只是一个选择问题。但是,对于那些需要用的连接池或者分布式的事务的应用程序设计者来说,就必须使用DataSource对象来获得Connection,原因在下面我们会提到。
   二、Connection pooling(连接池):
  连接池是这么一种机制,当应用程序关闭一个Connection的时候,这个连接被回收,而不是被destroy,因为建立一个连接是一个很费资源的操作。如果能把回收的连接重新利用,会减少新创建连接的数目,显著的提高运行的性能。
  假设应用程序需要建立到一个名字为EmpolyeeDB的DataSource的连接。使用连接池得到连接的代码如下:
   Context ctx = new InitialContext(); DataSource ds = (DataSource)ctx.lookup("jdbc/EmployeeDB");Connection con = ds.getConnection("myPassword", "myUserName");除了逻辑名字以外,我们发现其代码和上面举的例子的代码是一样的。逻辑名字不同,就可以连接到不同的数据库。DataSource对象的getConnection方法返回的Connection是否是一个连接池中的连接完全取决于DataSource对象的实现方法。如果DataSource对象实现与一个支持连接池的中间层的服务器一起工作,DataSource对象就会自动的返回连接池中的连接,这个连接也是可以重复利用的。
  是否使用连接池获得一个连接,在应用程序的代码上是看不出不同的。在使用这个Connection连接上也没有什么不一样的地方,唯一的不同是在java的finally语句块中来关闭一个连接。在finally中关闭连接是一个好的编程习惯。这样,即使方法抛出异常,Connection也会被关闭并回收到连接池中去。代码应该如下所示:
  try{…
  }catch(){…
  }finally{ if(con!=null)con.close();}
  三、分布式事务:
  获得一个用来支持分布式事务的连接与获得连接池中的连接是很相似的。同样,不同之处在于DataSource的实现上的不同,而不是在应用程序中获得连接的方式上有什么不同。假设DataSource的实现可以与支持分布式事务中间层服务器一起工作,得到连接的代码还是如下所示:
   Context ctx = new InitialContext(); DataSource ds = (DataSource)ctx.lookup("jdbc/EmployeeDB"); Connection con = ds.getConnection("myPassword", "myUserName");由于性能上的原因,如果一个DataSource能够支持分布式的事务,它同样也可以支持连接池管理。
  从应用程序设计者的观点来看。是否支持分布式的事务的连接对它来说没什么不同,唯一的不同是在事务的边界上(开始一个事务的地方和结束一个事务的地方),开始一个事务或者结束一个事务都是由事务服务器来控制的。应用程序不应该做任何可能妨碍服务的事情。应用程序不能够直接调用事务提交commit或者回滚rollback操作,也不能够使用事务的自动提交模式auto-commit mode(在数据库操作完成的时候自动的调用commit或者rollback)。 
 
在一个连接参与了分布式事务的时候,下面的代码是你不能做的(con表示支持分布式事务的连接Connection)。
  con.commit();或者con.rollback();或者con.setAutoCommit(true);对于通常的Connection来说,缺省的是auto-commit模式。而对于支持分布式事务的Connection来说,缺省不是auto-commit模式。注意,即使Connection是支持事务的,它也可以用于没有事务的情况。关于事务边界的限制只是是对分布式事务的情况下才成立的。
  配置支持连接池的DataSource的时候,涉及到配置ConnectionPoolDataSource对象,这个对象是三层体系结构中的中间层来管理连接池的。同样的,在配置支持分布式事务的时候,需要配置XADataSource,XADataSource是中间层用来管理分布式事物的对象。ConnectionPoolDataSource和XADataSource是由驱动提供商提供的,对应用程序的设计者来说是透明的。和基本的DataSource一样,系统管理员来配置ConnectionPoolDataSource和XADataSource对象。
  四、结果集(RowSet接口):
  结果集对象是一行行数据的容器。根据其目的,可以通过多种方法实现。RowSet及其相关的接口与JDBC2.0的标准扩展API有点不同,他们并不是驱动的一部分,RowSet是在驱动的上层实现的,可以由其它的任何人来实现他们。
  任何类型的rowset都实现了RowSet接口,RowSet接口扩展了ResultSet接口。这样RowSet对象就有了ResultSet对象所有的功能。能够通过getXXX方法得到数据库中的某列值,通过updateXXX方法可以修改某列值,可以移动光标,是当前行变为另一行。
  当然,我们更感兴趣的是RowSet接口提供的新的功能。作为一个JavaBean组件,RowSet对象可以增加或者删除一个listener(监听者),可以get或者set其属性值,这些属性中,有一个是字符串,表示一个对数据库Query请求,RowSet接口定义了设定参数的方法,也提供了执行这个请求的方法。这意味着RowSet对象能够执行查询请求,可以根据它产生的结果集进行计算。同样,RowSet也可以根据任何表格数据源进行计算,所以,它不局限于关系数据库。
  从数据源得到数据之后,RowSet对象可以和数据源断开连接,rowset也可以被序列化。这样,RowSet就可以通过网络传递给瘦客户端。
  RowSet可以被重新连接到数据源,这样,做的修改就可以存回到数据源中去。如果产生了一个listener,当RowSet的当前行移动,或者数据被修改的时候,监听者就会收到通知。例如,图形用户界面组件可以注册成为监听者,当RowSet更改的时候,图形用户界面接到通知,就可以修改界面,来符合它所表示的RowSet。
  根据不同的需要,RowSet接口可以通过多种方法来实现。Java software已经写了一个CachedRowSet实现,从http://developer.java.sun.com/developer/earlyAccess/crs/index.html中可以得到这个实现。
  与CachedRowSet类不样的是,JDBCRowSet类总是保持一个和数据源的连接。这样,在ResultSet外围简单到加了一层,是基于JDBC技术的驱动看起来象是一个简单的JavaBean组件一样。

  总结:JDBC2.0标准扩展API通过见DataSource注册到JNDI名字服务上,将JDBC技术扩展为一个全新的概念。使应用程序的代码更加精巧,易于控制。新的API支持了连接池,支持分布式的事务。最后,还使java应用程序可以在网络上传播结果集,是不可以滚动的ResultSet变成了可以滚动的RowSet。
posted @ 2008-04-21 08:58 vesung 阅读(3249) | 评论 (0)编辑 收藏

JDBC 2.0 API被划分为两部分:JDBC 2.0核心API和JDBC 2.0标准扩展API。核心API在java.sql里面。这是原来的版本就实现了的基本的功能。标准扩展API在javax.sql里面。由JDBC2.0规范新规定的一些接口在这里面。当然,JDBC2.0也对原来版本的java.sql核心做了一些改动。不过不是很大。原来JDBC1.0的程序可以不加修改的在JDBC2.0上运行。这是Java的一贯的良好的作风。最新的JDBC包可以从sun公司的网站上下载。 
  JDBC2.0的扩展API增加了一些数据访问和数据源访问的重大的功能。这中间有一些是主要用来做企业计算的。用JDBC2.0的新的扩展包,JDBC提供了一个从JAVA2平台的通用的数据访问的方法。
  首先,我们来看看JDBC标准扩展的API怎样来和JDBC2.0结合在一起的。JDBC2.0包括两个包:
  1、 java.sql包,个包里面是JDBC2.0的核心API。它包括了原来的JDBC API(JDBC 1.0版本),再加上一些新的2.0版本的API。这个包在Java 2 Platform SDK里面有。
  2、 javax.sql包,这里面是JDBC2.0的标准扩展API。这个包是一个全新的,在Java 2 Platform SDK, Enterprise Edition里面单独提供。
  JDBC2.0的核心API包括了JDBC1.0的API,并在此基础上增加了一些功能,对某些性能做了增强。使java语言在数据库计算的前端提供了统一的数据访问方法,效率也得到了提高。
  JDBC是向后兼容的,JDBC1.0的程序可以不加修改的运行在JDBC2.0上。但是,假如程序中用到了JDBC2.0的新特性,就必须要运行在JDBC2.0版本上。
  概括的来说,JDBC核心API的新特性在两个方面做了工作。一个是支持一些新的功能,另一个就是支持SQL3的数据类型。
  1、 在支持新功能方面:包括结果集可以向后滚动,批量的更新数据。另外,还提供了UNICODE字符集的字符流操作。
  2、 在支持SQL3的数据类型方面:包括新的SQL3数据类型,增加了对持久性对象的存贮。
  为了对数据的存取,操作更加方便,JDBC的新特性是应用程序的设计更容易了。例如:数据块的操作能够显著的提高数据库访问的性能。新增加的BLOB, CLOB,和数组接口能够是应用程序操作大块的数据类型,而不必客户端在存贮之前进行其它的处理。这样,就显著的提高了内存的使用效率。
   下面我们来介绍JDBC2.0的标准扩展API。标准扩展API分为如下几个方面:
  1、 DataSource接口:和Java名字目录服务(JNDI)一起工作的数据源接口。它提供了对数 吹囊恢指玫牧臃椒ā?br>;  2、 Connection pooling(连接池):可以重复使用连接,而不是对每个请求都使用一个新的连接。
  3、 Distrubute transaction(分布式的事务):在一个事务中涉及到了多个数据库服务器。
  4、 Rowsets:JavaBean组件包含了结果集,主要用来将数据传给瘦客户,或者提供一个可以滚动的结果集。
posted @ 2008-04-10 11:29 vesung 阅读(705) | 评论 (0)编辑 收藏

1.$("#idName")
    获取元素id为idName的元素 
 如:html
<a id="myLinck" href="#"></a>
$("#myLinck") 会返回<a id="myLinck"></a>元素
-----------------------------------
2.$(".className")
    获取元素class属性为className的元素集合
如:html
<a class="a1" href="#">1</a>
<a class="a1" href="#">2</a>
<a class="a2" href="#">3</a>
$(".a1")返回[<a class="a1" href="#">1</a>,<a class="a1" href="#">2</a>]
---------------------------------------
3.$("input[@type='text']")
    获取所有type=text的input元素
如:html
<input type='text'/>
<input type='text/>
<input type='checkbox'/>
$("input[@type='text']")返回[<input type='text'/><input type='text/>]
posted @ 2008-03-24 17:53 vesung 阅读(535) | 评论 (0)编辑 收藏

普通的dom对象一般可以通过$()转换成jquery对象。
如:$(document.getElementById("msg"))则为jquery对象,可以使用jquery的方法。
由于jquery对象本身是一个集合。所以如果jquery对象要转换为dom对象则必须取出其中的某一项,一般可通过索引取出。
如:$("#msg")[0],$("div").eq(1)[0],$("div").get()[1],$("td")[5]这些都是dom对象,可以使用dom中的方法,但不能再使用Jquery的方法。
以下几种写法都是正确的: 字串8

$("#msg").html();
$("#msg")[0].innerHTML;
$("#msg").eq(0)[0].innerHTML;
$("#msg").get(0).innerHTML;

posted @ 2008-03-24 17:38 vesung 阅读(691) | 评论 (0)编辑 收藏

为了支持 AJAX 功能。这个包定义了 Ajax.Request 类。

假如你有一个应用程序可以通过url http://yoursever/app/get_sales?empID=1234&year=1998与服务器通信。它返回下面这样的XML 响应。

 

 

<?xml version="1.0" encoding="utf-8" ?>
<ajax-response>
    
<response type="object" id="productDetails">
        
<monthly-sales>
            
<employee-sales>
                
<employee-id>1234</employee-id>
                
<year-month>1998-01</year-month>
                
<sales>$8,115.36</sales>
            
</employee-sales>
            
<employee-sales>
                
<employee-id>1234</employee-id>
                
<year-month>1998-02</year-month>
                
<sales>$11,147.51</sales>
            
</employee-sales>
        
</monthly-sales>
    
</response>
</ajax-response>

 

Ajax.Request对象和服务器通信并且得到这段XML是非常简单的。下面的例子演示了它是如何完成的。

 

<script>
    
function searchSales()
    
{
        
var empID = $F('lstEmployees');
        
var y = $F('lstYears');
        
var url = 'http://yoursever/app/get_sales';
        var pars = 'empID=+ empID + '&year=+ y;
       
var myAjax = new Ajax.Request(
                    url,
                    
{method: 'get', parameters: pars, onComplete: showResponse}
                    );

    }


    
function showResponse(originalRequest)
    
{
        
//put returned XML in the textarea
        $('result').value = originalRequest.responseText;
    }

</script>

<select id="lstEmployees" size="10" onchange="searchSales()">
    
<option value="5">Buchanan, Steven</option>
    
<option value="8">Callahan, Laura</option>
    
<option value="1">Davolio, Nancy</option>
</select>
<select id="lstYears" size="3" onchange="searchSales()">
    
<option selected="selected" value="1996">1996</option>
    
<option value="1997">1997</option>
    
<option value="1998">1998</option>
</select>
<br><textarea id=result cols=60 rows=10 ></textarea>


你看到传入 Ajax.Request构造方法的第二个对象了吗? 参数{method: 'get', parameters: pars, onComplete: showResponse} 表示一个匿名对象的真实写法。他表示你传入的这个对象有一个名为 method 值为 'get'的属性,另一个属性名为 parameters 包含HTTP请求的查询字符串,和一个onComplete 属性/方法包含函数showResponse

还有一些其它的属性可以在这个对象里面定义和设置,如 asynchronous,可以为truefalse 来决定AJAX对服务器的调用是否是异步的(默认值是 true)。

这个参数定义AJAX调用的选项。在我们的例子中,在第一个参数通过HTTP GET命令请求那个url,传入了变量 pars包含的查询字符串, Ajax.Request 对象在它完成接收响应的时候将调用showResponse 方法。

也许你知道, XMLHttpRequest在HTTP请求期间将报告进度情况。这个进度被描述为四个不同阶段:Loading, Loaded, Interactive, 或 Complete。你可以使 Ajax.Request 对象在任何阶段调用自定义方法 ,Complete 是最常用的一个。想调用自定义的方法只需要简单的在请求的选项参数中的名为 onXXXXX 属性/方法中提供自定义的方法对象。 就像我们例子中的 onComplete 。你传入的方法将会被用一个参数调用,这个参数是 XMLHttpRequest 对象自己。你将会用这个对象去得到返回的数据并且或许检查包含有在这次调用中的HTTP结果代码的 status 属性。

还有另外两个有用的选项用来处理结果。我们可以在onSuccess 选项处传入一个方法,当AJAX无误的执行完后调用, 相反的,也可以在onFailure选项处传入一个方法,当服务器端出现错误时调用。正如onXXXXX 选项传入的方法一样,这两个在被调用的时候也传入一个带有AJAX请求的XMLHttpRequest对象。

我们的例子没有用任何有趣的方式处理这个 XML响应, 我们只是把这段XML放进了一个文本域里面。对这个响应的一个典型的应用很可能就是找到其中的想要的信息,然后更新页面中的某些元素, 或者甚至可能做某些XSLT转换而在页面中产生一些HTML。
完。
摘自:https://compdoc2cn.dev.java.net

posted @ 2008-03-21 17:45 vesung 阅读(876) | 评论 (0)编辑 收藏

 Fed救市之举令中国控制通胀难度加大 (原文地址)
        在援救完贝尔斯登公司(Bear Stearns Cos.)后,美国联邦储备委员会(Fed)主席贝南克(Ben Bernanke)今晚可能会再次送出减息良药。(编者:最新消息,Fed周二已宣布将关键利率下调75个基点。)而这对于香港和中国大陆市场来说又意味着什么呢?对正面临着十几年来最高通货膨胀率的中国货币政策制定者而言,Fed的“灵丹”却可能产生副作用。但是,只要中国继续坚持现行的汇率制度,就不得不生生吞下这颗药丸,而且还必须硬着头皮去应对。中国央行(People's Bank of China)加息而Fed大幅降息,产生的直接影响就是中美利差进一步扩大,使得热钱问题再次成为众矢之的。上周公布的数据显示,Fed 1月份的紧急降息造成中美货币市场利差达到了50个基点,并使得流入中国大陆的外商直接投资规模进一步增大。今年前两个月流入中国大陆的外商直接投资较上年同期增长了75%。这些外资到底是进行商业投资还是纯粹出于投机目的不得而知,不过可以肯定的一点是,中美利差的扩大势必会增强人民币升值预期。上周五人民币升至汇改以来最高水平,达到1美元兑人民币7.0844元。
.... ...
 Fed救市之举令中国控制通胀难度加大 
posted @ 2008-03-19 09:24 vesung 阅读(287) | 评论 (0)编辑 收藏

struts响应用户请求的工作流程:

Request

|
V

ActionServlet

|

如果不存在相应的Action则否则返回error,流程结束

|
V

创建ActionForm

|

进行validatge校验,如果没有通过校验则返回error


创建Action

|
V

执行Action的execute方法,并返回ActionForword对象

|
V

return respose
结束

 

 

posted @ 2008-03-11 11:22 vesung 阅读(741) | 评论 (1)编辑 收藏

     摘要: 文章来源:新浪网

基于城镇居民和农村居民的人均纯收入实现较大跃升的现实,国务院总理温家宝在今年的政府工作报告中特别强调了收入分配的问题,“逐步提高居民收入在国民收入分配中的比重,提高劳动报酬在初次分配中比重”。

  个中关键就是要“调整国民收入分配格局,深化收入分配制度改革。”并多渠道增加农民收入,确保农民工工资按时足额发放。还要“提高企业职工工资的水平,建立企业职工工资正常增长和支付保障机制,……健全并落实最低工资制度。”

  同时,改革国有企业工资总额管理办法,加强对垄断行业企业工资监管。对此,劳动和社会保障部劳动工资司司长邱小平表示,既要通过采取措施,促进非垄断行业的企业职工工资收入逐步提高;又要对垄断行业的高收入采取措施,加以有效调控。
  阅读全文
posted @ 2008-03-06 08:57 vesung 阅读(458) | 评论 (0)编辑 收藏

     摘要: -Xms

设置虚拟机可用内存堆的初始大小,缺省单位为字节,该大小为1024的整数倍并且要大于1MB,可用k(K)或m(M)为单位来设置较大的内存数。初始堆大小为2MB。
例如:-Xms6400K,-Xms256M

-Xmx
设置虚拟机内存堆的最大可用大小,缺省单位为字节。该值必须为1024整数倍,并且要大于2MB。可用k(K)或m(M)为单位来设置较大的内存数。缺省堆最大值为64MB。
例如:-Xmx81920K,-Xmx80M

当应用程序申请了大内存运行时虚拟机抛
  阅读全文
posted @ 2008-03-05 16:39 vesung 阅读(1662) | 评论 (0)编辑 收藏

Caucho Resin提供了最快的jsp/servlets运行平台。它支持Servlet,XSL Filtering6并且具备XSLT和XPath1.0引擎。为方便开发人员能更方便的搭建一个易用的开发平台,将Resin的配置案例如下:

本文resin采用版本为:Resin 2.1.13
本文所有代码均已测试通过

我的工程目录结构如下:

/(root)
    |--resin(resin根目录)
    |        |--bin
    |        |--conf
    |        |      |--resin.conf(resin配置文件 今天的主角)
    |        |--lib
    |--src
          |--java(用于放置java源文件)
          |--test(测试文件目录)
          |--webapp(web应用的根目录,将来doc-dir会指向这里)
                    |---WEB-INF
                                |------classes
                                |------lib
                                |------web.xml(web配置文件)
                                |------applicationContext.xml(其他配置文件)



以下是resin.conf文件源码
<caucho.com>
<log id='/logs' href='stderr:' timestamp='[%Y-%m-%d %H:%M:%S.%s]'/>

<http-server error-log="logs/errors.log">
    
<doc-dir>../src/webapp</doc-dir>
  
  
<!-- the http port -->
  
<http port='82'/>

  
<host id=''>
    
<web-app id='/'>
        
<work-dir>../../build/work</work-dir>
        
<temp-dir>../../build/tmp</temp-dir>
        
<cache-mapping url-pattern="/*" expires="2"/>
        
<class-update-interval>
            100000000
        
</class-update-interval>
        
<jsp jsp-update-interval="1s"/>
        
        
<classpath id='WEB-INF/classes'/>     

    
</web-app>    
  
</host>

</http-server>
</caucho.com>

web.xml源代码
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>

    
<display-name>Acme Corp</display-name>

    
<filter>
        
<filter-name>webwork</filter-name>
        
<filter-class>com.opensymphony.webwork.dispatcher.FilterDispatcher</filter-class>
    
</filter>

    
<filter-mapping>
        
<filter-name>webwork</filter-name>
        
<url-pattern>/*</url-pattern>
    
</filter-mapping>

    
<listener>
        
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    
</listener>

    
<welcome-file-list>
        
<welcome-file>index.jsp</welcome-file>
        
<welcome-file>default.jsp</welcome-file>
        
<welcome-file>index.html</welcome-file>
    
</welcome-file-list>

    
<!--
        This typically isn't required, as the taglib is included in webwork.jar.
        If you really need a taglib configuration within web.xml, copy webwork/src/java/META-INF/taglib.tld
        to the WEB-INF directory as webwork.tld.
     
-->
    
<!--taglib>
        <taglib-uri>webwork</taglib-uri>
        <taglib-location>/WEB-INF/webwork.tld</taglib-location>
    </taglib
-->
</web-app>

posted @ 2008-03-05 16:12 vesung 阅读(11052) | 评论 (0)编辑 收藏

    需求:一方面要求某类只能存在单一的对象实例(从概念上来说,就是一组静态方法和字段),另一方面又要求该实例的使用与普通对象一样,单例模式就是这两个要求之间的平衡。
    单例模式通过使用私有构造函数保证了一个类只能存在一个实例,类中的某个静态方法用于返回类的唯一实例。以下的Widget类就是一个单例:
public class Widget{
    
private static Widget instance = new Widget();
    
public static Widget getInstance(){
       
return instance;
    }

    
private Widget(){}
    
public int doSomething(){
        
// 
    }

}
  Widget的构造函数是私有的,这以为着只有静态方法getInstance()能够创建Widget对象。由于instance字段是静态的,所以它被定义为唯一的实例。第一次调用getInstance()方法创建一个新的Widget对象实例,而后续所有的调用都将会返回这唯一的对象实例。
  单例模式可以去掉不必要的对象创建过程。
posted @ 2008-02-29 16:52 vesung 阅读(350) | 评论 (1)编辑 收藏

知名的黑客集团Cult of the Dead Cow(CDC)在上周发表一个侦测网站漏洞的免费下载工具Goolag Scanner。

Goolag Scanner提供一个简单的图形接口,让用户可利用Google的搜寻暨侦测技术找到各种网站漏洞,或是找到自己网站的安全漏洞;Goolag Scanner甚至内建了1500种客制化的Google搜寻关键词,例如有漏洞的服务器,或是用户的账号及密码等。

CDC发言人Oxblood Ruffin表示,Web是个平台并不是什么大秘密,但是从安全的角度来看,这个平台令人作呕,因此,Goolag Scanner提供网站管理人一个新工具以修补他们网站的漏洞。他们透过该工具在北美、欧洲及中东进行一些测试,并看到许多可怕的漏洞。

由于Goolag Scanner是采用GNU Affero General公开授权,因此任何人皆可免费下载该程序,不论是想修补自己网站漏洞的管理人员,抑或是想攻陷别人网站的黑客
下载地址 http://www.goolag.org/download.html

posted @ 2008-02-27 09:29 vesung 阅读(4146) | 评论 (7)编辑 收藏

posted @ 2008-02-26 18:03 vesung 阅读(397) | 评论 (2)编辑 收藏

     摘要: 应用jquery,制作一个可以自动添加删除行的表格,演示地址 http://www.vesung.cn/demo/table.html 下面是完整的代码: <html>  <head>   <title>带有添加删除行功能的表格</title>   <script type=...  阅读全文
posted @ 2008-02-22 14:45 vesung 阅读(3998) | 评论 (0)编辑 收藏

     摘要: 在jQuery.js的构造函数中,充分利用了JavsScript语言的动态性——对行参的类型和个数没有的严格要求,以至于一个函数可以实现多种功能需求,也为JavaScript语言的多态性提供了基础,在这个构造函数中,提供了六种不同的调用格式(根据官方API文档),具体如下($ = jQuery):
  1、$(String expr):根据给定的CSS选择符查找匹配的元素,如$("div>p");
  2、$(Element elem):将给定的DOM元素对象转换为jQuery对象,如$(document).find("div>p");
  3、$(Array elems):如$(myForm.elements).hide();
  4、$(Function fn):是$(document).ready()的简写模式,如:$( function fn(){ ... } );
  5、$(jQuery obj):如:var div = $("div"); $(div).find("p");
  6、$(String   阅读全文
posted @ 2008-02-20 18:04 vesung 阅读(6723) | 评论 (0)编辑 收藏

jQuery 是继 prototype 之后又一个优秀的 Javascript 框架。其宗旨是—写更少的代码,做更多的事情。它是轻量级的 js 库(压缩后只有21k) ,这是其它的 js 库所不及的,它兼容 CSS3,还兼容各种浏览器(IE 6.0+, FF 1.5+, Safari 2.0+, Opera 9.0+)。 jQuery 是一个快速的,简洁的 javaScript 库,使用户能更方便地处理 HTML documents、events、实现动画效果,并且方便地为网站提供 AJAX 交互。 jQuery 还有一个比较大的优势是,它的文档说明很全,而且各种应用也说得很详细,同时还有许多成熟的插件可供选择。 jQuery 能够使用户的 html 页保持代码和 html 内容分离,也就是说,不用再在 html 里面插入一堆js来调用命令了,只需定义 id 即可。
posted @ 2008-02-20 15:09 vesung 阅读(833) | 评论 (0)编辑 收藏

以下转自http://miokafe.com,介绍了jQuery的部分原理和实现,对理解jQuery有很大帮助.

jQuery是个出色的javascript库,最近结合它写javascript,看了下源码。

先从整体、全局的看,jQuery的源码几乎都在下面的代码中:

 

(function(){

//……

}
)();

 

第一个括号里面是个匿名函数,第二个括号表示马上执行第一个括号里面的代码。
首先明白,javascript里面是没有命名空间的,要保证你的javascript函数、对象与其他的不冲突,这里用了javascript的一个技巧:你的所有javascript函数、对象都在一个匿名函数里面定义,确保了所定义的函数、对象的有效范围,起到了命名空间的作用。既然作用范围在这个匿名函数中,怎么被别人使用呢?下面看它的下面代码:

 

var jQuery = window.jQuery = function(selector, context) {
//……
}
;

 

这里让jQuery库中最重要的对象jQuery成为了window对象的一个属性,这样就可以在其他地方像使用document(document也是window的一个属性)一样使用jQuery了。也许使用过jQuery的朋友惊讶-我没有使用jQuery对象,一直使用$的。没错,那是jQuery的同名对象:

window.$ = jQuery;

现在明白了吧。

 

posted @ 2008-02-18 11:46 vesung 阅读(3135) | 评论 (4)编辑 收藏

<html>
 
<head>
  
<title>Hello, Ajax world!</title>
  
<script type="text/javascript"
    src
="../js/jquery-1.2.1.pack.js"></script>
  
<script type="text/javascript">      
        $('document').ready(
function(){
            $('.stripe tr').mouseover(
function(){
                    $(
this).addClass('over');
                }).mouseout(
function(){
                    $(
this).removeClass('over');
                    });
                $(
".stripe tr:odd").addClass('alt');                    
            
            });
            
            
function showV(){
                alert($('email'));
            }
    
</script>
<style>
th 
{
        background
:#0066FF;
        color
:#FFFFFF;
        line-height
:20px;
        height
:30px;
} 
td 
{
        padding
:6px 11px;
        border-bottom
:1px solid #95bce2;
        vertical-align
:top;
        text-align
:center;
} 
td * 
{
        padding
:6px 11px;
} 
tr.alt td 
{
        background
:#ecf6fc;  /*这行将给所有的tr加上背景色*/
} 
tr.over td 
{
        background
:#bcd4ec;  /*这个将是鼠标高亮行的背景色*/
}
 
</style>
</head>
 
<body>
<table class="stripe" width="50%" border="0" cellspacing="0" cellpadding="0"> 
<!--用class="stripe"来标识需要使用该效果的表格-->
<thead>
  
<tr>
    
<th>姓名</th><th>年龄</th><th>QQ</th><th>Email</th>
  
</tr>
</thead>
<tbody>
  
<tr>
    
<td>邓国梁</td>
    
<td>23</td>
    
<td>31540205</td>
    
<td>gl.deng@gmail.com</td>
  
</tr>
  
<tr>
    
<td>邓国梁</td>
    
<td>24</td>
    
<td>31540205</td>
    
<td>s@sn.hk</td>
  
</tr>
  
<tr>
    
<td>邓国梁</td>
    
<td>25</td>
    
<td>31540205</td>
    
<td>gl.deng@gmail.com</td>
  
</tr>
  
<tr>
    
<td>邓国梁</td>
    
<td>26</td>
    
<td>31540205</td>
    
<td>gl.deng@gmail.com</td>
  
</tr>
  
<tr>
    
<td>邓国梁</td>
    
<td>27</td>
    
<td>31540205</td>
    
<td>gl.deng@gmail.com</td>
  
</tr>
  
<tr>
    
<td>邓国梁</td>
    
<td>28</td>
    
<td>31540205</td>
    
<td>gl.deng@gmail.com</td>
  
</tr>
</tbody>
</table>
</body>
</html>

jquery-1.2.1.pack.js下载地址:http://code.google.com/p/jqueryjs/downloads/detail?name=jquery-1.2.1.pack.js&can=2&q=
这个例子相当简单,
了解更多jquery知识请访问这里
posted @ 2008-02-15 09:33 vesung 阅读(590) | 评论 (0)编辑 收藏

dojo.lang.string
dojo.string.substituteParams 类似C#中的String.Format函数
%{name}要保证与传入的对象的名称大小写一致,否则会出异常
Usage Example:
dojo.string.substituteParams("%{0} - %{1} - %{2}", "a", "b", "c"); //will return "a - b - c"
dojo.string.substituteParams("%{name}: %{value}", {name:"名称",value:"值"}); //will return "名称: 值"
dojo.string.capitalize 把每一个单词的首字母大写
Usage Example:
dojo.string.capitalize("show me love"); //will return "Show Me Love"
dojo.string.isBlank 判断输入字符串是否为空或全是空白字符,如果传入对象为非字符串则也会返回true
Usage Example:
dojo.string.isBlank(" 1 "); //will return false
dojo.string.escape 参数1为type,可传值为: xml/html/xhtml, sql, regexp/regex, javas cript/js cript/js, ascii
将按照所传type对字符串进行编码
Usage Example:
dojo.string.escape("html", "<input type='text' value='' />"); //will return "<input
type='text' value='' />"
dojo.string.encodeAscii
dojo.string.escapeXml
dojo.string.escapeSql
dojo.string.escapeRegExp
dojo.string.escapeJavas cript
dojo.string.escapeString
这些函数也就是 dojo.string.escape 所调用的,这里无需多说
dojo.string.summary 取得输入字符串的缩略版本
Usage Example:
dojo.string.summary("1234567890", 5); //will return "12345..."
dojo.string.endsWith 判断输入字符串是否以指定的字符串结尾
Usage Example:
dojo.string.endsWith("abcde", "E"); //will return false
dojo.string.endsWith("abcde", "E", true); //will return true
dojo.string.endsWithAny 判断输入字符串是否以指定的任意字符串结尾
Usage Example:
dojo.string.endsWithAny("abcde", "E", "e"); //will return true
dojo.string.startsWith 判断输入字符串是否以指定的字符串开头
Usage Example:
dojo.string.startsWith("abcde", "A"); //will return false
dojo.string.startsWith("abcde", "A", true); //will return true
dojo.string.startsWithAny 判断输入字符串是否以指定的任意字符串开头
Usage Example:
dojo.string.startsWithAny("abcde", "A", "a"); //will return true
dojo.string.has 判断输入字符串是否含有任意指定的字符串
Usage Example:
dojo.string.has("abcde", "1", "23", "abc"); //will return true
dojo.string.normalizeNewlines 按要求转换回车换行的格式
Usage Example:
dojo.string.normalizeNewlines("a\r\nb\r\n", "\r"); //will return "a\rb\r"
dojo.string.splitEscaped 将字符串按分隔符转换为数组
Usage Example:
dojo.string.splitEscaped("a\\_b_c", '_'); //will return ["a\\_b", "c"]

模块:dojo.lang.func
dojo.lang.hitch 将指定的方法挂在指定的对象下并返回该方法
Usage Example:
func = {test: function(s) {alert(s)}};
dojo.lang.mixin(func, {demo: dojo.lang.hitch(func, "test")});
func.demo("demo and test are same method");
dojo.lang.forward 返回自身对象的指定名称的方法引用
Usage Example:
func = {test: function(s) {alert(s)}, demo: dojo.lang.forward("test")};
func.demo("demo and test are same method");
dojo.lang.curry What is curry? 请参阅这篇文章:http://www.svendtofte.com/code/curried_javas cript/
Usage Example:
function add(a, b)
{
return a + b;
}
dojo.lang.curry(null, add, 2, 3); //will return 5
dojo.lang.curry(null, add, 2)(3); //will return 5

dojo.lang.curry(null, add)(2)(3); //will return 5
dojo.lang.curry(null, add)()(2)(3); //will return 5
dojo.lang.curryArguments 与dojo.lang.curry类似,但是可以选择忽略掉前n个参数
Usage Example:
function add(a, b)
{
return a + b;
}
dojo.lang.curryArguments(null, add, [1,2,3,4,5], 2); //will return 7 (= 3 + 4)

处理数组相关api

dojo.lang.has 判断对象是否具有指定属性,不过这个方法有用吗,不如直接使用 if(name in obj)
Usage Example:
dojo.lang.has(dojo.lang, "has"); //will return true
dojo.lang.isEmpty 判断对象或数组是否为空
Usage Example:
dojo.lang.isEmpty({a: 1}); //will return false
dojo.lang.isEmpty([]); //will return true
dojo.lang.map 调用指定的方法处理指定的数组或字符串
Usage Example:
dojo.lang.map([1,2,3,4,5], function(x) { return x * x;}); //will return [1,4,9,16,25]
dojo.lang.forEach 遍历指定的数组或字符串,并对其中的元素调用指定的方法
Usage Example:
dojo.lang.forEach("abc", function(x) { alert(x); });
dojo.lang.every 检查指定的数组是否全部满足指定方法的条件
Usage Example:
dojo.lang.every([1,-2,3], function(x) { return x > 0; }); //指定的数组不是全大于0的,因此返回false
dojo.lang.some 检查指定的数组是否部分满足指定方法的条件
Usage Example:
dojo.lang.some([1,-2,3], function(x) { return x > 0; }); //指定的数组有大于0的元素,因此返回true
dojo.lang.filter 根据指定的方法来过滤指定的数组
Usage Example:
dojo.lang.filter([1,-2,3], function(x) { return x > 0; }); //will return [1, 3]
dojo.lang.unnest 把指定的参数或数组转换为一维数组
Usage Example:
dojo.lang.unnest(1, 2, 3); //will return [1, 2, 3]
dojo.lang.unnest(1, [2, [3], [[[4]]]]); //will return [1, 2, 3, 4]
dojo.lang.toArray 将输入转换为数组
Usage Example:
function test()
{
return dojo.lang.toArray(arguments, 1);
}
test(1,2,3,4,5); //will return [2,3,4,5]
posted @ 2008-02-13 17:00 vesung 阅读(1802) | 评论 (0)编辑 收藏

以下内容转自新浪网 
 
春节期间科技要闻回顾(2.6-2.12):     
      产业政策:
     
      信产部称07年我国电信价格同比下降13.6%  

  我国固话用户40年来首度负增长

  调查显示中国用户更愿意通过手机听音乐

  广州300元共享器可让多台电视共用机顶盒

  欧洲取代美国成垃圾邮件最大发源地

  今年我国95%以上乡镇将开通宽带

  信息产业部称仍有千万通信用户受雪灾影响

  北京除夕短信发出6亿条 广东突破7亿条

  2008年我国电话用户总数将达9.76亿户

  文化部推荐第三批适合未成年人网络游戏产品

  2007年我国共过滤网上有害信息2亿多条

  春节假期全国手机短信发送量有望超过170亿条

  企业消费:

  华为07年无线收入达70亿美元

  花旗分析师预计3G版iPhone年中上市

  传iPhone和iPod Touch将降价100美元

  传摩托罗拉和北电将组建无线设备合资公司

  2300多企业列入首批完成软件正版化名单

  消息称谷歌有意收购CNET股份

  以色列推出7.8毫米厚世界最小最轻手机

  戴尔停止通过网站销售AMD PC

  Google Android手机原型将亮相3GSM大会

  微软市值过去一周缩水400亿美元

  传谷歌或MySpace将斥资15亿美元收购Bebo

  报告称苹果成为全球第三大智能手机厂商

  消息称微软两名重要高管即将离职

  大众科技:

  俄科学家称原子撞击实验可创造时空裂缝

  美宇航局因宇航员健康问题推迟太空行走

  法国设计豪华飞艇十天可环绕地球一周(组图)

  鼠年说鼠:不怕猫的老鼠(组图)

  研究称美丽蓝眼睛源自一万年前基因突变(图)

  52国气候专家联合为全球气候变化敲警钟

posted @ 2008-02-13 09:56 vesung 阅读(333) | 评论 (0)编辑 收藏

     摘要: dojo.io.bind :处理请求取回需要的数据并处理。         这个函数是AJAX中最为重要和有用的函数,dojo.io.bind这个类是用来处理客户端与服务器间通讯的,需要通讯的参数由对象dojo.io.Request所定义,具体通讯的方法则由另外一个对象Transport所提供。Dojo里提供了一个同...  阅读全文
posted @ 2008-01-31 16:52 vesung 阅读(2871) | 评论 (0)编辑 收藏

     摘要: 今天看到一篇php分页的文章,虽然简单但非常实用,稍作编辑贴出来(原文地址http://www.chinaunix.net/jh/27/181584.html)

所谓分页显示,也就是将数据库中的结果集人为的分成一段一段的来显示,这里需要两个初始的参数:

每页多少条记录($PageSize)?
当前是第几页($CurrentPageID)?
至于其他的参数,比如:上一页($PreviousPageID)、下一页($NextPageID)、总页数($numPages)等等,都可以根据前边这几个东西得到。
现在只要再给我一个结果集,我就可以显示某段特定的结果出来。
以mysql数据库为例,如果要从表内截取某段内容,sql语句可以用:select * from table limit offset, rows。看看下面一组sql语句,尝试一下发现其中的规率。

前10条记录:select * from table limit 0,10
第11至20条记录:select * from tabl  阅读全文
posted @ 2008-01-31 15:59 vesung 阅读(819) | 评论 (0)编辑 收藏

     摘要: 2006年初,dojo还是0.22的时候就很关注它的发展,可一直没有在实际项目中使用。一来是由于文档的缺少,而来是dojo的相关介绍总是让人望而生畏。到现在都如此,第一个hello world就搞了一大堆东西,比如widget组件,自定义的script标签等,加上要引入什么css文件,djConfig、dojo.require等等,让人很迷惑,这么复杂,到底dojo该怎么使用呢?我只是想把dojo当作一个普通的js类库,就像prototype那样?OK,闲话少说,来看看如何使用dojo。

第一步,引入dojo.js
dojo的发行包里有4个子目录,要引入的文件是名叫"dojo"的子目录里的dojo.js。
假设你是这样的目录结构:
  阅读全文
posted @ 2008-01-28 15:43 vesung 阅读(12667) | 评论 (4)编辑 收藏

dojo.collections 很有用的集合数据结构(List、Query、Set、Stack、Dictionary...)
dojo.crypto 实现加密功能的API(Blowfish、MD5、Rijndael、SHA...)
dojo.date 无须编写丑陋的代码来解析日期格式。
dojo.dnd 拖放功能的辅助API。
dojo.event 事件驱动的API,支持AOP开发,以及主题/队列的功能。
dojo.lfx HTML和SVG效果库。
dojo.animation 基于Dan Pupius在动画方面的工作(http://pupius.co.uk/js/Toolkit.Drawing.js)的动画package(不再支持,应首选dojo.lfx)
dojo.fx 不再支持,应首选dojo.lfx
dojo.io 不同的IO管道。cookie、IFrame、发布/订阅功能等等。所有神奇的Ajax工作都在这里完成。
dojo.lang 对于整个JavaScript环境进行增强的功能。包括你所希望拥有的很多特征,例如mixin、基于闭包(closure)的函数,以及大量的其他功能。
dojo.logging 提供日志功能的框架
dojo.math 数学函数(曲线、点、矩阵)
dojo.reflect 提供反射功能的函数库
dojo.rpc 与后端服务(例如理解JSON语法的Web服务)进行通信
dojo.storage 将数据保存在本地存储中(例如,在浏览器中利用Flash的本地存储来实现)
dojo.string 现在你可以对字符串进行如下的处理,修整、转换为大写、编码、esacpe、填充(pad)等等。
dojo.undo 用来撤销用户操作的栈管理器
dojo.uri 处理URI的函数库
dojo.widget 一个widget框架,允许你建造可重用的HTML/JavaScript widget,可以与简单的HTML标记共同使用(例如,<div class=”dojo-MyWidgetType”>)。支持基于标记的应用开发(例如:XAML、XUL)
dojo.xml、dojo.dom 帮助你处理DOM的辅助函数,以及其他的XML辅助函数。
dojo.style CSS功能,例如访问style的大小、与浏览器的盒模型配合工作,以及更多的功能。

posted @ 2008-01-28 10:29 vesung 阅读(1266) | 评论 (0)编辑 收藏

原文地址:http://datum.studyget.com/sh/200703/20070328_46338.shtml
SSL 是Secure socket Layer英文缩写,它的中文意思是安全套接层协议,指使用公钥和私钥技术组合的安全网络通讯协议。SSL协议是网景公司(Netscape)推出的基于 WEB应用的安全协议,SSL协议指定了一种在应用程序协议(如Http、Telenet、NMTP和FTP等)和TCP/IP协议之间提供数据安全性分层的机制,它为TCP/IP连接提供数据加密、服务器认证、消息完整性以及可选的客户机认证,主要用于提高应用程序之间数据的安全性,对传送的数据进行加密和隐藏,确保数据在传送中不被改变,即确保数据的完整性。

    SSL 以对称密码技术和公开密码技术相结合,可以实现如下三个通信目标:

(1)秘密性: SSL客户机和服务器之间传送的数据都经过了加密处理,网络中的非法窃听者所获取的信息都将是无意义的密文信息。

(2)完整性: SSL利用密码算法和散列(HASH)函数,通过对传输信息特征值的提取来保证信息的完整性,确保要传输的信息全部到达目的地,可以避免服务器和客户机之间的信息受到破坏。

(3)认证性:利用证书技术和可信的第三方认证,可以让客户机和服务器相互识别对方的身份。为了验证证书持有者是其合法用户(而不是冒名用户), SSL要求证书持有者在握手时相互交换数字证书,通过验证来保证对方身份的合法性。

3.SSL协议的体系结构

    SSL协议位于TCP/IP协议模型的网络层和应用层之间,使用TCP来提供一种可靠的端到端的安全服务,它是客户/服务器应用之间的通信不被攻击窃听,并且始终对服务器进行认证,还可以选择对客户进行认证。SSL协议在应用层通信之前就已经完成加密算法、通信密钥的协商以及服务器认证工作,在此之后,应用层协议所传送的数据都被加密。SSL实际上是共同工作的两层协议组成,如图1所示。从体系结构图可以看出SSL安全协议实际是SSL握手协议、SSL修改密文协议、SSL警告协议和SSL记录协议组成的一个协议族。

握手
协议
修改密  
文协议
报警
协议
        SSL记录协议
           TCP
           IP


          
         图1  SSL体系结构

    SSL记录协议为SSL连接提供了两种服务:一是机密性,二是消息完整性。为了实现这两种服务, SSL记录协议对接收的数据和被接收的数据工作过程是如何实现的呢? SSL记录协议接收传输的应用报文,将数据分片成可管理的块,进行数据压缩(可选),应用MAC,接着利用IDEA、DES、3DES或其他加密算法进行数据加密,最后增加由内容类型、主要版本、次要版本和压缩长度组成的首部。被接收的数据刚好与接收数据工作过程相反,依次被解密、验证、解压缩和重新装配,然后交给更高级用户。

    SSL修改密文协议是使用SSL记录协议服务的SSL高层协议的3个特定协议之一,也是其中最简单的一个。协议由单个消息组成,该消息只包含一个值为1的单个字节。该消息的唯一作用就是使未决状态拷贝为当前状态,更新用于当前连接的密码组。为了保障SSL传输过程的安全性,双方应该每隔一段时间改变加密规范。

    SSL告警协议是用来为对等实体传递SSL的相关警告。如果在通信过程中某一方发现任何异常,就需要给对方发送一条警示消息通告。警示消息有两种:一种是 Fatal错误,如传递数据过程中,发现错误的MAC,双方就需要立即中断会话,同时消除自己缓冲区相应的会话记录;第二种是Warning消息,这种情况,通信双方通常都只是记录日志,而对通信过程不造成任何影响。SSL握手协议可以使得服务器和客户能够相互鉴别对方,协商具体的加密算法和MAC算法以及保密密钥,用来保护在SSL记录中发送的数据。

    SSL握手协议允许通信实体在交换应用数据之前协商密钥的算法、加密密钥和对客户端进行认证(可选)的协议,为下一步记录协议要使用的密钥信息进行协商,使客户端和服务器建立并保持安全通信的状态信息。SSL握手协议是在任何应用程序数据传输之前使用的。SSL握手协议包含四个阶段:第一个阶段建立安全能力;第二个阶段服务器鉴别和密钥交换;第三个阶段客户鉴别和密钥交换;第四个阶段完成握手协议。

posted @ 2008-01-25 17:10 vesung 阅读(944) | 评论 (0)编辑 收藏

一个简单的需求的实现:
在程序中调用某类的某方法,并将返回结果println() 出来。
实现方法:

MethodTest.java
import java.util.ArrayList;
import java.util.List;
import java.lang.reflect.Method;
import java.lang.reflect.InvocationTargetException;

/**
 * 功能描述:
 *
 * 
@author <a href='mailto:vesung@gmail.com'>wangjing</a>
 * Copyright: Copyright (c) 2006-2008 by vesung.cn.
 * Date: 2008-1-23 14:13:26
 
*/

public class MethodTest{
    TestVO vo 
= new TestVO();

    
/**
     * 初始化vo
     
*/

    
protected void setUp(){
        vo.setInvoiceSortCode(
"InvoiceSortCode");
        vo.setInvoiceSortName(
"InvoiceSortName");
        vo.setOperaddress(
"Operaddress");
        vo.setStockStatus(
"StockStatus");
        vo.setStockStatusCode(
"StockStatusCode");
        List list 
= new ArrayList();
        list.add(
"StockStatusList");
        vo.setStockStatusList(list);
        vo.setTaxpayerName(
"TaxpayerName");
        vo.setTaxRegCode(
"TaxRegCode");
    }


    
public static void main(String[] args) throws IllegalAccessException, NoSuchMethodException, InvocationTargetException {
        MethodTest m 
= new MethodTest();
        m.setUp();
        
//待执行的方法名称注意没有()
        String methodName = "getInvoiceSortCode";

        
//先获取相应的method对象
        
//getMethod第一个参数是方法名,第二个参数是该方法的参数类型,
        
//因为存在同方法名不同参数这种情况,所以只有同时指定方法名和参数类型才能唯一确定一个方法
        Method method = m.vo.getClass().getMethod(methodName,new Class[0]);
        
//接下来就该执行该方法了,解释一下参数
        
//第一个参数是具体调用该方法的对象
        
//第二个参数是执行该方法的具体参数
        System.out.println(methodName+"():"+method.invoke(m.vo,new Object[0]));
    }

}

TestVO.java
import java.util.List;

/**
 * 功能描述:
 *
 * 
@author <a href='mailto:vesung@gmail.com'>wangjing</a>
 * Copyright: Copyright (c) 2006-2008 by vesung.cn.
 * Date: 2008-1-23 14:17:14
 
*/

public class TestVO {
    
private String taxRegCode;
    
private String stockStatusCode;
    
private String stockStatus;
    
private List stockStatusList;
    
private String taxpayerName;
    
private String operaddress;
    
private String invoiceSortCode;
    
private String invoiceSortName;
    
public String pub;

        public String getInvoiceSortCode(){
                return InvoiceSortCode;
        }
//省略getter(),setter()
//  
}
posted @ 2008-01-24 11:28 vesung 阅读(22306) | 评论 (0)编辑 收藏

# Set root logger level to WARN and append to stdout
log4j.rootLogger=WARN, stdout, error
#WARN为log输出级别,stdout,error为该log的别名,下面将用到
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j
.appender.stdout.layout=org.apache.log4j.PatternLayout

# Pattern to output the caller's file name and line number.
log4j.appender.stdout.layout.ConversionPattern=%d %5p (%c:%L- %m%n

# Print only messages of level ERROR or above in the package noModule.
log4j.logger.noModule=FATAL

# OpenSymphony Stuff
log4j.logger.com.opensymphony=INFO
log4j
.logger.com.opensymphony.webwork=DEBUG

# Spring Stuff
log4j.logger.org.springframework=INFO

#################################
#                       错误信息 #
#################################

log4j.appender.error=org.apache.log4j.DailyRollingFileAppender
log4j
.appender.error.File=E:/MyDoc/WorkSpace/webworkroot/logs/errors.log
log4j
.appender.error.layout=org.apache.log4j.PatternLayout
log4j
.appender.error.layout.ConversionPattern=[%d]-%-5p (%F:%L)|%m%n
log4j
.appender.error.DatePattern='.'yyyy-MM-dd
log4j
.appender.error.Threshold=ERROR

###################################
#                       CONSOLE #
#################################


log4j
.appender.console=org.apache.log4j.ConsoleAppender
log4j
.appender.console.layout=org.apache.log4j.PatternLayout
log4j
.appender.console.layout.ConversionPattern=(%F:%L)|%m%n

log4j
.appender.errorcsle=org.apache.log4j.ConsoleAppender
log4j
.appender.errorcsle.layout=org.apache.log4j.PatternLayout
log4j
.appender.errorcsle.layout.ConversionPattern=%-5p (%F:%L)|%m%n
log4j
.appender.errorcsle.Threshold=ERROR

##################################
#                       业务系统 #
#################################

log4j.logger.cn.vesung=DEBUG, logic

log4j
.appender.logic=org.apache.log4j.DailyRollingFileAppender
log4j
.appender.logic.File=E:/MyDoc/WorkSpace/webworkroot/logs/logic.log
log4j
.appender.logic.layout=org.apache.log4j.PatternLayout
log4j
.appender.logic.layout.ConversionPattern=[%d]-%-5p (%F:%L)|%m%n
log4j
.appender.logic.DatePattern='.'yyyy-MM-dd

其实业务系统和错误信息的输出定义对开发人员来说是最重要的。
posted @ 2008-01-22 15:28 vesung 阅读(28658) | 评论 (0)编辑 收藏

     摘要: 刚刚有消息报道MySQL要IPO,结果就来一颗炸弹,被SUN给收购了,那么,我们是否可以这样推测,哪些同样处在IPO上市名单前列的OpenSource公司是否也同样的处在大鳄们的收购名单中?
虽然,我们不否认,被大鳄们收购的OpenSource公司因为在资金上获得了充足的支持,可以为我们提供更好的服务,但是也不得不看到--前一阶段外电报道IBM重新审视Gluecode的定位问题,Webshpere社区版的活力和技术特性已经冲击到Webshpere收费版本,和IBM的战略构成冲突--大鳄们收购OpenSource公司会为相关产品的服务的可持续性带来巨大的问号,开源本来就与商务存在着天然的不和谐,而商务公司的直接插手,更是让OpenSource的未来陷入迷雾。

--------------------------------------------------------------------------------
太震撼了!真的还是假的??

----------------------------------------------  阅读全文
posted @ 2008-01-21 18:42 vesung 阅读(382) | 评论 (0)编辑 收藏

1月16日,Sun宣布已经与MySQL AB达成协议,以大约10亿美元收购MySQL AB,其中8亿美元现金收购MySQL AB的全部股权,另外的2亿美元作为期权。

MySQL负责开发社区的副总裁 Kaj 在他的blog中分析了这单交易对于MySQL的用户、核心社区以及公司员工会带来哪些影响,还发表了他与MySQL的两位创始人Monty和David关于此事的交谈

MySQL总部位于瑞典,在全球25个国家共有约400名员工。交易完成之后,MySQL首席执行官马顿·尼科斯(Marten Mickos)将加盟Sun管理层。Sun一直是开放源代码软件的坚定支持者,该公司希望通过这一模式从软件业务获得更多营收。在此之前,Sun一直为MySQL的竞争对手PostgreSQL销售支持服务。

对于Sun来说,收购MySQL有助于该公司更好地为开放源代码网络应用平台LAMP提供支持。LAMP是Linux操作系统、Apache网络服务器、MySQL数据库和PHP/Perl编程语言的首字母缩写。这一交易预计将于2008年第三季度或第四季度完成,如何获得足够的现金,对于Sun来说将是第一要务。Sun首席执行官乔纳森·舒瓦茨(Jonathan Schwartz)表示,在交易完成之前,该公司就将开始为MySQL客户提供支持服务。
posted @ 2008-01-21 18:22 vesung 阅读(388) | 评论 (0)编辑 收藏

hibernate2.jar:
        Hibernate的库,没有什么可说的,必须使用的jar包 
cglib-asm.jar: 
  CGLIB库,Hibernate用它来实现PO字节码的动态生成,非常核心的库,必须使用的jar包 
dom4j.jar: 
  dom4j是一个Java的XML API,类似于jdom,用来读写XML文件的。dom4j是一个非常非常优秀的Java XML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件,可以在SourceForge上找到它。在IBM developerWorks上面可以找到一篇文章,对主流的Java XML API进行的性能、功能和易用性的评测,dom4j无论在那个方面都是非常出色的。我早在将近两年之前就开始使用dom4j,直到现在。如今你可以看到越来越多的Java软件都在使用dom4j来读写XML,特别值得一提的是连Sun的JAXM也在用dom4j。这是必须使用的jar包,Hibernate用它来读写配置文件。 
odmg.jar:
  ODMG是一个ORM的规范,Hibernate实现了ODMG规范,这是一个核心的库,必须使用的jar包。 
commons-collections.jar: 
        Apache Commons包中的一个,包含了一些Apache开发的集合类,功能比java.util.*强大。必须使用的jar包。 
commons-beanutils.jar:
  Apache Commons包中的一个,包含了一些Bean工具类类。必须使用的jar包。 
commons-lang.jar: 
  Apache Commons包中的一个,包含了一些数据类型工具类,是java.lang.*的扩展。必须使用的jar包。 
commons-logging.jar: 
  Apache Commons包中的一个,包含了日志功能,必须使用的jar包。这个包本身包含了一个Simple Logger,但是功能很弱。在运行的时候它会先在CLASSPATH找log4j,如果有,就使用log4j,如果没有,就找JDK1.4带的java.util.logging,如果也找不到就用Simple Logger。commons-logging.jar的出现是一个历史的的遗留的遗憾,当初Apache极力游说Sun把log4j加入JDK1.4,然而JDK1.4项目小组已经接近发布JDK1.4产品的时间了,因此拒绝了Apache的要求,使用自己的java.util.logging,这个包的功能比log4j差的很远,性能也一般。
  后来Apache就开发出来了commons-logging.jar用来兼容两个logger。因此用commons-logging.jar写的log程序,底层的Logger是可以切换的,你可以选择log4j,java.util.logging或者它自带的Simple Logger。不过我仍然强烈建议使用log4j,因为log4j性能很高,log输出信息时间几乎等于System.out,而处理一条log平均只需要5us。你可以在Hibernate的src目录下找到Hibernate已经为你准备好了的log4j的配置文件,你只需要到Apache 网站去下载log4j就可以了。commons-logging.jar也是必须的jar包。
  使用Hibernate必须的jar包就是以上的这几个,剩下的都是可选的。 
ant.jar: 
  Ant编译工具的jar包,用来编译Hibernate源代码的。如果你不准备修改和编译Hibernate源代码,那么就没有什么用,可选的jar包 
optional.jar:
  Ant的一个辅助包。 
c3p0.jar: 
  C3PO是一个数据库连接池,Hibernate可以配置为使用C3PO连接池。如果你准备用这个连接池,就需要这个jar包。 
proxool.jar:
  也是一个连接池,同上。 
commons-pool.jar, commons-dbcp.jar: 
  DBCP数据库连接池,Apache的Jakarta组织开发的,Tomcat4的连接池也是DBCP。 

  实际上Hibernate自己也实现了一个非常非常简单的数据库连接池,加上上面3个,你实际上可以在Hibernate上选择4种不同的数据库连接池,选择哪一个看个人的偏好,不过DBCP可能更通用一些。另外强调一点,如果在EJB中使用Hibernate,一定要用App Server的连接池,不要用以上4种连接池,否则容器管理事务不起作用。 

  connector.jar: 

  JCA 规范,如果你在App Server上把Hibernate配置为Connector的话,就需要这个jar。不过实际上一般App Server肯定会带上这个包,所以实际上是多余的包。 

  jaas.jar: 

  JAAS是用来进行权限验证的,已经包含在JDK1.4里面了。所以实际上是多余的包。 

  jcs.jar: 

  如果你准备在Hibernate中使用JCS的话,那么必须包括它,否则就不用。 

  jdbc2_0-stdext.jar: 

  JDBC2.0的扩展包,一般来说数据库连接池会用上它。不过App Server都会带上,所以也是多余的。 

  jta.jar: 

  JTA规范,当Hibernate使用JTA的时候需要,不过App Server都会带上,所以也是多余的。 

  junit.jar: 

  Junit包,当你运行Hibernate自带的测试代码的时候需要,否则就不用。 

  xalan.jar, xerces.jar, xml-apis.jar: 

  Xerces是XML解析器,Xalan是格式化器,xml-apis实际上是JAXP。一般App Server都会带上,JDK1.4也包含了解析器,不过不是Xerces,是Crimson,效率比较差,不过Hibernate用XML只不过是读取配置文件,性能没什么紧要的,所以也是多余的。
posted @ 2008-01-17 09:58 vesung 阅读(333) | 评论 (0)编辑 收藏