<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>programming</title>
    <description>欢迎光临诚钻世家珠宝网！诚钻在线客服竭诚为您服务！QQ：302668667；http://www.ubuntufans.com.cn/html/2/category-catid-2-page-2.html</description>
    <link>http://programming.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>今天javaeye样式不对,怎么没有人理采呢</title>
        <author>programming</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://programming.javaeye.com">programming</a>&nbsp;
          链接：<a href="http://programming.javaeye.com/blog/219368" style="color:red;">http://programming.javaeye.com/blog/219368</a>&nbsp;
          发表时间: 2008年07月25日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          大家一起看一看..怎么会没有人理采呢,发邮件都发出不出去.
          <br/>
          <span style="color:red;">
            <a href="http://programming.javaeye.com/blog/219368#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 25 Jul 2008 10:23:39 +0800</pubDate>
        <link>http://programming.javaeye.com/blog/219368</link>
        <guid>http://programming.javaeye.com/blog/219368</guid>
      </item>
      <item>
        <title>我的SVN权限配置信息贴出来和大家共享</title>
        <author>programming</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://programming.javaeye.com">programming</a>&nbsp;
          链接：<a href="http://programming.javaeye.com/blog/219277" style="color:red;">http://programming.javaeye.com/blog/219277</a>&nbsp;
          发表时间: 2008年07月25日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          安装SVN服务器<br /><br />    1. 安装服务器软件<br /><br />    2. 将SVN添加到Windows服务<br /><br />             1. 新建一个文件夹用来存放库文件 c:\SVN<br /><br />             2. 运行命令:SVNService -install -d -r c:\svn 安装 Windows 服务<br /><br />             3. 通过Windows服务管理平台启动SVN服务<br /><br />        4. 其它命令<br /><br />             1. 改变服务设置:<br /><br />                 运行命令:SVNService -setup -d -r &lt;newsvnroot><br /><br />                 在实际操作中,&lt;newsvnroot>代表与SubVersion服务启动时不同的电子仓库目录.<br /><br /> <br /><br />             2. 删除服务:<br /><br />                 运行命令:SVNService -remove<br />系统文件配置svnserve.conf<br />[general]<br /><br />anon-access=none<br />auth-access=write<br /><br />password-db=passwd<br /><br />authz-db=authz<br /><br />realm=repository<br /><br /><br /><br />用户文件配置passwd文件<br />[users]<br /># harry = harryssecret<br /># sally = sallyssecret<br />czuan=czuan<br />test=test<br />programming=programming<br />authz文件配置<br />[groups]<br />repository=programming,czuan,test<br />[/czuan]<br />czuan=rw<br />[/]<br />programming=rw<br />*=r<br />5 在服务器上创建数据仓库。我们在启动服务器时指定了数据仓库的位置: d:svnserver。因此，我们在该目录下单击右键，选择TortoiseSVN->在此创建版本库..., 选择本地文件系统。<br />svnserve -d -r d:/svnserver<br />svn://192.168.0.1/czuan
          <br/>
          <span style="color:red;">
            <a href="http://programming.javaeye.com/blog/219277#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 25 Jul 2008 00:33:57 +0800</pubDate>
        <link>http://programming.javaeye.com/blog/219277</link>
        <guid>http://programming.javaeye.com/blog/219277</guid>
      </item>
      <item>
        <title>写了两年的代码，想谈谈生活</title>
        <author>programming</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://programming.javaeye.com">programming</a>&nbsp;
          链接：<a href="http://programming.javaeye.com/blog/216339" style="color:red;">http://programming.javaeye.com/blog/216339</a>&nbsp;
          发表时间: 2008年07月18日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          在杭州这么久了，体会很多。还真不是我们穷人代的地方，房价暴涨，从去年年底的700块，涨到现在的1100块吧，说起消费，和上海，北京我看是没有什么区别了，但是工资与上海和北京完全有区别，电费收你一元／度，房东觉得还吃亏了，靠。什么世道吗，在这个民房这里，，所有的房东聚集在一起，房价都商量好了，我们来这边混口饭吃，图得就是一个生活吗，但也不要太黑了，能够有个住的地方，安稳的生活，总不能租个房子还跑到乡下去租子吧，在杭州朋友，你们也说说，杭州这么这样，哎，新闻上夸杭州有很多地方第一，消费第一，还有什么第一第一，挂在报纸上，感觉还不知道有多光荣，是你杭州人有钱，还是你杭州人聪明，我看说你是有钱人吗，也不见得，在房租上几十元钱，你也津津计较。。。。哎。。。
          <br/>
          <span style="color:red;">
            <a href="http://programming.javaeye.com/blog/216339#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 18 Jul 2008 20:22:23 +0800</pubDate>
        <link>http://programming.javaeye.com/blog/216339</link>
        <guid>http://programming.javaeye.com/blog/216339</guid>
      </item>
      <item>
        <title>Ubuntu liunx系统安装,没有图我也能让他学会安装 </title>
        <author>programming</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://programming.javaeye.com">programming</a>&nbsp;
          链接：<a href="http://programming.javaeye.com/blog/208568" style="color:red;">http://programming.javaeye.com/blog/208568</a>&nbsp;
          发表时间: 2008年06月27日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          前面时间装了一个ubuntu 的linux 系统,装错了,哎.只好自己重装一次了,但在网上找了很多资料,感觉呢..不对路,讲得不是很正确,经过自己几番摸搜，哎，特在自己的博客上发表一下，让新手对学习linux  困难一步步的减少：<br />      安装前准备： 下载 http://ftp.itu.edu.tr/Mirror/Ubuntu/hardy/ubuntu-8.04-desktop-amd64.iso （本人的是amd64的） 还有一种是：http://ftp.itu.edu.tr/Mirror/Ubuntu/hardy/ubuntu-8.04-desktop-i386.iso   下载对应的ISO映射文件下来;    <br />ISO 这个文件放入C盘根目录<br />    安装一个启动ＤＯＣ　软件 放在附件中  <br />     从ＩＳＯ文件中:   <br />     复制 Casper和 .disk两个目录到C盘根目录; <br />     复制Casper目录中的vmlinuz和initrd.gz文件到C盘根目录; <br />     grldr 和 menu.lst 文件到C盘根目录; 这两个文件在:附件中 <br />         menu.lst 可以修改的 修改对应的ubuntu 版本 <br />  <br />  重起电脑<br />   进入界ＤＯＣ　引导中选择从 /menu.lst 启动 很快就安装好了。进了入有界面的环境 在桌面有一个intall 继续安装所有的软件和驱动 这一个非常好，可以边上网边安装  <br /><br />     我的己经装好，大空有更好的办法安装吗。多多交流，期待请大家指点和学习
          <br/>
          <span style="color:red;">
            <a href="http://programming.javaeye.com/blog/208568#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 27 Jun 2008 11:42:20 +0800</pubDate>
        <link>http://programming.javaeye.com/blog/208568</link>
        <guid>http://programming.javaeye.com/blog/208568</guid>
      </item>
      <item>
        <title>Ubuntu liunx系统 学到的几个常用命令</title>
        <author>programming</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://programming.javaeye.com">programming</a>&nbsp;
          链接：<a href="http://programming.javaeye.com/blog/207813" style="color:red;">http://programming.javaeye.com/blog/207813</a>&nbsp;
          发表时间: 2008年06月25日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          我要把我学到的知道全部会写到我的博客当中,方便大家一起学习.同时,我自己也会努力坚持下去的.<br />ubuntu更新的几种命令2008-05-28 11:481.列举本地更新<br />sudo apt-get update<br />2.安装可用更新<br />sudo apt-get upgrade<br />3.查询软件包<br />apt-cache search package_name<br />4.安装一个软件包<br />sudo apt-get install package_name<br />5.删除一个软件包<br />sudo apt-get remove package<br />6.列举其他apt-get 命令<br />apt-get help<br />7.install/unstall .deb files<br />sudo dpkg -i package_file.deb ,sudo dpkg -r package_filename<br />8.convert .rpm to .deb files<br />sudo alien package<br />9.install tarballs <br />tar xfvz tarball_name
          <br/>
          <span style="color:red;">
            <a href="http://programming.javaeye.com/blog/207813#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 25 Jun 2008 12:33:24 +0800</pubDate>
        <link>http://programming.javaeye.com/blog/207813</link>
        <guid>http://programming.javaeye.com/blog/207813</guid>
      </item>
      <item>
        <title>Ubuntu liunx系统</title>
        <author>programming</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://programming.javaeye.com">programming</a>&nbsp;
          链接：<a href="http://programming.javaeye.com/blog/207810" style="color:red;">http://programming.javaeye.com/blog/207810</a>&nbsp;
          发表时间: 2008年06月25日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          上一周,看到了,liunx 系统比较的火.我也正想学习它.就从PC (Intel x86) desktop CD :http://bw.releases.ubuntu.com/8.04/ubuntu-8.04-desktop-i386.iso , 64-bit PC (AMD64) desktop CD: http://bw.releases.ubuntu.com/8.04/ubuntu-8.04-desktop-amd64.iso <br /> <br /><br />下载下来了.装上去了.但有一个问题,每一重启第次不能看到界面,第二次重新重启,有可以进入界面,进入之后.感觉界面非常的美观,ctrl + shift + (f1,f2,....f6) 进入命令行,但是 ll 命令为什么没有用呢.奇怪,没有得到解决,原因是对liunx系统不了解,没有用过,也没有去认真学习过,但现在很喜欢它,对它情有独钟,目前在认真学习,真希望能在短时间内能在这个系统上做软件开发,希望知道的,能顶这个贴,让大家一起来学习.这个linux系统..
          <br/>
          <span style="color:red;">
            <a href="http://programming.javaeye.com/blog/207810#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 25 Jun 2008 12:30:07 +0800</pubDate>
        <link>http://programming.javaeye.com/blog/207810</link>
        <guid>http://programming.javaeye.com/blog/207810</guid>
      </item>
      <item>
        <title>一台电脑设置多个tomcat运行</title>
        <author>programming</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://programming.javaeye.com">programming</a>&nbsp;
          链接：<a href="http://programming.javaeye.com/blog/205235" style="color:red;">http://programming.javaeye.com/blog/205235</a>&nbsp;
          发表时间: 2008年06月18日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <strong>(1) 修改http访问端口（默认为8080端口）</strong><br />    &lt;Connector port="8080" maxHttpHeaderSize="8192" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" redirectPort="8443" acceptCount="100" connectionTimeout="20000" disableUploadTimeout="true" />将8080修改为第一个tomcat不在使用的端口号。此处所设的端口号即是以后访问web时所用的端口号。  8888<br /><strong>  (2) 修改Shutdown端口（默认为8005端口）</strong><br />       &lt;Server port="8005" shutdown="SHUTDOWN"><br />      将8005修改为没有在使用的端口号，例如8088   <br /><strong>  (3) 修改JVM启动端口（默认为8009端口）     </strong><br />     &lt;!-- Define an AJP 1.3 Connector on port 8009 --><br />    &lt;Connector port="8009" <br />               enableLookups="false" redirectPort="8443" protocol="AJP/1.3" /><br />   把其修改成其它没有用过的端口号;例如:8999 这样同时可以运行多少tomcat了
          <br/>
          <span style="color:red;">
            <a href="http://programming.javaeye.com/blog/205235#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 18 Jun 2008 16:52:38 +0800</pubDate>
        <link>http://programming.javaeye.com/blog/205235</link>
        <guid>http://programming.javaeye.com/blog/205235</guid>
      </item>
      <item>
        <title>职业生涯规划</title>
        <author>programming</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://programming.javaeye.com">programming</a>&nbsp;
          链接：<a href="http://programming.javaeye.com/blog/203895" style="color:red;">http://programming.javaeye.com/blog/203895</a>&nbsp;
          发表时间: 2008年06月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <strong>一、什么是职业生涯规划</strong><br /><br />职业生涯规划指的是一个人对其一生中所承担职务的相继历程的预期和计划，这个计划包括一个人的学习与成长目标，及对一项职业和组织的生产性贡献和成就期望。个体的职业生涯规划并不是一个单纯的概念，它和个体所处的家庭以及社会存在密切的关系。并且要根据实际条件具体安排。并且因为未来的不确定性，职业生涯规划也需要确立适当的变通性。虽然是规划，也不是一成不变的。同时职业规划也是个体的人生规划的主体部分。<br />用我自己的话说，职业生涯规划的意思就是：你打算选择什么样的行业，什么样的职业，什么样的组织，想达到什么样的成就，想过一种什么样的生活，如何通过你的学习与工作达到你的目标？<br /><strong><br />二、为何要进行个人职业生涯规划</strong><br />1、做好职业生涯规划，可以分析自我，以既有的成就为基础，确立人生的方向，提供奋斗的策略。<br />2、通过职业生涯规划，可以重新安排自己的职业生涯，突破生活的格线，塑造清新充实的自我。 <br />3、通过职业生涯规划，个人可以准确评价个人特点和强项，在职业竞争中发挥个人优势。<br />4、通过职业生涯规划可以评估个人目标和现状的差距，提供了前进的动力。<br />5、通过职业生涯规划可以准确定位职业方向。<br />6、通过职业生涯规划重新认识自身的价值并使其增值。通过自我评估，知道自己的优缺点，然后通过反思和学习，不断完善自己使个人价值增值。<br />7、通过职业生涯规划，全面了解自己，增强职业竞争力，发现新的职业机遇。<br /> <br />8、职业生涯规划通常建立在个体的人生规划上，因此，做好职业生涯规划将个人生活、事业与家庭联系起来，让生活充实而有条理。<br /><strong><br />三、职业生涯规划的简单步骤</strong><br />面试时候主考官常常会问这样一个问题：如果你获得这个职位，你将如何开展工作？这就是你必须回答的一个简单的职业生涯规划内容。面对日益激烈的职场竞争，每个人都不得不面对这样的问题：我未来的路在哪？如何找到我满意的工作？所以每个人其实都有潜移默化的在心里想过自己的职业规划。也许这只是一个很模糊的意识。只要通过问自己以下几个问题，职业生涯规划过程就明确了。<br />1、What you are? 首先问自己，你是什么样的人？这是自我分析过程。分析的内容包括个人的兴趣爱好、性格倾向、身体状况、教育背景、专长、过往经历和思维能力。这样对自己有个全面的了解。<br />2、What you want? 你想要什么？这是目标展望过程。包括职业目标、收入目标、学习目标、名望期望和成就感。特别要注意的是学习目标，只有不断确立学习目标，才能不被激烈的竞争淘汰，才能不断超越自我，登上更高的职业高峰。<br />3、What you can do? 你能做什么？自己专业技能何在？最好能学以致用，发挥自己的专长，在学习过程中积累自己的专业相关知识技能。同时个人工作经历也是一个重要的经验积累。判断你能够做什么。<br />4、What can support you? 什么是你的职业支撑点？你具有哪些职业竞争能力？以及你的各种资源和社会关系了。个人、家庭、学校、社会的种种关系，也许都能够影响你的职业选择。<br />5、What fit you most? 什么是最适合你的？行业和职位众多，哪个才是适合你的呢？待遇、名望、成就感和工作压力及劳累程度都不一样，看个人的选择了。选择最好的并不是合适的，选择合适的才是最好的。这就要根据前四个问题再回答这个问题。<br />6、What you can choose in the end？最后你能够选择什么？通过前面的过程，你就能够做出一个简单的职业生涯规划了。机会偏爱有准备的人，你做好了你的职业生涯规划，为未来的职业做出了准备，当然比没有做准备的人机会更多。<br /><strong><br />四、职业生涯规划的基本原则</strong><br />个人职业生涯规划设计应该遵守如下准则：<br />①择己所爱。从事一项你所喜欢的工作，工作本身就能给你一种满足感，你的职业生涯也会从此变得妙趣横生。兴趣是最好的老师，是成功之母。调查表明：兴趣与成功机率有着明显的正相关性。在设计自己的职业生涯时，务必注意：考虑自己的特点，珍惜自己的兴趣，择己所爱，选择自己所喜欢的职业。<br />②择己所长。任何职业都要求从业者掌握一定的技能，具备一定的能力条件。而一个人一生中不能将所有技能都全部掌握。所以你必须在进行职业选择时择己所长，从而有利于发挥自己的优势。运用比较优势原理充分分析别人与自己，尽量选择冲突较少的优势行业。<br />③择世所需。社会的需求不断演化着，旧的需求不断消失，新的需求不断产生。新的职业也不断产生。所以在设计你自己的职业生涯时，一定要分析社会需求，择世所需。最重要的是，目光要长远，能够准确预测未来行业或者职业发展方向，再做出选择。不仅仅是有社会需求，并且这个需求要长久。<br />④择己所利。职业是个人谋生的手段，其目的在于追求个人幸福。所以你在择业时，首先考虑的是自己的预期收益——个人幸福最大化。明智的选择是在由收入、社会地位、成就感和工作付出等变量组成的函数中找出一个最大值。这就是选择职业生涯中的收益最大化原则。<br /><br /><strong>五、结论</strong><br />通过以上的简单步骤和原则，个人就可以设计职业生涯规划了。根据不同的情况，个人可以制订一个整体生涯规划，作为一个纲领性长期规划；或者制订一个3～5年的生涯规划，作为一种发展的中期规划；或者制订一个1年的生涯规划，作为一个可操作性强，变化较小的短期规划。有了规划生活就有了目标。不会迷失前进的方向。尤其要注意的是，职业生涯规划是人生规划的主体部分，是同个人、家庭和社会生活结合在一起的，是和个人追求幸福生活密不可分的。所以制定职业生涯规划，要和个人人生目标结合起来，要把职业生涯和家庭、社会生活结合起来
          <br/>
          <span style="color:red;">
            <a href="http://programming.javaeye.com/blog/203895#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 16 Jun 2008 00:18:27 +0800</pubDate>
        <link>http://programming.javaeye.com/blog/203895</link>
        <guid>http://programming.javaeye.com/blog/203895</guid>
      </item>
      <item>
        <title>javascript 弹出窗口代码</title>
        <author>programming</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://programming.javaeye.com">programming</a>&nbsp;
          链接：<a href="http://programming.javaeye.com/blog/202753" style="color:red;">http://programming.javaeye.com/blog/202753</a>&nbsp;
          发表时间: 2008年06月13日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          弹出窗口代码<br />         经常上网的朋友可能会到过这样一些网站，一进入首页立刻会弹出一个窗口，或者按一个连接或按钮弹出，通常在这个窗口里会显示一些注意事项、版权信息、警告、欢迎光顾之类的话或者作者想要特别提示的信息。其实制作这样的页面效果非常的容易，只要往该页面的html里加入几段javascript代码即可实现。下面俺就带您剖析它的奥秘。<br /><br />【1、最基本的弹出窗口代码】<br /><br />其实代码非常简单：<br /><br /><br />&lt;script language="javascript"><br />&lt;!--<br />window.open ('page.html')<br />--><br />&lt;/script><br /><br />因为着是一段javascripts代码，所以它们应该放在〈script language="javascript"〉标签和window.open ('page.html') 用于控制弹出新的窗口page.html，如果page.html不与主窗口在同一路径下，前面应写明路径，绝对路径(http://)和相对路径(../)均可。用单引号和双引号都可以，只是不要混用。<br />这一段代码可以加入html的任意位置，＜head＞和＜/head＞之间可以，＜body＞间＜/body＞也可以，越前越早执行，尤其是页面代码长，又想使页面早点弹出就尽量往前放。<br /><br />【2、经过设置后的弹出窗口】<br /><br />下面再说一说弹出窗口的设置。只要再往上面的代码中加一点东西就可以了。<br />我们来定制这个弹出的窗口的外观，尺寸大小，弹出的位置以适应该页面的具体情况。<br /><br />&lt;script language="javascript"><br />&lt;!--<br />window.open ('page.html', 'newwindow', 'height=100, width=400, top=0,left=0, toolbar=no, menubar=no, scrollbars=no, resizable=no,location=no, status=no')<br />//写成一行<br />--><br />&lt;/script><br /><br /><br />参数解释：<br />＜script language="javascript"＞ js脚本开始；<br />window.open 弹出新窗口的命令；<br />'page.html' 弹出窗口的文件名；<br />'newwindow' 弹出窗口的名字（不是文件名），非必须，可用空''代替；<br />height=100 窗口高度；<br />width=400 窗口宽度；<br />top=0 窗口距离屏幕上方的象素值；<br />left=0 窗口距离屏幕左侧的象素值；<br />toolbar=no 是否显示工具栏，yes为显示；<br />menubar，scrollbars 表示菜单栏和滚动栏。<br />resizable=no 是否允许改变窗口大小，yes为允许；<br />location=no 是否显示地址栏，yes为允许；<br />status=no 是否显示状态栏内的信息（通常是文件已经打开），yes为允许；<br />＜<br /><br />【3、用函数控制弹出窗口】<br /><br />下面是一个完整的代码。<br /><br />&lt;html><br />&lt;head><br />&lt;script language="javascript"><br />&lt;!--<br />function openwin() { window.open ("page.html", "newwindow", "height=100, width=400, toolbar=<br />no, menubar=no, scrollbars=no, resizable=no, location=no, status=no")<br />//写成一行<br />}<br />//--><br />&lt;/script><br />&lt;/head><br />&lt;body ><br />...任意的页面内容...<br />&lt;/body><br />&lt;/html><br /><br /><br />这里定义了一个函数openwin(),函数内容就是打开一个窗口。在调用它之前没有任何用途。<br />怎么调用呢？<br />方法一：＜body ＞ 浏览器读页面时弹出窗口；<br />方法二：＜body ＞ 浏览器离开页面时弹出窗口；<br />方法三：用一个连接调用：<br />＜a href="#" ＞打开一个窗口注意：使用的“#”是虚连接。<br />方法四：用一个按钮调用：<br />＜input type="button" value="打开窗口"＞<br /><br />【4、同时弹出2个窗口】<br /><br />对源代码稍微改动一下：<br /><br />&lt;script language="javascript"><br />&lt;!--<br />function openwin()<br />{ window.open ("page.html", "newwindow", "height=100, width=100, top=0,left=0,toolbar=no, menubar=no, scrollbars=no, resizable=no, location=no, status=no")<br />//写成一行<br />window.open ("page2.html", "newwindow2", "height=100, width=100, top=100, left=100,toolbar=no, menubar=no, scrollbars=no, resizable=no, location=no, status=no")<br />//写成一行<br />}<br />//--><br />&lt;/script><br /><br /><br />为避免弹出的2个窗口覆盖，用top和left控制一下弹出的位置不要相互覆盖即可。最后用上面说过的四种方法调用即可。<br /><br />注意：2个窗口的name(newwindows和newwindow2)不要相同，或者干脆全部为空。ok？<br /><br />【5、主窗口打开文件1.htm，同时弹出小窗口page.html】<br /><br />如下代码加入主窗口＜head＞区：<br /><br /><br />&lt;script language="javascript"><br />&lt;!--<br />function openwin()<br />{window.open("page.html","","width=200,height=200")<br />}<br />//--><br />&lt;/script><br /><br />加入＜body＞区：＜a href="1.htm" ＞open＜/a＞即可。<br />【6、弹出的窗口之定时关闭控制】<br /><br />下面我们再对弹出的窗口进行一些控制，效果就更好了。如果我们再将一小段代码加入弹出的页面(注意是加入到page.html的html中，可不是主页面中，否则...)，让它10秒后自动关闭是不是更酷了？<br /><br />首先，将如下代码加入page.html文件的＜head＞区：<br /><br />&lt;script language="javascript"><br />function closeit()<br />{settimeout("self.close()",10000) //毫秒}<br />&lt;/script><br /><br />然后，再用＜body ＞ 这一句话代替page.html中原有的＜body＞这一句就可以了。(这一句话千万不要忘记写啊！这一句的作用是调用关闭窗口的代码，10秒钟后就自行关闭该窗口。)<br /><br />【7、在弹出窗口中加上一个关闭按钮】<br /><br /><br />&lt;form><br />&lt;input type='button' value='关闭' ><br />&lt;/form><br /><br />呵呵，现在更加完美了！<br /><br />【8、内包含的弹出窗口-一个页面两个窗口】<br /><br />上面的例子都包含两个窗口，一个是主窗口，另一个是弹出的小窗口。<br /><br />通过下面的例子，你可以在一个页面内完成上面的效果。<br /><br />&lt;html><br />&lt;head><br />&lt;script language="javascript"><br />function openwin()<br />{openwindow=window.open("", "newwin", "height=250, width=250,toolbar=no,scrollbars="+scroll+",menubar=no");<br />//写成一行<br />openwindow.document.write("&lt;title>例子&lt;/title>")<br />openwindow.document.write("&lt;body bgcolor=#ffffff>")<br />openwindow.document.write("&lt;h1>hello!&lt;/h1>")<br />openwindow.document.write("new window opened!")<br />openwindow.document.write("&lt;/body>")<br />openwindow.document.write("&lt;/html>")<br />openwindow.document.close()}<br />&lt;/script><br />&lt;/head><br />&lt;body><br />&lt;a href="#" >打开一个窗口&lt;/a><br />&lt;input type="button" value="打开窗口"><br />&lt;/body><br />&lt;/html><br /><br />看看 openwindow.document.write()里面的代码不就是标准的html吗？只要按照格式写更多的行即可。千万注意多一个标签或少一个标签就会出现错误。记得用openwindow.document.close()结束啊。<br /><br />【9、终极应用--弹出的窗口之cookie控制】<br /><br />回想一下，上面的弹出窗口虽然酷，但是有一点小毛病(沉浸在喜悦之中，一定没有发现吧？)比如你将上面的脚本放在一个需要频繁经过的页面里(例如首页)，那么每次刷新这个页面，窗口都会弹出一次，是不是非常烦人？:-(有解决的办法吗？yes! ;-) follow me.<br /><br />我们使用cookie来控制一下就可以了。<br /><br />首先，将如下代码加入主页面html的＜head＞区：<br /><br />&lt;script><br />function openwin()<br /><br />function get_cookie(name)<br />{var search = name + "="<br />var returnvalue = "";<br />if (document.cookie.length > 0) {<br />offset = document.cookie.indexof(search)<br />if (offset != -1) {<br />offset += search.length<br />end = document.cookie.indexof(";", offset);<br />if (end == -1)<br />end = document.cookie.length;<br />returnvalue=unescape(document.cookie.substring(offset,end))<br />}<br />}<br />return returnvalue;<br />}<br />function loadpopup(){<br />if (get_cookie('popped')==''){<br />openwin()<br />document.cookie="popped=yes"<br />}<br />}<br />&lt;/script><br /><br /><br />然后，用＜body ＞（注意不是openwin而是loadpop啊！）替换主页面中原有的＜body＞这一句即可。你可以试着刷新一下这个页面或重新进入该页面，窗口再也不会弹出了。真正的pop-only-once！<br /><br />写到这里弹出窗口的制作和应用技巧基本上算是完成了，需要注意的是，js脚本中的的大小写最好前后保持一致。
          <br/>
          <span style="color:red;">
            <a href="http://programming.javaeye.com/blog/202753#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 13 Jun 2008 00:02:23 +0800</pubDate>
        <link>http://programming.javaeye.com/blog/202753</link>
        <guid>http://programming.javaeye.com/blog/202753</guid>
      </item>
      <item>
        <title>CMS项目实现异步图片下载</title>
        <author>programming</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://programming.javaeye.com">programming</a>&nbsp;
          链接：<a href="http://programming.javaeye.com/blog/200591" style="color:red;">http://programming.javaeye.com/blog/200591</a>&nbsp;
          发表时间: 2008年06月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          业务描述: Cms 项目是我们内部的一个管理系统主要是管理内部的文章和网站的内容,  现在有这么一个需求是:我在其它网站上复制过来的文章要保存在我们的CMS系统中,但保存的要把远程的图片地扯一起保存,这样保存会出现一个问题,一但对方服务器,断开就图片显示不了,我们团队中马上想到一个解决的办法,在保存的时候分折HTML 代码,取得远程的图片地扯,然后在把图片下载下来,最后把本地的图片地扯填到原来的HTML代码中, 这种思路不可取,因为在保存文章的时候需等到图片下载完才能保存,这样会很忙,会让运营方,无法忍受这种方式,<br /><br /><br />,需得取得网上的图片SRC 然后把图片下载下来.成为我们自己的服务器上的图片, 但如果同步实现的话,会很忙,这样操作会给运营方代来了很多不便的地方,为了解决这个问题,<br /><br />  只有通过异步方式可取了,先分折HTML代码,取得SRC地扯,假设本地图片地扯存在,先填冲到HTML当中,,把假设的数据和远程的地扯保存在数据库中, 然后用线程池的方式,去读数据库中地扯下载, 这个只能在JVM起动了,就可以调用下载功能.<br /><br /><br />让运营保存的时候就不会感觉的慢了.<br /><br /><br />具体的实现如下:<br /><br /><br />   create table CMS_IMAGES<br />(<br />  id     LONG PRIMARY KEY, --id <br />  wsrc   varchar2(256),--远程图片地扯<br />  lsrc   varchar2(256),--本地图片地扯<br />  state NUMBER,  --此图片的状态  1未处理 2下载中 3下载失败<br />  last_modified  LONG --上次状态修改时间 <br />  modified_count number--状态修改次数-缺省为0<br />)<br />  先解释一下,   3下载失败了,等两个小时,重新通线程调用一次,因为有的网站,不能让你老是在他的网站上面下载图片的,只有过些时间再请求一次,就可以下载,实在不能下载的图片,比率很小,<br /><br /><br />/**<br /> * 下载图片的后台线程池<br /> * @author<br /> * @version 1.0<br /> */<br /><br /><br />public class ThreadPoolManager {<br /> protected static Logger log = LoggerFactory<br />   .getLogger(ThreadPoolManager.class);<br /><br /> private static ThreadPoolManager tpm = new ThreadPoolManager();<br /> <br /> // 线程池维护线程的最少数量<br /> private final static int CORE_POOL_SIZE = 4;<br /><br /> // 线程池维护线程的最大数量<br /> private final static int MAX_POOL_SIZE = 10;<br /><br /> // 线程池维护线程所允许的空闲时间<br /> private final static int KEEP_ALIVE_TIME = 0;<br /><br /> // 线程池所使用的缓冲队列大小<br /> private final static int WORK_QUEUE_SIZE = 10;<br /><br /> // 图片缓冲队列<br /> private Queue msgQueue = new LinkedList();<br /><br /> // 访问消息缓存的调度线程<br /> final Runnable accessBufferThread = new Runnable() {<br />  public void run() {<br />   // 查看是否有待定请求，如果有，则创建一个新的Thread，并添加到线程池中<br />   if (hasMoreAcquire()) {<br />    ImageDO image = (ImageDO) msgQueue.poll();<br />    Runnable task = new UploadThread(image);<br />    threadPool.execute(task);<br />   }<br /><br />   if (hasImagesInDB()) {<br />    try {<br />     BeanFactoryService beanFactory = (BeanFactoryService) BizServiceManager<br />       .getInstance().getService(<br />         BeanFactoryService.SERVICE_NAME);<br />     ImageManager imageManager = (ImageManager) beanFactory<br />       .getBean("imageManager");<br />     List images = imageManager<br />       .getImages(ImageDO.STATE_READY);<br />     for (int i = 0; i &lt; images.size(); i++) {<br />      ImageDO img = images.get(i);<br />      img.setState(ImageDO.STATE_RUNNING);<br />      img.setModifiedCount(img.getModifiedCount() + 1);<br />      img.setLastModified(CalendarUtil.getCurrentDate()<br />        .getTime());<br />      imageManager.updateImage(img);<br /><br />      Runnable task = new UploadThread(img);<br />      threadPool.execute(task);<br />     }<br /><br />    } catch (Exception e) {<br />     log.error("获取下载图片队列失败", e);<br />    }<br /><br />   }<br /><br />  }<br /> };<br /><br /> // 用于被拒绝任务的处理程序<br /> final RejectedExecutionHandler handler = new RejectedExecutionHandler() {<br />  public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {<br />   log.error(((UploadThread) r).getImg() + "   放入队列中重新等待执行");<br />   msgQueue.offer(((UploadThread) r).getImg());<br />  }<br /> };<br /><br /> // 管理数据库访问的线程池<br /> final ThreadPoolExecutor threadPool = new ThreadPoolExecutor(<br />   CORE_POOL_SIZE, MAX_POOL_SIZE, KEEP_ALIVE_TIME, TimeUnit.SECONDS,<br />   new ArrayBlockingQueue(WORK_QUEUE_SIZE), this.handler);<br /><br /> // 调度线程池<br /> final ScheduledExecutorService scheduler = Executors<br />   .newScheduledThreadPool(1);<br /><br /> final ScheduledFuture taskHandler = scheduler.scheduleAtFixedRate(<br />   accessBufferThread, 0, 5, TimeUnit.SECONDS);<br /><br /> public static ThreadPoolManager newInstance() {<br />  return tpm;<br /> }<br /><br /> private ThreadPoolManager() {<br /> }<br /><br /> private boolean hasMoreAcquire() {<br />  return !msgQueue.isEmpty();<br /> }<br /><br /> private boolean hasImagesInDB() {<br />  boolean result = false;<br />  try {<br />   BeanFactoryService beanFactory = (BeanFactoryService) BizServiceManager<br />     .getInstance().getService(BeanFactoryService.SERVICE_NAME);<br />   if (beanFactory == null)<br />    return false;<br />   ImageManager imageManager = (ImageManager) beanFactory<br />     .getBean("imageManager");<br />   if (imageManager == null)<br />    return false;<br />   int imagesCount = imageManager.getImagesCount(ImageDO.STATE_READY);<br />   result = (imagesCount != 0);<br />  } catch (Exception e) {<br />   log.error("获取下载图片队列失败", e);<br />  }<br />  return result;<br /> }<br /><br /> public void processImg(ImageDO img) {<br />  Runnable task = new UploadThread(img);<br />  threadPool.execute(task);<br /> }<br /> <br /> <br /> public long getCompleteTasksCount() {<br />  return this.threadPool.getCompletedTaskCount();<br /> }<br /> <br /> public long getActiveTasksCount() {<br />  return this.threadPool.getActiveCount();<br /> }<br /> <br /> public long getAllTasksCount() {<br />  return this.threadPool.getTaskCount();<br /> }<br /> <br /> public long getQuequeCount() {<br />  return this.msgQueue.size();<br /> }<br /> <br /> public boolean getRunningStatus() {<br />  return !this.threadPool.isShutdown();<br /> }<br /> <br /> public long getScheduledQuequeSize() {<br />  return ((ScheduledThreadPoolExecutor)this.scheduler).getQueue().size();<br /> }<br /> <br />}<br /><br /><br /><br />public class UploadThread implements Runnable {<br /> private ImageDO img;<br /><br /> protected Logger log = LoggerFactory.getLogger(UploadThread.class);<br /><br /> public ImageDO getImg() {<br />  return img;<br /> }<br /><br /> public void setImg(ImageDO img) {<br />  this.img = img;<br /> }<br /><br /> public UploadThread() {<br />  super();<br /> }<br /><br /> public UploadThread(ImageDO img) {<br />  this.img = img;<br /> }<br /><br /> public void run() {<br />  BeanFactoryService beanFactory = (BeanFactoryService) BizServiceManager<br />    .getInstance().getService(BeanFactoryService.SERVICE_NAME);<br />  ImageManager imageManager = (ImageManager) beanFactory<br />    .getBean("imageManager");<br />  if (UploadUtil.upload(img)) {<br />   try {<br />    log.error("下載圖片成功:"+ img);<br />    imageManager.deleteImageByid(img.getId());<br />   } catch (ManagerException e) {<br />    log.error("删除图片记录失败:"+ img.getId(), e);<br />   }<br />  } else {<br />   img.setState(ImageDO.STATE_FAIL);<br />   try {<br />    imageManager.updateImage(img);<br />   } catch (ManagerException e) {<br />    log.error("设置图片下载状态失败:"+ img.getId(), e);<br />   }<br />  }<br /> }<br /><br />}<br />public class UploadUtil {<br /> private static Logger logger = Logger.getLogger(UploadUtil.class);<br /> private static FileStorage attachmentFileStorage;<br /><br /> private static String imgServer;<br /><br /> /**<br />  * @param imgServer<br />  *            the imgServer to set<br />  */<br /> public void setImgServer(String imgServer) {<br />  UploadUtil.imgServer = imgServer;<br /> }<br /><br /> public static String getUrlPrefix() {<br />  return imgServer;<br /> }<br /><br /> public static boolean upload(ImageDO image) {<br />  String url = image.getWsrc();<br />   HttpMethod httpMethod = getHttpMethod(url);<br />   ByteArrayDataSource ds = new ByteArrayDataSource(httpMethod<br />     .getResponseBodyAsStream(), "image/jpeg");<br />   ds.setName("upload.jpg");<br />   boolean result = attachmentFileStorage.save(ds, image.getLsrc());<br />   httpMethod.releaseConnection();<br />   return result;<br />  } catch (Exception e) {<br />   logger.error("upload image fail:" + url, e);<br />  }<br />  return false;<br /> }<br /><br /> private static HttpMethod getHttpMethod(String url) throws IOException {<br />  HttpMethod httpMethod = new GetMethod(url);<br />  httpMethod.setRequestHeader("Cache-Control", "no-cache");<br />  httpMethod.setRequestHeader("Accept-Language", "zh-cn");<br />  HttpClient clientTemp = new HttpClient(); // HttpClient创建<br />  HttpClientParams clientParams = clientTemp.getParams();<br />  clientParams.setParameter("http.socket.timeout", 5000); // 5秒socket等待数据<br />  clientParams.setParameter("http.connection.timeout", 5000); // 5秒http<br />  // connection建立超时<br />  clientParams.setParameter("http.connection-manager.timeout", 5000L); // 5秒从http<br />  // yahoo相册的图片需要设置Referer头<br />  if (url.toLowerCase().indexOf("yahoo") != -1) {<br />   httpMethod.addRequestHeader("Referer", "<a href="http://forum.taobao.com/" target="_blank">http://forum.taobao.com/</a>");<br />  }<br />  // connection<br />  // manager获取可用的Http<br />  // connection超时<br />  clientParams.setParameter("http.method.retry-handler",<br />    new DefaultHttpMethodRetryHandler()); // 如果Http出错，三次重试<br />  clientTemp.executeMethod(httpMethod);<br />  return httpMethod;<br /> }<br /><br /> public void setAttachmentFileStorage(FileStorage attachmentFileStorage) {<br />  UploadUtil.attachmentFileStorage = attachmentFileStorage;<br /> }<br /><br /> public static void main(String[] args) throws Exception {<br />  HttpMethod httpMethod = getHttpMethod("<a href="http://cn.photos.yahoo.com/users/47df51c0z8a48b60a/255c/__sr_/dbce.jpg?wa86dTAyD7Rq05sklm3fMQ--&amp;F18" target="_blank">http://cn.photos.yahoo.com/users/47df51c0z8a48b60a/255c/__sr_/dbce.jpg?wa86dTAyD7Rq05sklm3fMQ--&amp;F18</a>");<br />  InputStream inputStream = httpMethod.getResponseBodyAsStream();<br />  FileOutputStream os = new FileOutputStream("c:/test.jpg");<br /><br />  IOUtils.copy(inputStream, os);<br />  os.close();<br /><br />  httpMethod.releaseConnection();<br /> }<br />}<br /><br /><br />public class HtmlParseUtil {<br /> protected static Logger log = LoggerFactory.getLogger(HtmlParseUtil.class);<br /><br /> public static String processImg(String imageURL) {<br />  if (imageURL.toLowerCase().indexOf("taobao.com") == -1) {<br />   BeanFactoryService beanFactory = (BeanFactoryService) BizServiceManager<br />     .getInstance().getService(BeanFactoryService.SERVICE_NAME);<br />   ImageManager imageManager = (ImageManager) beanFactory<br />     .getBean("imageManager");<br />   FileStorage fileStorage = (FileStorage) beanFactory<br />     .getBean("attachmentFileStorage");<br /><br />   // 产生本地扯的图片文件名<br />   String localFileName = FileNameGenerater<br />     .getLocalFileName("upload.jpg");<br /><br />   ImageDO image = new ImageDO();<br />   image.setWsrc(imageURL);<br />   image.setState(ImageDO.STATE_READY);<br />   image.setLsrc(localFileName);<br />   image.setLastModified(CalendarUtil.getCurrentDate().getTime());<br /><br />   try {<br />    imageManager.insertImage(image);<br />    <br />    log.error("新增图片下载:" + image);<br />    ThreadPoolManager tpm = ThreadPoolManager.newInstance();<br />    tpm.processImg(image);<br /><br />    return UploadUtil.getUrlPrefix() + fileStorage.getNamespace()<br />      + "/" + localFileName;<br />   } catch (ManagerException e) {<br />    log.error("新增图片下载失败:" + imageURL, e);<br />   }<br />  }<br />  return imageURL;<br /> }<br /><br />}<br /><br />看看大家有没有更好的方式,设计出JVM启动就每30秒,就会去用线程去读数据库呢.有没有更好的设计思路
          <br/>
          <span style="color:red;">
            <a href="http://programming.javaeye.com/blog/200591#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 05 Jun 2008 17:04:22 +0800</pubDate>
        <link>http://programming.javaeye.com/blog/200591</link>
        <guid>http://programming.javaeye.com/blog/200591</guid>
      </item>
      <item>
        <title>目前较为流行的Ajax框架一览</title>
        <author>programming</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://programming.javaeye.com">programming</a>&nbsp;
          链接：<a href="http://programming.javaeye.com/blog/197422" style="color:red;">http://programming.javaeye.com/blog/197422</a>&nbsp;
          发表时间: 2008年05月27日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p style="margin: 0cm 0cm 0pt;"><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';"><span lang="EN-US" style="font-size: 10pt; font-family: 'Tahoma','sans-serif'; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA;">Collected by my colleague Joe Stagner and Tim Heuer.<br /></span></span></p>
<p style="margin: 0cm 0cm 0pt;"><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">EXT-<a href="http://www.extjs.com/">http://www.extjs.com/</a>(中文：<a href="http://www.ajaxjs.com/">http://www.ajaxjs.com/</a>)<br />Microsoft Ajax - <a href="http://ajax.asp.net/"><span style="color: #0000ff;">http://ajax.asp.net</span></a> </span></p>
<p style="margin: 0cm 0cm 0pt;"><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">Java BluePrints - <a href="https://blueprints.dev.java.net/"><span style="color: #0000ff;">https://blueprints.dev.java.net/</span></a> </span></p>
<p style="margin: 0cm 0cm 0pt;"><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">Protptype - <a href="http://www.prototypejs.org/"><span style="color: #0000ff;">http://www.prototypejs.org/</span></a> </span></p>
<p style="margin: 0cm 0cm 0pt;"><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">Scriptaculus - <a href="http://script.aculo.us/"><span style="color: #0000ff;">http://script.aculo.us/</span></a> </span></p>
<p style="margin: 0cm 0cm 0pt;"><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">Laszlo - <a href="http://www.openlaszlo.org/"><span style="color: #0000ff;">http://www.openlaszlo.org/</span></a> </span></p>
<p style="margin: 0cm 0cm 0pt;"><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">GWT - <a href="http://code.google.com/webtoolkit/"><span style="color: #0000ff;">http://code.google.com/webtoolkit/</span></a> </span></p>
<p style="margin: 0cm 0cm 0pt;"><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">AJAX.net - <a href="http://www.ajaxpro.info/"><span style="color: #0000ff;">http://www.ajaxpro.info/</span></a> </span></p>
<p style="margin: 0cm 0cm 0pt;"><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">Yahoo - <a href="http://developer.yahoo.com/yui/"><span style="color: #0000ff;">http://developer.yahoo.com/yui/</span></a> </span></p>
<p style="margin: 0cm 0cm 0pt;"><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">Active Widgets - <a href="http://www.activewidgets.com/"><span style="color: #0000ff;">http://www.activewidgets.com/</span></a> </span></p>
<p style="margin: 0cm 0cm 0pt;"><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">Tibco General Interface - <a href="http://developer.tibco.com/"><span style="color: #0000ff;">http://developer.tibco.com/</span></a> </span></p>
<p style="margin: 0cm 0cm 0pt;"><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">Visual Web GUI - <a href="http://www.visualwebgui.com/"><span style="color: #0000ff;">http://www.visualwebgui.com/</span></a> </span></p>
<p style="margin: 0cm 0cm 0pt;"><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">Dojo - <a href="http://dojotoolkit.org/"><span style="color: #0000ff;">http://dojotoolkit.org/</span></a> </span></p>
<p style="margin: 0cm 0cm 0pt;"><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">Backbase - <a href="http://www.backbase.com/"><span style="color: #0000ff;">http://www.backbase.com/</span></a> </span></p>
<p style="margin: 0cm 0cm 0pt;"><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">SmartClient - <a href="http://www.smartclient.com/"><span style="color: #0000ff;">http://www.smartclient.com/</span></a> </span></p>
<p style="margin: 0cm 0cm 0pt;"><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">Nitobi - <a href="http://www.nitobi.com/"><span style="color: #0000ff;">http://www.nitobi.com/</span></a> </span></p>
<p style="margin: 0cm 0cm 0pt;"><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">JackBe - <a href="http://www.jackbe.com/"><span style="color: #0000ff;">http://www.jackbe.com</span></a> </span></p>
<p style="margin: 0cm 0cm 0pt;"><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">Zimbra - <a href="http://www.zimbra.com/"><span style="color: #0000ff;">http://www.zimbra.com/</span></a> </span></p>
<p style="margin: 0cm 0cm 0pt;"><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">Rico - <a href="http://www.openrico.org/"><span style="color: #0000ff;">http://www.openrico.org/</span></a> </span></p>
<p style="margin: 0cm 0cm 0pt;"><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">Spry - <a href="http://labs.adobe.com/technologies/spry/"><span style="color: #0000ff;">http://labs.adobe.com/technologies/spry/</span></a> </span></p>
<p style="margin: 0cm 0cm 0pt;"><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">Aflax - <a href="http://www.aflax.org/"><span style="color: #0000ff;">http://www.aflax.org/</span></a> </span></p>
<p style="margin: 0cm 0cm 0pt;"><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">DWR - <a href="http://getahead.org/dwr"><span style="color: #0000ff;">http://getahead.org/dwr</span></a> </span></p>
<p style="margin: 0cm 0cm 0pt;"><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">Moo.fx - <a href="http://moofx.mad4milk.net/"><span style="color: #0000ff;">http://moofx.mad4milk.net/</span></a> </span></p>
<p style="margin: 0cm 0cm 0pt;"><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">Mochikit - <a href="http://www.mochikit.com/"><span style="color: #0000ff;">http://www.mochikit.com/</span></a> </span></p>
<p style="margin: 0cm 0cm 0pt;"><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">Xajax - <a href="http://www.xajaxproject.org/"><span style="color: #0000ff;">http://www.xajaxproject.org/</span></a> </span></p>
<p style="margin: 0cm 0cm 0pt;"><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">Nexaweb - <a href="http://www.nexaweb.com/"><span style="color: #0000ff;"><a href="http://www.nexaweb.com/">http://www.nexaweb.com</a></span></a></span></p>
<p style="margin: 0cm 0cm 0pt;"><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';"><span>Behaviour - <a href="http://www.bennolan.com/behaviour/">http://www.bennolan.com/behaviour/</a> </span></span></p>
<p style="margin: 0cm 0cm 0pt;"><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';"><span>AJForm - <a href="http://projects.aphexcreations.net/ajform/">http://projects.aphexcreations.net/ajform/</a> </span></span></p>
<p style="margin: 0cm 0cm 0pt;"><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';"><span>Qooxdoo - <a href="http://qooxdoo.org/">http://qooxdoo.org/</a></span></span></p>
<p style="margin: 0cm 0cm 0pt;"><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';"><span>Bindows - <a href="http://www.bindows.net/">http://www.bindows.net/</a></span></span></p>
<p style="margin: 0cm 0cm 0pt;"><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';"><span>Tibet - <a href="http://www.technicalpursuit.com/ajax_indepth.htm">http://www.technicalpursuit.com/ajax_indepth.htm</a></span></span></p>
<p style="margin: 0cm 0cm 0pt;"><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';"><span>Crossvision - <a href="http://www.softwareag.com/Corporate/products/cv/appldes/default.asp">http://www.softwareag.com/Corporate/products/cv/appldes/default.asp</a></span></span></p>
<p style="margin: 0cm 0cm 0pt;"><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';"><span>Echo2 - <a href="http://www.nextapp.com/platform/echo2/echo/">http://www.nextapp.com/platform/echo2/echo/</a> </span></span></p>
<p style="margin: 0cm 0cm 0pt;"><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';"><span>Ajax Tags - <a href="http://ajaxtags.sourceforge.net/">http://ajaxtags.sourceforge.net/</a> (JSP based)</span></span></p>
<p style="margin: 0cm 0cm 0pt;"><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';"><span>WebWork - <a href="http://www.opensymphony.com/webwork/">http://www.opensymphony.com/webwork/</a> </span></span></p>
<p style="margin: 0cm 0cm 0pt;"><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';"><span>Tacos - <a href="http://tacos.sourceforge.net/">http://tacos.sourceforge.net/</a> (for Tapestry)</span></span></p>
<p style="margin: 0cm 0cm 0pt;"><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';"><span>Sajax - <a href="http://www.modernmethod.com/sajax/">http://www.modernmethod.com/sajax/</a> </span></span></p>
<p style="margin: 0cm 0cm 0pt;"><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';"><span>AjaxAC - <a href="http://ajax.zervaas.com.au/">http://ajax.zervaas.com.au/</a> </span></span></p>
<p style="margin: 0cm 0cm 0pt;"><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';"><span>JSPan - <a href="http://sourceforge.net/projects/jpspan">http://sourceforge.net/projects/jpspan</a> </span></span></p>
<p style="margin: 0cm 0cm 0pt;"><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';"><span>HTML_AJAX - <a href="http://pear.php.net/package/HTML_AJAX/">http://pear.php.net/package/HTML_AJAX/</a> (PHP)</span></span></p>
<p style="margin: 0cm 0cm 0pt;"><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';"><span>Aspects - <a href="http://ajaxaspects.blogspot.com/">http://ajaxaspects.blogspot.com/</a> </span></span></p>
<p style="margin: 0cm 0cm 0pt;"><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';"><span>WebORB - <a href="http://www.themidnightcoders.com/weborb/">http://www.themidnightcoders.com/weborb/</a></span></span></p>
<p style="margin: 0cm 0cm 0pt;"><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';"><span>TurboGears - <a href="http://www.turbogears.org/">http://www.turbogears.org/</a><br />MagicAjax - <a href="http://www.magicajax.net/">http://www.magicajax.net/</a></span> </span></p>
          <br/>
          <span style="color:red;">
            <a href="http://programming.javaeye.com/blog/197422#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 27 May 2008 13:29:08 +0800</pubDate>
        <link>http://programming.javaeye.com/blog/197422</link>
        <guid>http://programming.javaeye.com/blog/197422</guid>
      </item>
      <item>
        <title>YAHOO YUI工具库</title>
        <author>programming</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://programming.javaeye.com">programming</a>&nbsp;
          链接：<a href="http://programming.javaeye.com/blog/197420" style="color:red;">http://programming.javaeye.com/blog/197420</a>&nbsp;
          发表时间: 2008年05月27日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>1.1. YAHOO工具库提供的方法 <br />l namespace <br /><br />用于创建一个全局的命名空间，使用YUI时，首先会自动创建widget,util,example三个命名空间，使用时也可以自定义命名空间。类似于在程序中建了了一个static变量。 <br /><br />l lang <br /><br />javascript扩展的语言工具，用于判别对象的类型。 <br /><br />l lang.extend <br /><br />用于从一个对象上扩展出另一个对象，模拟了类的继承的方式，但不同的是，在创建子对象时，父对象的构造函数不会自动调用。父对象的引用存放在了子对象的supperclass中，构成了一个链状继承关系。在2.2.2的版本中，YAHOO.lang.extend和YAHOO.extend指向同一函数对象。 <br /><br />l lang.augment <br /><br />将一个对象的属性（部分或全部）复制到另一个对象，但并非真正意义上的复制，只是一种引用。YAHOO.augment=YAHOO.lang.augment。 <br /><br />l log <br /><br />用来调试的一个工具，将信息显示到log控件。 <br /><br />l env <br /><br />环境信息和YUI组件信息 <br /><br />l YUI_config.listener <br /><br />可以定义自己的回调函数，当有新的YUI组件加载到页面时将会调用YUI_config.listener指向的函数。 <br /><br /><br /><br />2. YUI提供的Dom操作 <br />特点：对于大部分DOM操作提供了批量操作的功能，而对用户只需使用统一的函数接口就能完成单个或批量的操作，主要得益于DOM内部的batch方法。 <br /><br /><br /><br />2.1. Element的查找 <br />YAHOO.util.Dom.get(element) <br /><br />调用document.getElementById(element)，获取指定的页面元素。 <br /><br /><br /><br />YAHOO.util.Dom.getElementsBy(method,tagName,rootNode) <br /><br />在rootNode的子节点中按照用户提供的method方法在所有标签为tagName的element中查找符合条件的节点。rootNode不指定则在整个Document中查找，method是一个method(elementID)类型的函数对象，该函数对象的返回值为Boolean值。 <br /><br /><br /><br />YAHOO.util.Dom.getElementsByClassName(className, tagName, rootNode) <br /><br />返回指定根节点下所有标签为tagName,class为className的DOM节点数组。根节点为可选参数，不指定时在整个页面中查找 <br /><br /><br /><br />YAHOO.util.Dom.inDocument(el) <br /><br />判断元素el是否在当前的DOM中，支持批量操作。 <br /><br /><br /><br />2.2. 样式控制和访问 <br />YAHOO.util.Dom.hasClass(element, className) <br /><br />判断element标签上是否指明了className的class，支持批量操作 <br /><br /><br /><br />YAHOO.util.Dom.addClass(element, className) <br /><br />给指定标签增加名为className的class，支持批量操作. <br /><br /><br /><br />YAHOO.util.Dom.removeClass(element, className) <br /><br />删除element上的名为className的class，支持批量操作 <br /><br /><br /><br />YAHOO.util.Dom.replaceClass(element, oldClassName, newClassName) <br /><br />替换element上的oldClassName样式为newClassName，支持批量操作 <br /><br /><br /><br />YAHOO.util.Dom.getStyle(element, property) <br /><br />获取element的style中的property属性，支持批量操作 <br /><br /><br /><br />YAHOO.util.Dom.setStyle(element,property,pValue) <br /><br />设置element的style的property属性为pValue，支持批量操作 <br /><br /><br /><br />注：本节中的class指的是CSS中定义的class。 <br /><br /><br /><br />2.3. 位置控制和访问 <br />位置控制的相关函数 <br /><br />YAHOO.util.Dom.setX <br /><br />YAHOO.util.Dom.setY <br /><br />YAHOO.util.Dom.setXY <br /><br />YAHOO.util.Dom.getX <br /><br />YAHOO.util.Dom.getXY 返回元素坐标 [ left,top ] <br /><br />YAHOO.util.Dom.getRegion <br /><br />获取元素的坐标Region对象{left,top,right,bottom} <br /><br />可支持批量操作 <br /><br /><br /><br />获取页面可视面积的高度和宽度 <br /><br />YAHOO.util.Dom.getClientWidth <br /><br />YAHOO.util.Dom.getClientHeight <br /><br /><br /><br />获取Document的高度和宽度 <br /><br />YAHOO.util.Dom.getDocumentWidth <br /><br />YAHOO.util.Dom.getDocumentHeight <br /><br /><br /><br />获取页面可视区域的高度和宽度（不包含滚动条） <br /><br />YAHOO.util.Dom.getViewportHeight <br /><br />YAHOO.util.Dom.getViewportWidth <br /><br /><br /><br />Region对象：{left,top,right,bottom} <br /><br />YUI提供的一个对象，用于完成多个矩形区域间的计算（如相交，包含。 <br /><br />YAHOO.util.Region.contains(region) <br /><br />判断是否包含了region区域 <br /><br />YAHOO.util.Region.getArea <br /><br />计算面积 <br /><br />YAHOO.util.Region.intersect(region) <br /><br />计算与region区域的交迭区域 <br /><br />YAHOO.util.Region.union(region) <br /><br />计算与region区域求并集（即包含两个区域的最小区域） <br /><br /><br /><br />Point对象：{x,y} <br /><br />YUI提供的对象，用于定义坐标点。 <br /><br />3. YUI提供的element工具 <br />YUI提供了一组操作页面element的工具，是对标准HTML elements的一种封装，能够直接通操作element的实例，使得增加监听器，操作DOM，设置/获取element的属性等工作变得很简单。部分方法是直接调用YUI的DOM工具集提供的方法，如对class操作的相关方法、获取element的相关方法等等，在此不再重复。 <br /><br />YAHOO.util.Element(elementId) <br /><br />创建element，如果elementId在Document中还不存在，仍然可以通过YUI对他进行属性设置，增加监听器等操作， Element工具集会自动等到该elementId可用后执行这些操作，实际上真正的操作是等到contentReady事件发生后才进行的。 <br /><br /><br /><br />YAHOO.util.Element.appendChild(child) <br /><br />在DOM结构中element下增加子节点 <br /><br /><br /><br />YAHOO.util.Element.getElementsByTagName(tag) <br /><br />获取tagName为tag的所有页面元素 <br /><br /><br /><br />YAHOO.util.Element.hasChildNodes <br /><br />判断是否具有子节点 <br /><br /><br /><br />YAHOO.util.Element.insertBefore(element, before) <br /><br />在元素before前插入element <br /><br /><br /><br />YAHOO.util.Element.removeChild(child) <br /><br />删除DOM中元素的child子节点 <br /><br /><br /><br />YAHOO.util.Element.replaceChild (newNode , oldNode) <br /><br />替换子节点oldNode为newNode <br /><br />4. YUI提供的Event工具集 <br />YUI提供的Event工具集简化了浏览器中事件驱动程序的编写，提供了一种简单的接口来定制事件和检查浏览器中的event对象。YUI事件工具集提供了自定义事件对象(Custom Event)，通过自定义事件对象可以&ldquo;发布&rdquo;自己感兴趣的时刻或事件，页面中的YUI组件能够响应这些自定义的事件并做出回应。 <br /><br />YUI对事件响应的顺序：通过YUI Event工具集添加的事件，默认是在冒泡过程中执行事件处理函数的。从DOM节点上来说，是从子节点向根节点响应事件。 <br /><br /><br /><br />Event需要的引入 <br />&lt;!-- Dependency --&gt; <br /><br />build/yahoo/yahoo-min.js <br /><br />&lt;!-- Event source file --&gt; <br /><br />build/event/event-min.js <br /><br /><br /><br />Event和Custom Event分别定义在YAHOO.util.Event和YAHOO.util.CustomEvent中 <br /><br />Event工具集提供的方法 <br />YAHOO.util.Event.addListener(element,eventType,fn,obj,override) <br /><br />参数： <br /><br />element：为绑定事件的元素id，可以是一个数组，以支持批量操作 <br /><br />eventType：为事件类型 <br /><br />fn：为事件响应的回调函数 <br /><br />obj：当override为true时，为回调函数传入的参数对象；当override为false时，该参数被忽略。 <br /><br />override： <br /><br />返回值类型：Boolean <br /><br />功能：给指定的element绑定事件响应函数 <br /><br /><br /><br /><br /><br />YAHOO.util.Event.removeListener:function(element,eventType,fn) <br /><br />参数： <br /><br />element：为绑定事件的元素id, <br /><br />eventType：事件类型 <br /><br />fn：为事件响应函数 <br /><br />返回值类型：Boolean <br /><br />功能：给指定的element解除绑定事件 <br /><br /><br /><br />YAHOO.util.Event.purgeElement ( el , recurse , sType ) <br /><br />参数： <br /><br />el：为绑定事件的元素id, <br /><br />recurse：Boolean值，是否解除子节点的事件绑定 <br /><br />sType：事件类型 <br /><br />返回值类型：Boolean <br /><br />功能：给指定的element解除绑定的同一类型的事件，也可以解除子节点上绑定的这一类型的事件 <br /><br /><br /><br />YAHOO.util.on <br /><br />addListener的函数别名 <br /><br /><br /><br />YAHOO.util.Event.onAvailable( p_id , p_fn , p_obj , p_override ) <br /><br />参数： <br /><br />p_id：为绑定事件的元素id, <br /><br />p_fn：为事件响应函数 <br /><br />p_obj：同addListener的obj参数 <br /><br />p_override：同addListener的override参数 <br /><br />返回值类型：无 <br /><br />功能：当指定的element的p_id出现时，执行事件响应函数。如果在页面初始化之前执行这一函数，当页面加载时（可能还未完成时），就会执行响应的事件响应函数；如果放在页面加载之后执行这一函数，将以固定的时间轮询，当element可用时响应这一事件。这个轮询的的时间是可以配置的，缺省的时间是10秒一次。 <br /><br /><br /><br />YAHOO.util.Event.onContentReady( p_id , p_fn , p_obj , p_override ) <br /><br />参数： <br /><br />p_id：为绑定事件的元素id, <br /><br />p_fn：为事件响应函数 <br /><br />p_obj：同addListener的obj参数 <br /><br />p_override：同addListener的override参数 <br /><br />返回值类型：无 <br /><br />功能：与onAvailable类似，但不同的是事件响应函数是等到element可以安全的修改的时候才响应。 <br /><br /><br /><br />YAHOO.util.Event.onDOMReady ( p_fn , p_obj , p_scope ) <br /><br />参数： <br /><br />p_fn：为事件响应函数 <br /><br />p_obj：同addListener的obj参数 <br /><br />p_scope：同addListener的override参数 <br /><br />返回值类型：无 <br /><br />功能：当DOM第一次可用时执行响应函数。 <br /><br /><br /><br />YAHOO.util.Event.preventDefault ( event) <br /><br />参数： <br /><br />event：事件对象 <br /><br />返回值类型：无 <br /><br />功能：阻止事件的缺省行为发生。 <br /><br /><br /><br />YAHOO.util.Event.getListeners ( el , sType ) <br /><br />参数： <br /><br />el：HTML element <br /><br />sType：事件类型，String类型 <br /><br />返回值类型：Object{ <br /><br />type：事件类型 <br /><br />fn：addListener添加的事件响应函数 <br /><br />obj：提供给事件响应函数的参数对象 <br /><br />adjust：否获取缺省的事件监听器 <br /><br />index：UI事件监听器列表中的位置 <br /><br />} <br /><br />功能：阻止事件的缺省行为发生。 <br /><br /><br /><br />YAHOO.util.Event.getTime( event) <br /><br />参数： <br /><br />event：事件对象 <br /><br />返回值类型：Date对象 <br /><br />功能：获取事件发生时的时间。 <br /><br /><br /><br />YAHOO.util.Event.getTarget(ev , resolveTextNode) <br /><br />参数： <br /><br />evt：事件对象 <br /><br />resolveTextNode： <br /><br />返回值类型： HTML element <br /><br />功能：获取事件发生时的页面标签。对于IE即window.event.srcElement <br /><br /><br /><br /><br /><br />5. YUI提供的CSS样式 <br />5.1. Fonts <br />字体的规范样式，需要引入build/fonts/fonts-min.css <br /><br />5.2. Reset <br />规范了所有HTML element的缺省样式，需要引入build/fonts/reset-min.css <br /><br />5.3. Grids <br />提供了用于页面排版的CSS样式，需要引入build/fonts/grids-min.css <br /><br /><br /><br />6. YUI组件 <br />6.1. Connection Manager <br />提供了访问XMLHttpRequest对象的一个简单接口 <br /><br />对象定义： <br />YAHOO.util.Connect.asyncRequest <br /><br />Connection的引入： <br />&lt;!-- Dependency --&gt; <br /><br />build/yahoo/yahoo-min.js <br /><br />&lt;!&mdash;可选项: 用到事件时引入 --&gt; <br /><br />build/event/event-min.js <br /><br />build/connection/connection-min.js <br /><br />Connection的使用 <br />1. 创建对象 <br /><br />var transaction = YAHOO.util.Connect.asyncRequest('GET', sUrl, callback, null); <br /><br />第一个参数：指明http请求的方式，可用的方式包括GET、POST、HEAD、PUT、Delete，但PUT和Delete可能在一些A级浏览器上不支持。 <br /><br />第二个参数：请求的URL <br /><br />第三个参数：回调函数，用于服务器返回数据时调用的客户端处理程序 <br /><br />第四个参数：POST方式时，提供给URL的POST参数信息。 <br /><br />[注]：A级浏览器A-Grade browsers是YUI对浏览器的一个等级划分，具体划分原则详见http://developer.yahoo.com/yui/articles/gbs/index.html <br /><br />2. 定义回调函数 <br /><br />l 在异步事物中，可以创建回调函数处理服务器的响应和相关数据，如果你不关心服务器的返回信息，也可以忽略这些回调函数，所有这些回调函数对象都是可选的，然而在大多数情况下，应该至少提供以下三个回调函数： <br /><br />success：服务器做出有效响应时的回调函数 <br /><br />failure：服务器响应了但提供了错误信息时的回调函数 <br /><br />argument：success和failure为了处理返回信息需要的参数，可以是对象、字符串、数字或者包含了数据的数组。 <br /><br />l 在使用YAHOO.util.Connect.setForm上载文件时，需要定义upload回调函数代替success和failure <br /><br />l 在回调函数中this将失去作用范围，这种情况下需要通过一个指向父对象的引用的参数来访问对象的成员。为了能够使用对象的方法作为回调函数，并维持成员的作用范围，需要定义回调函数对象的成员scope，作为this的值。 <br /><br />6.2. Button <br />对象定义：YAHOO.widget.Button <br /><br />与传统HTML Form的按钮类似，不同的是它的label可以与 value不一致。还可以创建带菜单的按钮，或者radio button、checkbox <br /><br />分类： <br />可以创建几种类型的按钮： <br /><br />button:普通的下压式按钮，可以在按钮按下时执行用户指定的代码 <br /><br />link:按下时导航至相应的URL <br /><br />submit:作用相当于form的提交按钮 <br /><br />reset:form的reset按钮 <br /><br />checkbox: <br /><br />radio: <br /><br />menubutton:按下时显示隐藏按钮 <br /><br />splitbutton:按下时执行命令或显示菜单的按钮 <br /><br /><br /><br />使用Button必需的引入: <br />&lt;!-- CSS --&gt; <br /><br />build/fonts/fonts-min.css <br /><br />build/button/assets/button.css <br /><br /><br /><br />&lt;!-- Dependencies --&gt; <br /><br />build/yahoo-dom-event/yahoo-dom-event.js <br /><br />build/element/element-beta-min.js <br /><br /><br /><br />&lt;!&mdash;使用menubutton和splitbutton要用到的 --&gt; <br /><br />build/container/container_core-min.js <br /><br />build/menu/menu-min.js <br /><br /><br /><br />&lt;!-- Source file --&gt; <br /><br />build/button/button-beta-min.js <br /><br />初始化的方式： <br />1．使用替换&lt;input&gt;或&lt;span&gt;的方式 <br /><br />constructor：YAHOO.widget.Button(sourceElementId,{配置集}) <br /><br />Button的构造器首先根据sourceElementId在DOM中查找&lt;input&gt;，一旦找到，就通过DOM的 replaceChild方法替换掉&lt;input&gt; <br /><br /><br /><br />2．使用新建的方式 <br /><br />constructor:YAHOO.widget.Button({配置集}) <br /><br />这种情况下根据配置集中指明的父id(Container)创建按钮，如果配置集中没有指明按钮则使用YAHOO.Dom.generateId生成button的ID, <br /><br /><br /><br />Button的配置集 <br />属性名称 <br />含义 <br />备注 <br /><br />id <br />替换后的新的element id <br /><br /><br />label <br />按钮上显示的文字 <br /><br /><br />check <br />按钮选中/未选中的状态 <br />checkbox用到 <br /><br />type <br />指明button的类型 <br />缺省为button <br /><br />container <br />按钮的父id <br />使用新建方式时会用到 <br /><br />srcelement <br />使用替换方式时 <br /><br /><br />menu <br />按钮对应的菜单YAHOO.widget.menu <br /><br /><br />title <br />按钮title <br />没有指定label时使用title <br /><br />href <br />按钮导航URL <br />仅在按钮类型为link时有效 <br /><br />target <br />&lt;a&gt;中的target <br />仅在按钮类型为link时有效 <br /><br />tabindex <br />按tab切换焦点时的顺序号 <br /><br /><br />onclick <br />click事件的响应函数 <br />onclick:{ <br />fn: Function, // 事件的响应函数. <br />obj: Object, // An object to pass back to the handler. <br />scope: Object // The object to use for the scope of the handler. <br />} } <br /><br /><br /><br /><br /><br /><br /><br /><br /><br />6.3. ButtonGroup <br />对象定义：YAHOO.widget.ButtonGroup <br /><br />ButtonGroup是一组按钮，同组中只能有一个按钮被选中。根节点为&lt;div&gt; <br /><br /><br /><br /><br /><br />6.4. AutoComplete <br />用户在文本输入框中输入文字时，该组件通过输入的内容查找符合输入条件的内容，并显示出所有符合条件的内容，供用户能够很快的完成正确的输入。 <br /><br /><br /><br />AutoComplete的引入 <br />&lt;!-- 必须引入 --&gt; <br /><br />build/yahoo-dom-event/yahoo-dom-event.js <br /><br />&lt;!-- 可选: Connection(用到 XHR数据源时需要的引入) --&gt; <br /><br />build/connection/connection-min.js <br /><br />&lt;!--可选: 用到动画效果时需要的引入 --&gt; <br /><br />build/animation/animation-min.js <br /><br />&lt;!-- Source file --&gt; <br /><br />build/autocomplete/autocomplete-min.js <br /><br /><br /><br />控制AutoComplete的配置集 <br />属性名称 <br />含义 <br />备注 <br /><br />animVert <br />控制下拉框向下展开的动画效果 <br /><br /><br />animHoriz <br />控制下拉框水平方向展开的动画效果 <br /><br /><br />animSpeed <br />控制动画的速度 <br /><br /><br />delimChar <br />一行显示多条记录时的分隔符，可以是字符串数组或字符串 <br /><br /><br />maxResultsDisplayed <br />结果集的最大显示行数 <br /><br />minQueryLength <br />进行查询前的输入的字符个数 <br /><br />queryDelay <br />用户键入字符后多少秒开始查询，默认0.5 <br /><br />autoHighlight <br />查询出来的结果集显示后，是否高亮显示第一条，默认为true <br /><br />highlightClassName <br />高亮显示的样式名，默认为yui-ac-highlight <br /><br />prehightlightClassName <br />鼠标移动到下拉框的一行上时，那一行的样式，默认为yui-ac-prehighlight <br /><br />useShadow <br />下拉框是否有阴影 <br /><br />useIFrame <br />下拉框欠套在一个iframe中，用于解决IE中覆盖&lt;select&gt;的问题 <br /><br />forceSelection <br />限制输入内容必须为查询结果中的内容，如果不是则输入内容被删除 <br /><br />typeAhead <br />是否自动根据查询结果的第一条补齐到autocomplete中 <br /><br />allowBrowserAutocomplete <br />是否允许浏览器提供的输入框记忆功能，默认为false <br /><br />alwaysShowContainer <br />是否始终显示查询结果的下拉框，默认为false <br /><br /><br /><br />AutoComplete的使用 <br />1 自定义事件(CustomEvent) <br /><br />AutoComplete除了默认的事件外，还有自定义的事件，以下为AutoComplete用到的各种CustomEvent <br /><br />事件回调函数 <br />含义 <br />备注 <br /><br />textboxFocusEvent <br />输入框获得焦点的事件 <br />textboxFocus <br /><br />textboxKeyEvent <br />按键弹起时的事件 <br />textboxKey <br /><br />dataRequestEvent <br />发出数据查询请求时的事件 <br />dataRequest <br /><br />dataReturnEvent <br />数据查询请求返回时的事件 <br />dataReturn <br /><br />dataErrorEvent <br />返回结果为空时的事件 <br />dataError <br /><br />containerExpandEvent <br />展开下拉框时的事件 <br />containerExpand <br /><br />typeAheadEvent <br />符合条件的结果自动用到第一条记录补齐时的事件 <br />typeAhead <br /><br />itemMouseOverEvent <br />鼠标移动到结果项上的事件 <br />itemMouseOver <br /><br />itemMouseOutEvent <br />鼠标移出结果项的事件 <br />itemMouseOut <br /><br />itemArrowToEvent <br />移动到某一选择项时的事件 <br />itemArrowTo <br /><br />itemArrowFromEvent <br />移出某一选择项时的事件 <br />itemArrowFrom <br /><br />itemSelectEvent <br />选中某一选择项的事件 <br />itemSelect <br /><br />unmatchedItemSelectEvent <br />forceSelection为false时，如果输入了不符合查询结果的内容时触发本事件。 <br />unmatchedItemSelect <br /><br />selectionEnforceEvent <br />强制从结果集中选择输入项时触发的事件 <br />selectionEnforce <br /><br />containerCollapseEvent <br />下拉框收缩时的事件 <br />containerCollapse <br /><br />textboxBlurEvent <br />输入框失去焦点时的事件 <br />textboxBlur <br /><br /><br /><br />可以根据需要重载自定义的事件 <br /><br />例：输入框获得焦点时自动进行查询，可以重载textboxFocusEvent <br /><br />myAutoComp.textboxFocusEvent.subscribe( <br /><br />//发送一个查询条件为空的查询请求 <br /><br />function(){myAutoComp.sendQuery("");} <br /><br />); <br /><br />2 格式化下拉框的输出 <br /><br />如果返回的结果集中有多个属性，可以通过重载formatResult来格式化结果项的输出 <br /><br />oAutoComp.formatResult = function(oResultItem, sQuery) { <br /><br />var sMarkup = oresultItem[0] + " (" + oresultItem[1] + ")" ; <br /><br />return (sMarkup); <br /><br />} <br /><br />3 AutoComplete的数据源 <br /><br />l DS_JSArray <br /><br />data = ["AAA","BBB","BCC"]; <br /><br />var myDataSource = new YAHOO.widget.DS_JSArray(data); <br /><br />可以通过DWR的方式调用java方法获得一字符串数组作为查询的下拉框，并在回调函数中可以直接使用，如： <br /><br />l DS_JSFunction <br /><br />l DS_XHR <br /><br />对于JSArray方式取数时，AutoComplete可以自动根据输入的内容查在JSArray中查找符合条件的结果项，但在使用XHR方式时，YUI并没有提供默认的查找功能，必须由用户通过控制URL参数方式来实现这一功能。 <br /><br />JSON方式： <br /><br />使用JSON格式时，创建数据源YAHOO.widget.DS_XHR时第一个参数为请求的URL，第二个参数为一数组，这一数组的第一条记录表示结果集在JSON对象的哪个对象属性下，如类似于下面结构的JSON对象 <br /><br />{ <br /><br />Result:{ <br /><br />data:[ {username:&rdquo;Tom&rdquo;,oldname:&rdquo;Tom&rdquo;,age:12&rdquo;}, <br /><br />{username:&rdquo;Jack&rdquo;,oldname:&rdquo;Jack&rdquo;,age:16&rdquo;} <br /><br />] <br /><br />} <br /><br />} <br /><br />如果是要查询username则结果集应该表示为&rdquo;Result.data&rdquo;， <br /><br />第二条记录为搜索的主键，同上面的例子中如果是要查找出符合条件的username，则第二个数组应为&rdquo;username&rdquo;,如果返回的结果集中还需要返回oldname属性，则应该指名数组的第三条记录&rdquo;oldname&rdquo;,后面还可以指定更多的需要返回的属性。 <br /><br />因此第二个数组对象参数可以用以下方法表示： <br /><br />[结果对象,搜索的主键,额外的返回属性1,&hellip;额外的返回属性N] <br /><br />function initAutocomplete(){ <br /><br />var myDataSource1 = new YAHOO.widget.DS_XHR( <br /><br />"./queryUsername.action", <br /><br />["data","username"]); <br /><br />myDataSource1.responseType = YAHOO.widget.DS_XHR.TYPE_JSON; <br /><br />//myDataSource1.scriptQueryAppend = "output=json&amp;results=100"; <br /><br />var oAutoComp = new YAHOO.widget.AutoComplete("user_username", <br /><br />"usernameContainer", myDataSource1); <br /><br />oAutoComp.dataRequestEvent.subscribe( <br /><br />function(oSelf,sQuery){ <br /><br />myDataSource1.scriptQueryParam = "username"; <br /><br />}); <br /><br />} <br /><br /><br /><br />XML方式： <br /><br />应用方式与JSON方式类似，只是将reponseType指定为 <br /><br />myDataSource1.responseType = YAHOO.widget.DS_XHR.TYPE_XML <br /><br /><br /><br />FlatData方式： <br /><br />6.5. DataTable <br />DataTable的引入 <br />&lt;!&mdash;需要的CSS --&gt; <br /><br />build/datatable/assets/datatable.css <br /><br />&lt;!--必须的引入 --&gt; <br /><br />build/yahoo-dom-event/yahoo-dom-event.js <br /><br />&lt;!-- 可选项，用到XHR取数方式时需要 --&gt; <br /><br />build/connection/connection-min.js <br /><br />&lt;!&mdash;可选项，用到调整列宽时需要 --&gt; <br /><br />build/dragdrop/dragdrop-min.js <br /><br />&lt;!-- Source files --&gt; <br /><br />build/datasource/datasource-beta-min.js <br /><br />build/datatable/datatable-beta-min.js <br /><br />DataTable的使用 <br /><br /><br />1. 定义表头 <br /><br />var myColumnHeaders = [ <br /><br />{key:"name", text:"姓名"}, <br /><br />{key:"stdno", text:"学号"}, <br /><br />{key:"age", text:"年龄", type:"number"} <br /><br />]; <br /><br />YAHOO.widget.ColumnSet的属性说明 <br /><br />属性名称 <br />含义 <br /><br />key <br />列的属性名 <br /><br />text <br />列的显示名称 <br /><br />type <br />列的类型，包括"string", "number", "date", "currency", "checkbox", "select", "email", "link"，缺省为&rdquo;string&rdquo; <br /><br />resizeable <br />Boolean值，是否可通过拖动改变列宽度 <br /><br />sortable <br />Boolean值，是否可排序 <br /><br />abbr <br /><br /><br />children <br />定义子表头，类型为YAHOO.widget.ColumnSet <br /><br />width <br />列宽度，单位为px <br /><br />className <br />定义本列单元格的样式名称 <br /><br />formatter <br />定义本列单元格的格式化函数 <br /><br />function(elCell, oRecord, oColumn, oData) <br /><br />parse <br /><br /><br />editor <br />定义可编辑的列，可用的值为&rdquo;textbox&rdquo;，&rdquo;textarea&rdquo; <br /><br />descFunction <br />递减排序的函数function(a,b) <br /><br />ascFunction <br />递增排序的函数function(a,b) <br /><br /><br /><br /><br /><br />2. 创建datatable <br /><br />var myDataTable = new YAHOO.widget.DataTable( <br /><br />"myContainer", //datatable绑定的页面element(DIV) <br /><br />myColumnSet, //表头定义, YAHOO.widget.ColumnSet <br /><br />myDataSource, //数据源 <br /><br />{caption:"My Caption",summary:"摘要"} //datatable的配置集 <br /><br />); <br /><br />DataTable的配置集 <br /><br />属性名称 <br />含义 <br /><br />caption <br />表格的表头文字 <br /><br />summary <br />表格摘要 <br /><br />paginator <br />Boolean值，是否分页，缺省为false <br /><br />paginatorOptions <br />{ <br /><br />containers: <br /><br />rowsPerPage: 每页显示的记录数, <br /><br />pageLinks: 最多显示的页面链接数，0为全部 <br /><br />currentPage:当前页 <br /><br />dropdownOptions:下拉框选择项，null表示不使用下拉框 <br /><br />} <br /><br />initialRequest <br />XHR方式下，附加的请求参数 <br /><br />fixedWidth <br />固定表格宽度 <br /><br />scrollable <br />表格有滚动条，滚动时表格表头保持不动，Boolean值 <br /><br />rowSingleSelect <br />只允许选择一行，Boolean值 <br /><br />contextMenu <br />表格的上下文菜单，右键弹出，YAHOO.widget.ContextMenu <br /><br />sortedBy <br />{colKey：排序的列, <br /><br />dir: 排序的方向，"desc"和"asc" } <br /><br />pageCurrent <br />表格的当前页 <br /><br /><br /><br /><br /><br />3. DataTable的数据源 <br /><br />DS_JSArray <br /><br />以对象数组的方式使用，可以是在客户端定义对象数组，也可以通过DWR的方式调用JAVA的方法获取一个JAVA类的List列表，在回调函数中以数组方式使用。 <br /><br />var commonDataSource = new YAHOO.util.DataSource(data); <br /><br />//data可以为用javascript定义的对象数组，也可以是DWR方式下回调函数的参数 <br /><br />commonDataSource.responseType = YAHOO.util.DataSource.TYPE_JSARRAY; <br /><br />JSON <br /><br />使用JSON对象时 <br /><br />var myDataSource = new YAHOO.util.DataSource("query.action"); <br /><br />myDataSource.responseType = YAHOO.util.DataSource.TYPE_JSON; <br /><br />myDataSource.responseSchema = { <br /><br />resultsList: "result.data",// 结果集所在的JSON结构中的对象 <br /><br />fields: ["id","username","email","monicker","edit","del"] <br /><br />}; <br /><br />XML <br /><br />var myDataSource = new YAHOO.util.DataSource("query.action"); <br /><br />myDataSource.responseType = YAHOO.util.DataSource.TYPE_XML; <br /><br />myDataSource.responseSchema = { <br /><br />resultNode: "Item", // 结果集所在的XML结构中的结点 <br /><br />fields: ["Company","Title","Name","Phone","Email"] //表格的列 <br /><br />}; <br /><br />Plain Text Data <br /><br />var myDataSource = new YAHOO.util.DataSource("query.action"); <br /><br />myDataSource.responseType = YAHOO.util.DataSource.TYPE_TEXT; <br /><br />myDataSource.responseSchema = { <br /><br />recordDelim: ""n", // 记录的分割符 <br /><br />fieldDelim: ",", // 字段的分割符 <br /><br />fields: ["Company","Title","Name","Phone","Email"] //表格的列 <br /><br />}; <br /><br />4. DataTable数据的访问 <br /><br />这里主要指通过javascript访问DataTable数据时采用的方式。 <br /><br />var rs = YAHOO.Claim.commonDataTable.getRecordSet(); <br /><br />var obj = rs.getRecord(i); //获取第i行的数据对象 <br /><br />对象obj的属性就是定义表头时指定的各列的key值，可以通过obj[key值]访问该行上的各列属性值。 <br /><br />5. 测试 <br /><br />6.6. DragDrop <br />6.7. TreeView <br />6.8. Container <br />一组模拟windows控件的组件 <br /><br />Container下的控件继承关系 <br />Overlay <br /><br />Module <br /><br />ToolTip <br /><br />Dialog <br /><br />SimpleDialog <br /><br />Panel <br /><br /><br /><br />Container的引入 <br />&lt;!-- Dependencies --&gt; <br /><br />build/yahoo-dom-event/yahoo-dom-event.js <br /><br />&lt;!&mdash;可选项：如果不使用Dialog/SimpleDialog则不需要 --&gt; <br /><br />build/connection/connection-min.js <br /><br />&lt;!&mdash;可选项：使用动画效果时用到 --&gt; <br /><br />build/animation/animation-min.js <br /><br />&lt;!-- Source file --&gt; <br /><br />build/container/container-min.js <br /><br />6.8.1. Container下的控件 <br />由于Container下的控件的创建方式和属性控制方式基本相同，可以在创建组件时通过config对象指定控件的各项属性，也可以在创建后通过myContainer.cfg.setAttribute来设置控件属性，通过对这些属性的控制来实现控件的不同动作表现。因此对于各个子控件的属性在下面采用配置集的方式用一个表格来说明。 <br /><br />Module <br />一种最基础的控件模块，通过Module可以创建一个从HTML中继承下来的javascript对象，你可以操作页面中的module,也可以动态创建新的module。module是没有预定义样式的，必须手动定义。 <br /><br />使用Module必需的引入 <br />build/yahoo-demo/yahoo-dom-event.js <br /><br />build/container/container_core-min.js <br /><br /><br /><br />初始化的方式： <br />constructor：YAHOO.widget.Module(ModuleId,{配置集}); <br /><br />moduleId如果页面中已经定义了moduleId,则可以直接调用render函数将设置的各种属性直接应用到module上，如果页面中没有定义这个id,则必须调用render(DOM中已经存在的element)将module插入到DOM中。 <br /><br />显示/隐藏Module <br />方式一： <br /><br />myModule.show(); <br /><br />myModule.hide(); <br /><br />方式二： <br /><br />myModule.cfg.setProperty("visible", true); <br /><br />myModule.cfg.setProperty("visible", false); <br /><br />配置集的说明 <br />属性名称 <br />含义 <br />备注 <br /><br />visible <br />Module是否可见，Boolean值 <br /><br /><br />monitorresize <br />设置是否创建一个不可见的屏幕元素用来监听DOM中文字大小的改变，Boolean值 <br /><br /><br /><br /><br /><br /><br />6.8.2. Overlay <br />对Module的一种扩展，但和Module不同的是Overlay可以通过绝对方式定位，并且是浮动窗口，不会影响页面中原有的内嵌标签的布局。与Module相同的是：也没有预先定义样式，必须手动设置。 <br /><br />初始化的方式 <br />与Module相同 <br /><br />位置设定 <br />1．绝对定位： <br /><br />myOverlay.cfg.setProperty("x", 100); <br /><br />myOverlay.cfg.setProperty("y", 200); <br /><br />myOverlay.cfg.setProperty("xy", [100,200]); <br /><br />2．居中 <br /><br />窗口中居中：myOverlay.center(); <br /><br />屏幕居中：myOverlay.cfg.setProperty("fixedcenter", true); <br /><br />3．对齐 <br /><br />// myOverlay's右上角对齐myContextEl的左上角 <br /><br />myOverlay.cfg.setProperty("context", ["myContextEl", "tr", "tl"]); <br /><br />设置过对齐方式后可以直接使用align来改变对齐方式 <br /><br />// myOverlay's 右上角对齐 "myContextEl"'s 左下角. <br /><br />myOverlay.align("tr", "bl"); <br /><br />注：对齐方式的写法: top-&gt;t ,left -&gt;l, ,bottom-&gt;,right-&gt;r <br /><br />top-left 就表示为tl <br /><br /><br /><br />配置集 <br />属性名称 <br />含义 <br /><br />x <br />设置元素的left属性 <br /><br />y <br />设置元素的top属性 <br /><br />xy <br />设置元素的top,left属性 <br /><br />context <br />停靠位置，[element, Overlay的顶角, 被停靠的element顶角] <br /><br />effect <br />当Overlay显示或隐藏时的特效对象. <br /><br />fixedcenter <br />窗口大小改变或滚屏时保持居中 <br /><br />width <br />设置元素的width <br /><br />height <br />设置元素的height <br /><br />zIndex <br />设置Overlay的遮盖顺序 <br /><br />constraintoviewport <br />设置为true时保持在视窗边界以内 <br /><br />iframe <br />设置为true时在Overlay后将存在一个ifram,防止被Z序高的element覆盖 <br /><br /><br /><br /><br /><br />已知的特效： <br /><br />YAHOO.widget.ContainerEffect.SLIDE <br /><br />YAHOO.widget.ContainerEffect.FADE 逐步变淡 <br /><br />OverlayManage <br />用于管理多个Overlay的组件，能够模拟类似于多窗口管理系统的交互，使得各个Overlay之间的能够正确的覆盖、获得焦点/失去焦点。 <br /><br />使用这一功能需要的代码很简单，只需要通过register方法登记所有需要纳入窗口管理的Overlay就可以了。 <br /><br />//示例： <br /><br />YAHOO.namespage(&ldquo;demo&rdquo;); <br /><br />YAHOO.demo.manager = new YAHOO.widget.OverlayManager(); <br /><br />YAHOO.demo.manager.register( [Overlay的数组列表] ); <br /><br />6.8.3. Tooltip <br />对象定义：YAHOO.widget.Tooltip <br /><br />从overlay上扩展出来的控件，小的浮动窗口，动态生成，提供了预定义的样式。 <br /><br /><br /><br />Tooltip的引入 <br />&lt;!-- CSS --&gt; <br /><br />build/container/assets/container.css <br /><br />&lt;!-- Dependencies --&gt; <br /><br />build/yahoo-dom-event/yahoo-dom-event.js <br /><br />&lt;!&mdash;如果要改变页面元素的属性需要引入--&gt; <br /><br />build/animation/animation-min.js <br /><br />&lt;!-- Source file --&gt; <br /><br />build/container/container-min.js <br /><br />Tooltip初始化方式 <br />constructor：YAHOO.widget.Tooltip(tooltipId , { 配置集 } ); <br /><br />tooltipId可以是页面中未声明的控件。 <br /><br /><br /><br />Tooltip配置集 <br />属性名称 <br />含义 <br /><br />text <br />提示文字 <br /><br />context <br />鼠标停靠element ID <br /><br />container <br />缺省为document.body，指明容器元素 <br /><br />preventoverlap <br />缺省为true,指明是否使用覆盖方式 <br /><br />showdelay <br />显示tooltip的延迟时间，单位毫秒 <br /><br />hidedelay <br />隐藏tooltip的延迟时间，单位毫秒 <br /><br />autodismissdelay <br />The number of milliseconds to wait before automatically dismissing a Tooltip after the mouse has been resting on the context element. <br /><br /><br /><br />同时还继承了Module,Overlay的所有属性 <br /><br /><br /><br />6.8.4. Panel <br />从overlay扩展出来的一个组件，类似于操作系统的窗口。他不同于浏览器的弹出窗口，是内嵌在页面文件中的一种动态Html的element。他在overlay的基础上扩展了一些窗口的功能，如关闭、拖放等。Panel使用了预定义的样式表 <br /><br />Panel的引入 <br />&lt;!-- CSS --&gt; <br /><br />build/container/assets/container.css <br /><br />&lt;!-- Dependencies --&gt; <br /><br />build/yahoo-dom-event/yahoo-dom-event.js <br /><br />&lt;!&mdash;可选项：如果用到动画时需要引入 --&gt; <br /><br />build/animation/animation-min.js <br /><br />&lt;!&mdash;可选项：如果用到拖放时需要引入--&gt; <br /><br />build/dragdrop/dragdrop-min.js <br /><br />&lt;!-- Source file --&gt; <br /><br />build/container/container-min.js <br /><br />Panel的初始化 <br />constructor： <br /><br />YAHOO.widget.Panel(panelId); //使用缺省配置选项 <br /><br />YAHOO.widget.Panel(panelId,{自定义的配置项}); //使用自定义的配置项 <br /><br />Panel的配置集 <br />属性名称 <br />含义 <br /><br />close <br />是否显示关闭按钮，true/false <br /><br />draggable <br />是否可以拖动 <br /><br />underlay <br />阴影显示方式 shadow,none,matte,缺省为shadow，none为无阴影，matte为白色边界 <br /><br />modal <br />Panel获得焦点时，是否允许使用Panel以外的控件获得焦点，类似于MFC的模态/无模态对话框 <br /><br />keylisteners <br />响应按键事件的监听器列表 <br /><br /><br /><br />Panel同时还继承了Module,Overlay的属性 <br /><br />6.8.5. Dialog <br />从Panel上扩展出来的组件，类似于Windows的窗口，在浏览器中提供了一种不用页面跳转就能使用交互来获取用户输入的交互方式，用户输入的数据都是通过一个标准的HTML Form获取的，并支持多种的获取输入数据的方式：普通的Form的提交，XMLHttpRequest，或者完全通过脚本来读取。 <br /><br />Dialog的引入 <br />&lt;!-- CSS --&gt; <br /><br />build/container/assets/container.css <br /><br />&lt;!-- Dependencies --&gt; <br /><br />build/yahoo-dom-event/yahoo-dom-event.js <br /><br />&lt;!&mdash;可选项: Animation (only required if enabling Animation) --&gt; <br /><br />build/animation/animation-min.js <br /><br />&lt;!&mdash;可选项: Drag &amp; Drop (only required if enabling Drag &amp; Drop) --&gt; <br /><br />build/dragdrop/dragdrop-min.js <br /><br />&lt;!--可选项: Connection (only required if performing asynchronous submission) --&gt; <br /><br />build/connection/connection-min.js <br /><br />&lt;!-- Source file --&gt; <br /><br />build/container/container-min.js <br /><br />Dialog的初始化 <br />constructor：YAHOO.widget.Dialog(dialogId); <br /><br />dialogId为页面中已经申明的element <br /><br />Dialog的配置集 <br />属性名称 <br />含义 <br /><br />postmethod <br />窗口提交的方式，async：异步，form：标准的submit，none：不提交 <br /><br />buttons <br />dialog中的button数组列表， <br /><br /><br /><br />同时继承了Overlay，Panel的属性 <br /><br />单个按钮对象的定义方式： <br /><br />{ text:按钮上的文本, <br /><br />handler:按钮的click事件响应函数 <br /><br />isDefault:是否缺省按钮}, <br /><br /><br /><br />6.8.6. SimpleDialog <br />从Dialog上扩展出来的一个组件,主要用于处理用户选择Yes/NO，OK/Cancel的交互 <br /><br />SimpleDialog的引入 <br />&lt;!-- CSS --&gt; <br /><br />build/container/assets/container.css <br /><br />&lt;!-- Dependencies --&gt; <br /><br />build/yahoo-dom-event/yahoo-dom-event.js <br /><br />&lt;!&mdash;可选项：用到动画效果时使用 --&gt; <br /><br />build/animation/animation-min.js <br /><br />&lt;!&mdash;可选项：用到拖放功能时使用--&gt; <br /><br />build/dragdrop/dragdrop-min.js <br /><br />&lt;!&mdash;可选项：用到异步提交方式时使用) --&gt; <br /><br />build/connection/connection-min.js <br /><br />&lt;!-- Source file --&gt; <br /><br />build/container/container-min.js <br /><br />SimpleDialog的初始化 <br />constructor：YAHOO.widget.SimpleDialog(dialogId,{配置集}); <br /><br />dialogId为页面中已经申明的element <br /><br />SimpleDialog的配置集 <br />属性名称 <br />含义 <br /><br />text <br />对话框中显示的提示信息 <br /><br />icon <br />按钮图标： <br /><br />ICON_BLOCK, <br /><br />ICON_WARN, <br /><br />ICON_HELP, <br /><br />ICON_INFO, <br /><br />ICON_ALARM, <br /><br />ICON_TIP. <br /><br /><br /><br /><br /><br />6.9. Grids <br />支持不规定宽度的设计 <br /><br />一组用于定义界面版式的样式表(CSS文件) <br /><br />6.10. TabView <br />用来创建导航tab栏组件 <br /><br />可以从HTML中的已经存在的标签来创建，也可以完全通过javascript创建，该组件的最上层元素为&lt;div&gt;，每一个tab页面项使用&lt;li&gt; <br /><br />TableView的引入 <br />&lt;!-- Dependencies --&gt; <br /><br />&lt;!-- core CSS --&gt; <br /><br />/build/tabview/assets/tabview.css <br /><br />&lt;!-- optional skin for border tabs --&gt; <br /><br />build/tabview/assets/border_tabs.css <br /><br />build/yahoo-dom-event/yahoo-dom-event.js <br /><br />build/element/element-beta-min.js <br /><br />&lt;!&mdash;可选项: 使用动态加载时使用--&gt; <br /><br />build/connection/connection-min.js <br /><br />&lt;!-- Source file --&gt; <br /><br />build/tabview/tabview-min.js <br /><br />TableView的初始化 <br />constructor：YAHOO.widget.TabView(tableViewId); <br /><br />创建的方式： <br /><br />1．页面中存在id <br /><br />&lt;div id="demo" class="yui-navset"&gt; <br /><br />&lt;ul class="yui-nav"&gt; <br /><br />&lt;li class="selected"&gt;&lt;a href="#tab1"&gt;&lt;em&gt;Tab One Label&lt;/em&gt;&lt;/a&gt;&lt;/li&gt; <br /><br />&lt;li&gt;&lt;a href="#tab2"&gt;&lt;em&gt;Tab Two Label&lt;/em&gt;&lt;/a&gt;&lt;/li&gt; <br /><br />&lt;li&gt;&lt;a href="#tab3"&gt;&lt;em&gt;Tab Three Label&lt;/em&gt;&lt;/a&gt;&lt;/li&gt; <br /><br />&lt;/ul&gt; <br /><br />&lt;div class="yui-content"&gt; <br /><br />&lt;div&gt;&lt;p&gt;Tab One Content&lt;/p&gt;&lt;/div&gt; <br /><br />&lt;div&gt;&lt;p&gt;Tab Two Content&lt;/p&gt;&lt;/div&gt; <br /><br />&lt;div&gt;&lt;p&gt;Tab Three Content&lt;/p&gt;&lt;/div&gt; <br /><br />&lt;/div&gt; <br /><br />&lt;/div&gt; <br /><br /><br /><br />注： <br /><br />yui-navset为css文件中定义的TableView的样式 <br /><br />yui-nav为css文件中定义的Tab页标签的样式 <br /><br /><br /><br />2．完全使用JavaScript创建TabView <br /><br />&lt;script type="text/javascript"&gt; <br /><br />var myTabs = new YAHOO.widget.TabView("demo"); <br /><br /><br /><br />myTabs.addTab( new YAHOO.widget.Tab({ <br /><br />label: 'Tab One Label', <br /><br />content: '&lt;p&gt;Tab One Content&lt;/p&gt;', <br /><br />active: true <br /><br />})); <br /><br /><br /><br />myTabs.addTab( new YAHOO.widget.Tab({ <br /><br />label: 'Tab Two Label', <br /><br />content: '&lt;p&gt;Tab Two Content&lt;/p&gt;' <br /><br />})); <br /><br /><br /><br />myTabs.appendTo(document.body); <br /><br />&lt;/script&gt; <br /><br /><br /><br />TableView的配置集 <br />属性名称 <br />含义 <br /><br />activeIndex <br />当前激活的Tab页面编号，第一页为0 <br /><br />activeTab <br />YAHOO.widget.Tab，指向被激活的Tab页， <br /><br />element <br />被绑定的HTML元素 <br /><br />orientation <br />页面标签所在的位置，top，bottom，left，right 默认为top <br /><br />tabs <br />标签页(Tab)的数组列表，只读 <br /><br /><br /><br /><br /><br />Tab的配置集 <br /><br /><br />属性名称 <br />含义 <br /><br />active <br />当前Tab页面是否激活，Boolean值 <br /><br />cacheData <br />Tab页加载数据的时候是否隐藏，只有dataSrc可用的时候有效 <br /><br />content <br />激活页面的文字标签 <br /><br />contentEl <br /><br /><br />dataLoaded <br />数据是否加载完成 <br /><br />dataSrc <br />如果设置了这一属性，当Tab页被激活时，页面数据从这个URL处加载，需要用到Connection Manager <br /><br />dataTimeout <br />Tab页加载的超时时间，单位微秒，只有在设置了dataSrc才有效 <br /><br />disabled <br />是否禁止激活本Tab页，缺省为false <br /><br />label <br />Tab页的标签 <br /><br />labelEl <br />Tab页的HTML容器元素 <br /><br />loadMethod <br />数据请求的方式，缺省为GET，只有在设置了dataSrc才有效 <br /><br /><br /><br /><br /><br />TabView用到的CSS定义 <br />Class <br />描述 <br /><br />yui-navset <br />TabView的&lt;div&gt; <br /><br />yui-nav <br />TabView的&lt;ul&gt; <br /><br />yui-content <br />TabView的&lt;div&gt;的下一级&lt;div&gt; <br /><br />disabled <br />Tab页面不可用时的样式，应用在&lt;ul&gt;上 <br /><br />selected <br />Tab页面激活时的样式，应用在&lt;ul&gt;上 <br /><br />loading <br />Tab页面加载时的样式，TabView的&lt;div&gt;的下一级&lt;div&gt;的样式 <br /><br /><br /><br /><br /><br />7. 常见问题 <br />7.1. YUI提供的javascript的文件引入 <br />关于引入的版本： <br />YUI对于需要引入的js文件都提供了多个版本： <br /><br />1 min是去掉空格后的版本，在正式项目中建议使用min版。 <br /><br />2 debug是调试的版本，主要结合YUI的log组件使用。 <br /><br />3 beta版 <br /><br />4 不带后缀的为便于阅读的版本 <br /><br /><br /><br />yahoo-dom-event.js是包含了yahoo.js，dom.js，event.js的内容，使用了前者后就无需再引入后面三个文件。 <br /><br />关于引入的顺序： <br />1．大部分组件都是依赖于事件驱动，并通过YUI提供的工具集进行DOM操作的，因此yahoo.js，dom.js，event.js或者这三个文件的合成文件yahoo-dom-event.js必须早于其他YUI的js文件引入 <br /><br />2．Autocomplete如果需要从服务器取数据时，要用到YUI提供的datasource.js，因此datasource.js必须在autocomplete.js之前引入；如果是以XHR（JSON，XML等）的方式取数，还要用到YUI提供的connection，因此connection.js也必须在autocomplete.js之前引入；如果用到了动画方式展开下拉框，则需要保证animation.js在autocomplete.js之前引入。 <br /><br />3．Datatable中列宽度的调整，Container组件中的Overlay以及从Overlay继承下来的Dialog，SimpleDialog的窗口拖动，需要用到dragdrop.js，因此dragdrop.js必须在datatable.js和container.js之前引入；如果要用到Dialog的动画显示效果，则需要先引入animation.js。 <br /></p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://programming.javaeye.com/blog/197420#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 27 May 2008 13:25:20 +0800</pubDate>
        <link>http://programming.javaeye.com/blog/197420</link>
        <guid>http://programming.javaeye.com/blog/197420</guid>
      </item>
      <item>
        <title>大家给一点建意给我啊</title>
        <author>programming</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://programming.javaeye.com">programming</a>&nbsp;
          链接：<a href="http://programming.javaeye.com/blog/189556" style="color:red;">http://programming.javaeye.com/blog/189556</a>&nbsp;
          发表时间: 2008年05月04日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          我最近接了一个网站单子.主要功能呢,是产品展示,网络推广,联系我们,一些动态新闻,公司的动态新闻,公司的招聘信息,还有就是公司的简介,联盟商家.等等,,.......如果真做这个网站的话,什么价啊,,,,..大家给一点意见啊..
          <br/>
          <span style="color:red;">
            <a href="http://programming.javaeye.com/blog/189556#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 04 May 2008 23:43:38 +0800</pubDate>
        <link>http://programming.javaeye.com/blog/189556</link>
        <guid>http://programming.javaeye.com/blog/189556</guid>
      </item>
      <item>
        <title>Hibernate的缓存机制</title>
        <author>programming</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://programming.javaeye.com">programming</a>&nbsp;
          链接：<a href="http://programming.javaeye.com/blog/186908" style="color:red;">http://programming.javaeye.com/blog/186908</a>&nbsp;
          发表时间: 2008年04月25日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          缓存是介于应用程序和物理数据源之间，其作用是为了降低应用程序对物理数据源访问的频次，从而提高了应用的运行性能。缓存内的数据是对物理数据源中的数据的复制，应用程序在运行时从缓存读写数据，在特定的时刻或事件会同步缓存和物理数据源的数据。<br /><br />　　缓存的介质一般是内存，所以读写速度很快。但如果缓存中存放的数据量非常大时，也会用硬盘作为缓存介质。缓存的实现不仅仅要考虑存储的介质，还要考虑到管理缓存的并发访问和缓存数据的生命周期。<br /><br />　　Hibernate的缓存包括Session的缓存和SessionFactory的缓存，其中SessionFactory的缓存又可以分为两类：内置缓存和外置缓存。Session的缓存是内置的，不能被卸载，也被称为Hibernate的第一级缓存。SessionFactory的内置缓存和Session的缓存在实现方式上比较相似，前者是SessionFactory对象的一些集合属性包含的数据，后者是指Session的一些集合属性包含的数据。SessionFactory的内置缓存中存放了映射元数据和预定义SQL语句，映射元数据是映射文件中数据的拷贝，而预定义SQL语句是在Hibernate初始化阶段根据映射元数据推导出来，SessionFactory的内置缓存是只读的，应用程序不能修改缓存中的映射元数据和预定义SQL语句，因此SessionFactory不需要进行内置缓存与映射文件的同步。SessionFactory的外置缓存是一个可配置的插件。在默认情况下，SessionFactory不会启用这个插件。外置缓存的数据是数据库数据的拷贝，外置缓存的介质可以是内存或者硬盘。SessionFactory的外置缓存也被称为Hibernate的第二级缓存。<br /><br />　　Hibernate的这两级缓存都位于持久化层，存放的都是数据库数据的拷贝，那么它们之间的区别是什么呢？为了理解二者的区别，需要深入理解持久化层的缓存的两个特性：缓存的范围和缓存的并发访问策略。<br /><br />　　持久化层的缓存的范围<br /><br />　　缓存的范围决定了缓存的生命周期以及可以被谁访问。缓存的范围分为三类。<br /><br />　　1 事务范围：缓存只能被当前事务访问。缓存的生命周期依赖于事务的生命周期，当事务结束时，缓存也就结束生命周期。在此范围下，缓存的介质是内存。事务可以是数据库事务或者应用事务，每个事务都有独自的缓存，缓存内的数据通常采用相互关联的的对象形式。<br /><br />　　2 进程范围：缓存被进程内的所有事务共享。这些事务有可能是并发访问缓存，因此必须对缓存采取必要的事务隔离机制。缓存的生命周期依赖于进程的生命周期，进程结束时，缓存也就结束了生命周期。进程范围的缓存可能会存放大量的数据，所以存放的介质可以是内存或硬盘。缓存内的数据既可以是相互关联的对象形式也可以是对象的松散数据形式。松散的对象数据形式有点类似于对象的序列化数据，但是对象分解为松散的算法比对象序列化的算法要求更快。<br /><br />　　3 集群范围：在集群环境中，缓存被一个机器或者多个机器的进程共享。缓存中的数据被复制到集群环境中的每个进程节点，进程间通过远程通信来保证缓存中的数据的一致性，缓存中的数据通常采用对象的松散数据形式。<br /><br />　　对大多数应用来说，应该慎重地考虑是否需要使用集群范围的缓存，因为访问的速度不一定会比直接访问数据库数据的速度快多少。<br /><br />　　持久化层可以提供多种范围的缓存。如果在事务范围的缓存中没有查到相应的数据，还可以到进程范围或集群范围的缓存内查询，如果还是没有查到，那么只有到数据库中查询。事务范围的缓存是持久化层的第一级缓存，通常它是必需的；进程范围或集群范围的缓存是持久化层的第二级缓存，通常是可选的。<br /><br />　　持久化层的缓存的并发访问策略<br /><br />　　当多个并发的事务同时访问持久化层的缓存的相同数据时，会引起并发问题，必须采用必要的事务隔离措施。<br /><br />　　在进程范围或集群范围的缓存，即第二级缓存，会出现并发问题。因此可以设定以下四种类型的并发访问策略，每一种策略对应一种事务隔离级别。<br /><br />　　事务型：仅仅在受管理环境中适用。它提供了Repeatable Read事务隔离级别。对于经常被读但很少修改的数据，可以采用这种隔离类型，因为它可以防止脏读和不可重复读这类的并发问题。<br /><br />　　读写型：提供了Read Committed事务隔离级别。仅仅在非集群的环境中适用。对于经常被读但很少修改的数据，可以采用这种隔离类型，因为它可以防止脏读这类的并发问题。<br /><br />　　非严格读写型：不保证缓存与数据库中数据的一致性。如果存在两个事务同时访问缓存中相同数据的可能，必须为该数据配置一个很短的数据过期时间，从而尽量避免脏读。对于极少被修改，并且允许偶尔脏读的数据，可以采用这种并发访问策略。 　　只读型：对于从来不会修改的数据，如参考数据，可以使用这种并发访问策略。<br />　　事务型并发访问策略是事务隔离级别最高，只读型的隔离级别最低。事务隔离级别越高，并发性能就越低。<br /><br />　　什么样的数据适合存放到第二级缓存中？<br />　　1、很少被修改的数据<br />　　2、不是很重要的数据，允许出现偶尔并发的数据<br />　　3、不会被并发访问的数据<br />　　4、参考数据<br /><br />　　不适合存放到第二级缓存的数据？<br />　　1、经常被修改的数据<br />　　2、财务数据，绝对不允许出现并发<br />　　3、与其他应用共享的数据。<br /><br />　　Hibernate的二级缓存<br />　　如前所述，Hibernate提供了两级缓存，第一级是Session的缓存。由于Session对象的生命周期通常对应一个数据库事务或者一个应用事务，因此它的缓存是事务范围的缓存。第一级缓存是必需的，不允许而且事实上也无法比卸除。在第一级缓存中，持久化类的每个实例都具有唯一的OID。<br />　　第二级缓存是一个可插拔的的缓存插件，它是由SessionFactory负责管理。由于SessionFactory对象的生命周期和应用程序的整个过程对应，因此第二级缓存是进程范围或者集群范围的缓存。这个缓存中存放的对象的松散数据。第二级对象有可能出现并发问题，因此需要采用适当的并发访问策略，该策略为被缓存的数据提供了事务隔离级别。缓存适配器用于把具体的缓存实现软件与Hibernate集成。第二级缓存是可选的，可以在每个类或每个集合的粒度上配置第二级缓存。<br /><br />　　Hibernate的二级缓存策略的一般过程如下：<br />　　1) 条件查询的时候，总是发出一条select * from table_name where …. （选择所有字段）这样的SQL语句查询数据库，一次获得所有的数据对象。<br />　　2) 把获得的所有数据对象根据ID放入到第二级缓存中。<br />　　3) 当Hibernate根据ID访问数据对象的时候，首先从Session一级缓存中查；查不到，如果配置了二级缓存，那么从二级缓存中查；查不到，再查询数据库，把结果按照ID放入到缓存。<br />　　4) 删除、更新、增加数据的时候，同时更新缓存。<br />　　Hibernate的二级缓存策略，是针对于ID查询的缓存策略，对于条件查询则毫无作用。为此，Hibernate提供了针对条件查询的Query缓存。<br /><br />　　Hibernate的Query缓存策略的过程如下：<br />　　1) Hibernate首先根据这些信息组成一个Query Key，Query Key包括条件查询的请求一般信息：SQL, SQL需要的参数，记录范围（起始位置rowStart，最大记录个数maxRows)，等。<br />　　2) Hibernate根据这个Query Key到Query缓存中查找对应的结果列表。如果存在，那么返回这个结果列表；如果不存在，查询数据库，获取结果列表，把整个结果列表根据Query Key放入到Query缓存中。<br />　　3) Query Key中的SQL涉及到一些表名，如果这些表的任何数据发生修改、删除、增加等操作，这些相关的Query Key都要从缓存中清空。
          <br/>
          <span style="color:red;">
            <a href="http://programming.javaeye.com/blog/186908#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 25 Apr 2008 18:24:04 +0800</pubDate>
        <link>http://programming.javaeye.com/blog/186908</link>
        <guid>http://programming.javaeye.com/blog/186908</guid>
      </item>
      <item>
        <title>velocity开发指南</title>
        <author>programming</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://programming.javaeye.com">programming</a>&nbsp;
          链接：<a href="http://programming.javaeye.com/blog/182098" style="color:red;">http://programming.javaeye.com/blog/182098</a>&nbsp;
          发表时间: 2008年04月12日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Velocity用户指南<br />什么是Velocity？<br />Velocity是基于Java的模板引擎。它允许Web页面开发者引用Java代码中定义的方法。Web设计者可以和Java程序开发者并行开发遵循MVC模式的Web站点。这意味着，Web设计者可以将精力放在好的Web站点设计上，而Java程序开发者可以将精力放在编写代码上。Velocity将Java代码从Web页面中分离，使Web站点更具长期可维护性，并提供了一种替代JSP或PHP的方案。<br /> <br />VTL(Velocity Template Language)介绍	<br />VTL提供一种简单、容易和干静的方法将动态内容合并到Web页面。VTL使用引用(references)将动态内容插入到Web页面中。变量是一种引用，可以指向Java代码中的定义内容，或者由Web页面中的VTL语句来获得值。下面是一个可以插入到HTML文档的VTL语句的例子：<br />#set( $a = "Velocity" )<br />VTL语句以#开头，并包含指令(set)。变量以$开头，用引号引起。引号可以是单引号，也可以是双引号。前者引用具体的String值；后者可以包含Velocity引用，例如”hello, $name”， $name会用其当前的值替换。上面的例子是将值Velocity赋值给变量a。<br />当变量被赋值后，就可以在HTML文档的任何地方引用，下面是Hello Velocity World!的例子：<br />&lt;html><br />&lt;body><br />#set( $foo = "Velocity" )<br />Hello $foo World!<br />&lt;/body><br />&lt;html><br /> <br />注释<br />VTL支持单行注释（以##开始）和多行注释（包括在#*和*#之间），下面是一个例子：<br />This text is visible. ## This text is not visible.<br />This text is visible.<br />This text is visible. #* This text, as part of a multi-line comment,<br />is not visible. This text is not visible; it is also part of the<br />multi-line comment. This text still not visible. *# This text is outside<br />the comment, so it is visible.<br />## This text is not visible.<br /> <br />引用<br />VTL有3种类型的引用：变量、属性和方法。作为一个设计者，必须和Java工程师在VTL引用的名称（标识符）上一致，以便在模板中使用它们。引用是作为String对象处理的。<br />（1）变量<br />变量的格式：$VTL标识符<br />VTL标识符以字母开始，由字母、数字、横划线(-)或下划线(_)组成。变量或者从模板中的set指令获得值（如前面的例子），或者Java代码（同名变量）中获得值。Velocity只处理已定义的变量引用，对于没有定义的变量引用，Velocity原样返回。例如下面的例子：<br />#set( $foo = "gibbous" )<br />$moon = $foo<br />输出结果是：$moon = gibbous<br />（2）属性<br />属性的格式：$VTL标识符. VTL标识符<br />下面是属性引用的例子：<br />$customer.Address<br />$purchase.Total<br />拿第一例子来说，有两种意思：<br />         返回Hashtable对象customer中键值为Address的值<br />         $customer.getAddress()方法引用的缩写（JavaBean属性的getter方法）<br />至于是哪种情况，Velocity会做决定，返回合适的值。<br />（3）方法<br />方法的格式：$VTL标识符(参数列表)<br />下面是方法引用的例子：<br />$customer.getAddress()<br />$purchase.getTotal()<br />$page.setTitle( "My Home Page" )<br />$person.setAttributes( ["Strange", "Weird", "Excited"] )<br />前面两个例子可以缩写成属性引用（如属性引用的例子）。属性引用和方法引用的主要区别是方法引用可以指定参数列表。<br />（4）正式引用符号：{}<br />正式引用符号在使用变量引用含糊的地方进行区分。看下面的例子：<br />#set( $vice = "klepto" )<br />Jack is a $vicemaniac.<br />输出结果是：Jack is a $vicemaniac.（$vicemaniac没有定义，原样输出）<br />#set( $vice = "klepto" )<br />Jack is a ${vice}maniac.<br />输出结果是：Jack is a kleptomaniac.（使用正式引用符号将$vice和其它文本区分开）<br />（5）Quit引用符号：!<br />看下面的例子：<br />&lt;input type="text" name="email" value="$email"/><br />初始时，$email没有值，所以文本框中会显示值$email，而更希望是空白。下面是使用Quit引用符号的例子：<br />&lt;input type="text" name="email" value="$!email"/><br />当$email没有值时，Velocity会用空串替代$email。<br />（6）特殊字符转义<br />对于$、#