<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>Azi---UCWEB粉丝网,请点击广告支持</title>
    <description>Java,J2ME,手机，软件，项目，Azi，著名，博客，iWivi.com，高性能</description>
    <link>http://azi.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>UCWEB为灾区人民祈福</title>
        <author>Azi</author>
        <description>
          <![CDATA[
          <br/>
          网站: <a href="http://www.javaeye.com">JavaEye</a>&nbsp;
          作者: <a href="http://azi.javaeye.com">Azi</a>&nbsp;
                    链接：<a href="http://azi.javaeye.com/blog/192544" style="color:red;">http://azi.javaeye.com/blog/192544</a>&nbsp;
          发表时间: 2008年05月13日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><span style="font-family: 宋体;">汶川7.8级地震就这样不期而至<br /><span style="font-size: small;"></span><br /><span style="font-size: 12pt;"><span style="color: #000000;">地动山摇得感觉仍使灾区人民心有余悸</span></span></span><br /><span style="font-family: 宋体;"><span style="font-size: small;"></span></span><br /><span style="color: #000000;"><span style="font-family: 宋体;"><span style="font-size: 12pt;">5</span></span><span style="font-family: 宋体;"><span style="font-size: 12pt;">月12日</span></span><span style="font-family: 宋体;"><span style="font-size: 12pt;">这一天注定会带着恐惧留在人们的脑海里</span></span></span><br /><span style="font-family: 宋体;"><span style="font-size: small;"></span></span><br /><span style="font-family: 宋体;"><span style="font-size: 12pt;"></span></span><br /><span style="font-family: 宋体;"><span style="font-size: 12pt;"><span style="color: #000000;">当危难来临时</span></span></span><br /><span style="font-family: 宋体;"><span style="font-size: small;"></span></span><br /><span style="font-family: 宋体;"><span style="font-size: 12pt;"><span style="color: #000000;">每一个中国人都携起手来</span></span></span><br /><span style="font-family: 宋体;"><span style="font-size: small;"></span></span><br /><span style="font-family: 宋体;"><span style="font-size: 12pt;"><span style="color: #000000;">为逝者默念安息</span></span></span><br /><span style="font-family: 宋体;"><span style="font-size: small;"></span></span><br /><span style="font-family: 宋体;"><span style="font-size: 12pt;"><span style="color: #000000;">为伤者祈祷平安</span></span></span><br /><span style="font-family: 宋体;"><span style="font-size: 12pt;"><span style="color: #000000;"><br /></span></span></span><br /><span style="font-family: 宋体;"><span style="font-size: 12pt;"><span style="color: #000000;">相信大家一定有话要与灾区的兄弟姐妹们说的，不论是祈祷，还是祝福。。。。。</span></span></span><br /><span style="font-family: 宋体;"><span style="font-size: small;"></span></span><br /><span style="font-family: 宋体;"><span style="font-size: 12pt;"><span style="color: #000000;">赶快与UCWEB一起携手，为灾区人民祈福吧！！！</span></span></span></p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://azi.javaeye.com/blog/192544#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><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 13 May 2008 12:26:01 +0800</pubDate>
        <link>http://azi.javaeye.com/blog/192544</link>
        <guid>http://azi.javaeye.com/blog/192544</guid>
      </item>
          <item>
        <title>《UCWEB6正式版》是目前手机上最省流量的手机浏览器！</title>
        <author>Azi</author>
        <description>
          <![CDATA[
          <br/>
          网站: <a href="http://www.javaeye.com">JavaEye</a>&nbsp;
          作者: <a href="http://azi.javaeye.com">Azi</a>&nbsp;
                    链接：<a href="http://azi.javaeye.com/blog/192116" style="color:red;">http://azi.javaeye.com/blog/192116</a>&nbsp;
          发表时间: 2008年05月12日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><span style="color: #0000ff;">本文为转贴，原文见<a href="http://bbs.ucweb.com/viewthread.php?tid=185064&amp;extra=page%3D1">http://bbs.ucweb.com/viewthread.php?tid=185064&amp;extra=page%3D1</a></span></p>
<p><span style="color: #0000ff;">近期总是有人在说UC流量大，不把这帖顶上去不行！！！<br />大家如果对这帖质疑，请拿出数据说明，本人愿意和他分析到底！！！！！！<br /><br /></span><span style="font-size: small;"><span style="color: #ff0000;">我测试一下，用UCWEB最新正式版，空中OP最新版，拿我们的论坛为例：<br />空中OP打开要22K，而用UCWEB打开只用16K，而且显示图片差不多，某些格式图片比空中OP更为清析！<br />可以毫无疑问的说一句：UCWEB是目前手机上最省流量的手机浏览器！<br /><br />大家可能说在WAP站点打开UCWEB流量比OP多，其实这是因为UCWEB是直连的缘故，并没有使用服务器中转。<br />为什么UCWEB不用中转呢？那是因为WAP站点很多限制了移动IP才能登陆，如果使用服务器中转，登陆该站点使用的就是服务器的IP，这样导致不能成功打开该页面。<br />大家不妨试试，看空中OP可以登陆上移动梦网吗？再看看打开WAP加速的UCWEB又可不可以登陆移动梦网？<br /><br />而关闭UCWEB的&ldquo;WAP加速&rdquo;，使用服务器中转，测试乐讯<br />UCWEB用流量3K，而空中OP用4K，到底谁省流量，到底谁功能强大，我想大家现在已经一清二楚。大家怀疑本人提供的数据，可以自行测试流量。测试前要保证，图片设置相同呢，记住哦。</span></span><br /><br /><span style="font-size: large;"><span style="color: #0000ff;">实战实例之WAP页面使用流量测试：<br /><span style="font-size: x-small;">流量监测工具：PC上的专业抓包工具&ldquo;IRIS&rdquo;<br />测试方法：PPC同步电脑使用电脑网络，因为&ldquo;iris&rdquo;只能监测电脑网络的流量数据，PPC上安装UCWEB正式版、空中OPM（前提已经安装PPC的JAVA模拟器&ldquo;JBED&rdquo;）</span><br /></span></span><span style="color: #ff0000;"><span style="font-size: small;">拿&ldquo;空中OPM&rdquo;、&ldquo;俄OPM&rdquo;、最新版本&ldquo;UCWEB6.0&rdquo;、opera mobile、windows mobile IE分别做出测试：<br />注1：流量单位B<br />注2：UCWEB打开WAP加速图片质量设置失效，默认为WAP站点原图片显示质量；关闭WAP加速，图片设置低彩。<br />注3：OPM，图片设置低彩 <br /><img onclick="if(!this.resized) {return true;} else {window.open(this.src);}" onmouseover="if(this.width&gt;screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.style.cursor='hand'; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" src="http://bbs.ucweb.com/ucattach/month_0805/20080507_a55df864f1aff5d3b84bwYjPaHKAAPNb.bmp" border="0" alt="" /><br />从上面测试的数据我们可以看出，浏览同一个WAP页面，UCWEB打开WAP直连使用流量与同是WAP直接解释的opera mobile、windows mobile IE使用流量相差不大。<br />而经过压缩中转的两个版本opera mini使用流量都比几个直接解释处理的浏览器使用流量要小。正好，这点就是问题所在。在同时使用ucweb与opera mini的用户，在不理解服务器概念前提下，就会理解为ucweb使用流量很大，而且大了两倍。<br />其实如上面数据，当ucweb同样开启压缩中转的情况下，是所有浏览中使用流量最少的。</span></span><br /><span style="font-size: large;"><span style="color: #0000ff;"><br />实战实例之WEB页面使用流量测试：</span></span><br /><span style="font-size: small;"><span style="color: #ff0000;">下面测试打开WEB页面使用流量，测试软件空中OPM与UCWE6正式版<br /><img onclick="if(!this.resized) {return true;} else {window.open(this.src);}" onmouseover="if(this.width&gt;screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.style.cursor='hand'; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" src="http://bbs.ucweb.com/ucattach/month_0805/20080507_df45c1c35e5ae7115104txVD1lUrHGEh.bmp" border="0" alt="" /><br />从上面数据可以看出，UCWEB打开同一页面使用流量比OPM少用10%到20%。我们再看他们彼此的图片显示质量上：<br /><img onclick="if(!this.resized) {return true;} else {window.open(this.src);}" onmouseover="if(this.width&gt;screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.style.cursor='hand'; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" src="http://bbs.ucweb.com/ucattach/month_0805/20080507_ec4da816850f431de604B5cah0hm3tAC.bmp" border="0" alt="" /><br /><img onclick="if(!this.resized) {return true;} else {window.open(this.src);}" onmouseover="if(this.width&gt;screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.style.cursor='hand'; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" src="http://bbs.ucweb.com/ucattach/month_0805/20080507_eb5b7ef2cab7e2d41ca3tMCKc8NLNHIh.bmp" border="0" alt="" /><br />从上面截图可以明显看出，UCWEB的图片显示质量比OPM要好！</span></span></p>
          <br/>
          <span style="color:red;">
            <a href="http://azi.javaeye.com/blog/192116#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><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 12 May 2008 09:59:52 +0800</pubDate>
        <link>http://azi.javaeye.com/blog/192116</link>
        <guid>http://azi.javaeye.com/blog/192116</guid>
      </item>
          <item>
        <title>请问Robbin创建Javaeye的理由和动机是什么</title>
        <author>Azi</author>
        <description>
          <![CDATA[
          <br/>
          网站: <a href="http://www.javaeye.com">JavaEye</a>&nbsp;
          作者: <a href="http://azi.javaeye.com">Azi</a>&nbsp;
                    链接：<a href="http://azi.javaeye.com/blog/191323" style="color:red;">http://azi.javaeye.com/blog/191323</a>&nbsp;
          发表时间: 2008年05月09日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>请问Robbin创建Javaeye的理由和动机是什么？</p>
<p>Javaeye怎么看也只是一个博客和论坛站。不知道Robbin创建的动机是什么？</p>
<p>难道就是两三年前跟着博客风做的？那时候，有个同事听了SNS的概念，也弄了博客站。</p>
<p>难道也是跟踪ROR的风然后就弄了个站。</p>
<p>做这个之前有仔细调查过市场吗？还是自己纯粹的兴趣？</p>
<p>怎么维持的这个站的发展？是以个人站的发展还是以公司的长久经营发展？</p>
<p>对现在的发展满意吗？</p>
<p>追求的是什么价值？</p>
          <br/>
          <span style="color:red;">
            <a href="http://azi.javaeye.com/blog/191323#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><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 09 May 2008 10:16:41 +0800</pubDate>
        <link>http://azi.javaeye.com/blog/191323</link>
        <guid>http://azi.javaeye.com/blog/191323</guid>
      </item>
          <item>
        <title>iPhone引领新网站潮流-迷你版web站</title>
        <author>Azi</author>
        <description>
          <![CDATA[
          <br/>
          网站: <a href="http://www.javaeye.com">JavaEye</a>&nbsp;
          作者: <a href="http://azi.javaeye.com">Azi</a>&nbsp;
                    链接：<a href="http://azi.javaeye.com/blog/191070" style="color:red;">http://azi.javaeye.com/blog/191070</a>&nbsp;
          发表时间: 2008年05月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>移动数码设备的更新将再掀起移动增值领域的新革命！ 此前，美国第一大搜索引擎Google、美国第二大社交网站Facebook已经推出了320像素的迷你版网站。凭借着苹果品牌的强大号召力，业界认为未来还将出现更多的迷你版WEB网站。<br /></p>
<div style="margin: 10px 0px; text-align: center;"><img title="iphone" src="http://www.icebin.net/upload/iphone_hero_20070621.jpg" alt="iphone" width="500" height="305" /></div>
<p><br />苹果公司推出了iPhone智能手机之后，开始引领一股320像素宽的迷你版WEB网站风潮。日前，美国网上零售巨头亚马逊网站也推出了支持iPhone的迷你版网站。亚马逊的迷你版网站宽度为320像素，专门面向iPhone手机的分辨率所设计。主页比较简单，除了搜索框之外，还摆放了若干个图片。简单并不显得枯燥。此外，手机用户还可以通过下拉列表选择各个产品门类的热销产品。</p>
          <br/>
          <span style="color:red;">
            <a href="http://azi.javaeye.com/blog/191070#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><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 08 May 2008 14:26:37 +0800</pubDate>
        <link>http://azi.javaeye.com/blog/191070</link>
        <guid>http://azi.javaeye.com/blog/191070</guid>
      </item>
          <item>
        <title>Bad version information的问题</title>
        <author>Azi</author>
        <description>
          <![CDATA[
          <br/>
          网站: <a href="http://www.javaeye.com">JavaEye</a>&nbsp;
          作者: <a href="http://azi.javaeye.com">Azi</a>&nbsp;
                    链接：<a href="http://azi.javaeye.com/blog/190977" style="color:red;">http://azi.javaeye.com/blog/190977</a>&nbsp;
          发表时间: 2008年05月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>Method............: 1018b3f8 'com/sun/midp/midlet/MIDletState.createMIDlet (static)' <br />Stack Chunk.......: 488bcd8<br />Frame Pointer.....: 488bd30<br />Current IP........: 10223e61 = 10223e44 + offset 29<br />Previous Frame....: 488bcf8<br />Previous IP.......: 1024d539 (offset 22)<br />Frame size........: 7 (1 arguments, 6 local variables)<br />Argument[0].......: 488cb80<br />Local[1]..........: 0<br />Local[2]..........: 488bcf8<br />Local[3]..........: 48a63f0<br />Local[4]..........: 488bd0c<br />Local[5]..........: 101747dc<br />Local[6]..........: 488bcd8<br />Operand[1]........: 488cb80</p>
<p>Method............: 101a574c 'com/sun/midp/midlet/Selector.run (virtual)' <br />Stack Chunk.......: 488bcd8<br />Frame Pointer.....: 488bcf8<br />Current IP........: 1024d539 = 1024d523 + offset 22<br />Previous Frame....: 0<br />Previous IP.......: 1<br />Frame size........: 6 (1 arguments, 5 local variables)<br />Argument[0].......: 488cdd8<br />Local[1]..........: 48a65b0<br />Local[2]..........: 488cb80<br />Local[3]..........: 0<br />Local[4]..........: 0<br />Local[5]..........: 0<br />Operand[1]........: 48a65b0</p>
<p>VM status:<br />Instruction pointer.: 10223e61 (offset within invoking method: 29)<br />Next instruction....: 0x4c<br />Frame pointer.......: 488bd30<br />Local pointer.......: 488bd14<br />Stack size..........: 128; sp: 488bd48; ranges: 488bce0-488bee0;<br />Contents of the current stack frame:<br />&nbsp;&nbsp;&nbsp; 488bd14: 488cb80 (lp)<br />&nbsp;&nbsp;&nbsp; 488bd18: 0<br />&nbsp;&nbsp;&nbsp; 488bd1c: 488bcf8<br />&nbsp;&nbsp;&nbsp; 488bd20: 48a63f0<br />&nbsp;&nbsp;&nbsp; 488bd24: 488bd0c<br />&nbsp;&nbsp;&nbsp; 488bd28: 101747dc<br />&nbsp;&nbsp;&nbsp; 488bd2c: 488bcd8<br />&nbsp;&nbsp;&nbsp; 488bd30: 488bcf8 (fp)<br />&nbsp;&nbsp;&nbsp; 488bd34: 1024d539<br />&nbsp;&nbsp;&nbsp; 488bd38: 488bd10<br />&nbsp;&nbsp;&nbsp; 488bd3c: 1018b3f8<br />&nbsp;&nbsp;&nbsp; 488bd40: 488bcd8<br />&nbsp;&nbsp;&nbsp; 488bd44: 0 (end of frame)<br />&nbsp;&nbsp;&nbsp; 488bd48: 488cb80 (sp)<br />Execution stack contains 108 items: <br /><span style="color: #ff0000;">ALERT: java/lang/ClassFormatError: Bad version information.</span></p>
<p>如果使用JBuilder运行J2ME的程序，出现上面的错误，那肯定是使用的jdk的build的版本错了。</p>
<p>到project-&gt;build-&gt;java里面修改目标jvm的版本吧。</p>
<p>将Target VM的版本改为jdk1.3,language feature也改为1.3即可。</p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://azi.javaeye.com/blog/190977#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li><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>Thu, 08 May 2008 11:19:42 +0800</pubDate>
        <link>http://azi.javaeye.com/blog/190977</link>
        <guid>http://azi.javaeye.com/blog/190977</guid>
      </item>
          <item>
        <title>什么是企业级应用？</title>
        <author>Azi</author>
        <description>
          <![CDATA[
          <br/>
          网站: <a href="http://www.javaeye.com">JavaEye</a>&nbsp;
          作者: <a href="http://azi.javaeye.com">Azi</a>&nbsp;
                    链接：<a href="http://azi.javaeye.com/blog/190927" style="color:red;">http://azi.javaeye.com/blog/190927</a>&nbsp;
          发表时间: 2008年05月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>很多人呀，对企业级应用系统充满诱惑。以为什么都必须讲企业级的。动不动，就是MVC结构，动不动，就是Spring，EJB。可是，你能明白是企业级应用了吗？</p>
<p>什么是企业级？</p>
<p>1、跟公司运营的业务相关。或者说，跟金钱相关。例如，银行的ATM系统，银行的业务办理，电信的营业系统，电信的扣费系统，电信的账单查询系统。这些都是企业级，跟你的钱相关。一旦出问题呀，后果很严重。</p>
<p>2、跟企业生产相关的，例如ERP，或者下订单，购物系统，也非常重要。</p>
<p>3、很高的并发操作或者繁忙的操作。有很多人在使用。它代表着你的运营。例如电话卡充值，它是通过线上充值的，当你发起指令，后面的电脑系统就会帮你工作。</p>
<p>4、有数据，并且数据很关键。这些数据代表了你的客户，你的用户信息。如果一旦数据丢失，后果很严重。</p>
<p>5、还有很多很多。。但是财务软件是否企业级呢？其实也是企业级一些需求，但是它并没有很高的并发需求，还不是企业级，通过简单的本地数据库已经解决了很多可靠性，安全性问题，只要电脑不中毒，硬盘不坏，你的数据就是很安全。</p>
<p>什么是应用？</p>
<p>应用有很多啦。</p>
<p>1、信息管理系统(MIS)：这个可能是最常做的。</p>
<p>2、各种web1.0,2.0应用。</p>
<p>3、很多很多。</p>
<p>那么那么。。。经营一个博客网站服务是否企业级呢？</p>
<p>1、博客网站有很高访问。</p>
<p>2、有用户的概念。</p>
<p>3、但是没有跟用户有金钱来往。</p>
<p>其实很靠近了企业级，但还不算。</p>
<p>那么那么。。。搜索引擎是否企业级呢？</p>
<p>如果只是一个框，还不算，算是一个web应用，但是当你把它运营起来了，也是企业级了。运营是什么概念呢？就是每天分析用户在干什么，就是运营。</p>
<p>B/S结构与C/S结构，当大家将应用搬到网络上的时候(B/S)&nbsp;,就是缺省了用户的安装，大家用起来更方便。但是并代表C/S不好。银行电信业务系统还是C/S。这些系统的操作员可能很少，可是呀业务也非常频繁。</p>
<p>在我做过的电信的营业系统时候，就知道里面真的跟数据库打交道太多太多了。有几百条存储过程在Oracle里面。</p>
<p>这个概念呀，欢迎大家讨论。</p>
          <br/>
          <span style="color:red;">
            <a href="http://azi.javaeye.com/blog/190927#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li><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>Thu, 08 May 2008 10:14:43 +0800</pubDate>
        <link>http://azi.javaeye.com/blog/190927</link>
        <guid>http://azi.javaeye.com/blog/190927</guid>
      </item>
          <item>
        <title>UCWEB的漂亮界面</title>
        <author>Azi</author>
        <description>
          <![CDATA[
          <br/>
          网站: <a href="http://www.javaeye.com">JavaEye</a>&nbsp;
          作者: <a href="http://azi.javaeye.com">Azi</a>&nbsp;
                    链接：<a href="http://azi.javaeye.com/blog/190908" style="color:red;">http://azi.javaeye.com/blog/190908</a>&nbsp;
          发表时间: 2008年05月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>UCWEB的漂亮的界面</p>
          <br/>
          <span style="color:red;">
            <a href="http://azi.javaeye.com/blog/190908#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><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 08 May 2008 09:46:02 +0800</pubDate>
        <link>http://azi.javaeye.com/blog/190908</link>
        <guid>http://azi.javaeye.com/blog/190908</guid>
      </item>
          <item>
        <title>最近喜欢上了Lite版</title>
        <author>Azi</author>
        <description>
          <![CDATA[
          <br/>
          网站: <a href="http://www.javaeye.com">JavaEye</a>&nbsp;
          作者: <a href="http://azi.javaeye.com">Azi</a>&nbsp;
                    链接：<a href="http://azi.javaeye.com/blog/190596" style="color:red;">http://azi.javaeye.com/blog/190596</a>&nbsp;
          发表时间: 2008年05月07日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>最近呀，发现有很多人制作Lite版。</p>
<p>例如，有个组织制作了XP的Lite版本，把没有的功能去掉，只保留常用的功能。EPC就可以安装Lite版本。</p>
<p>最近还发现有人制作了Office2003的Lite版，130MB的就可以按照Office，不像以前那样，需要光碟安装。</p>
<p>还发现有人制作了Delphi 2006的Lite版，同样呀，安装包非常的小、而且还带破解。安装即可用。非常的好。</p>
<p>&nbsp;</p>
<p>现在的人呀，把程序做得越来越大，JB2008已经1.8G，Oracle要5张光盘，VisualStudio要5张光盘。好麻烦。</p>
<p>也希望更多的人制作Lite版，让安装使用更简单。</p>
<p>也希望更多人的告诉我Lite版。我最不喜欢装大软件的了。</p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://azi.javaeye.com/blog/190596#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><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 07 May 2008 14:32:08 +0800</pubDate>
        <link>http://azi.javaeye.com/blog/190596</link>
        <guid>http://azi.javaeye.com/blog/190596</guid>
      </item>
          <item>
        <title>Java是好东西，但不完美</title>
        <author>Azi</author>
        <description>
          <![CDATA[
          <br/>
          网站: <a href="http://www.javaeye.com">JavaEye</a>&nbsp;
          作者: <a href="http://azi.javaeye.com">Azi</a>&nbsp;
                    链接：<a href="http://azi.javaeye.com/blog/190588" style="color:red;">http://azi.javaeye.com/blog/190588</a>&nbsp;
          发表时间: 2008年05月07日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>突然呀，想到了这个题目。随便列出几个要点。没有仔细的考虑。。。</p>
<p>Java是好东西，但不完美。</p>
<p>1、统一的数据类型，这个是很非常非常实惠的功能。以前学Delphi。就知道有N多种的String类型，有Pacal的String，C的String，还有WideString，这些东西，整体要转来转去，痛苦死了。</p>
<p>2、语言简单和统一。这个统一性很重要，不会说一个东西有N种表达方式。然后要不断的想区分这个那个。</p>
<p>3、没有指针，不用关心内存。这个是最好的东西。当然，带来的副作用就是慢一些。偶尔还要考虑内存问题，因为呀，在手机上还是要考虑内存的。</p>
<p>4、先有标准API后又实现。这个是好传统。看，ServletAPI，JDBC的API，到现在还很好用，设计的很经典。可是，也不是所有的API的都设计的很好，例如EJB。</p>
<p>5、非常适合做框架。由于这种语言的灵活，很适合做框架。很快组装起来。</p>
<p>6、非常丰富的开源项目。</p>
<p>但是呀，也不完美。有很多很多问题。</p>
<p>1、跟操作系统的功能并不丰富，也不完善。连对进程处理也不支持不够好。</p>
<p>2、对桌面程序支持不够好，这当然来源于对Swing的设计不怎么。一直期待java能够学习Delphi那样，好好的设计这些API。现在也看到了很多进步。但还不够。</p>
<p>3、不能直接调用dll，这个曾经看到有个项目可以直接调用的。这个也使java受限呀。</p>
<p>4、过于复杂的内存回收机制，Delphi简简单单的实现了内存控制，但java为什么越走越复杂。</p>
<p>5、有很多的API设计要么过度工程化，要么太理想化。</p>
<p>6、OpenJDK似乎没有并没有吸引太多人，进展缓慢。</p>
<p>如果Java早点开放态度，多听些业内牛人的做法呀，Java肯定是设计的更精彩。可惜，牛人都在微软，IBM公司。。。</p>
<p>现在Google的Android都使用java作为胶合语言。说明java语言是很好用的。可是单有语言不够的，还要有丰富的系统功能。。</p>
<p>其实，sun就是一头筋，只顾一次编写，到处运行。如果能够灵活些，别老是在自己的系统上吊死。多关注主流的linue和window，把它们做好，会占更大市场。</p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://azi.javaeye.com/blog/190588#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><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 07 May 2008 14:16:58 +0800</pubDate>
        <link>http://azi.javaeye.com/blog/190588</link>
        <guid>http://azi.javaeye.com/blog/190588</guid>
      </item>
          <item>
        <title>PSP上网新方式!强大PSPKVM+UCWEB组合</title>
        <author>Azi</author>
        <description>
          <![CDATA[
          <br/>
          网站: <a href="http://www.javaeye.com">JavaEye</a>&nbsp;
          作者: <a href="http://azi.javaeye.com">Azi</a>&nbsp;
                    链接：<a href="http://azi.javaeye.com/blog/190470" style="color:red;">http://azi.javaeye.com/blog/190470</a>&nbsp;
          发表时间: 2008年05月07日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>PSP网页自带浏网页浏览器内存不足，是PSP永远的痛！现在终于找到了解决办法!</p>
<p align="center"><img src="http://img001.photo.21cn.com/photos/album/20080504/o/B34EBB03D1E69268997A583173CCE56C.jpg" border="0" alt="" /></p>
<p align="center"><img src="http://img001.photo.21cn.com/photos/album/20080504/o/C355D2729818B6F66F25E47AF204B538.jpg" border="0" alt="" /></p>
<p align="center"><img src="http://img001.photo.21cn.com/photos/album/20080504/o/31CDA78BC6A094F9FA44D77BF4432754.jpg" border="0" alt="" /></p>
<p>　　昨天，看见论坛里有人提起了JAVA模拟器支持了网络联接，于是想起了我一直手机必装的UCWEB浏览器。其实不用担心家里的WIFI不是GPRS网络，这不是个问题。而且UC本来就很多人性化的功能，网络书签同步、EMAIL之类，太多太多大家可以探索去！</p>
<p>　　这个东西技术含量并不太高，但是非常非常实用。解决了PSP网页自带浏网页浏览器内存不足，解决了PSP的最大遗憾，所以觉得有必要简单写下教程。</p>
<p>　　下面简单介绍下所用的软件：</p>
<p align="center"><span style="color: #3366cc;"><a href="thunder://QUFodHRwOi8vZG93bi50Z2J1cy5jb20vZG93bi5hc3B4P2lkPTE5OTkxJm5vPTFaWg==/" target="_self"><span style="color: #3366cc;">PSPKVM V0.3.2</span></a></span></p>
<p align="center"><span style="color: #3366cc;"><a href="thunder://QUFodHRwOi8vZG93bjUudGdidXMuY29tL3BzcC9zb2Z0L1d3Vy50Z2J1cy5Db01fVUM2LnJhcj8yMTkwMjU3MDA5NjQ1M3gxMjA5ODc0MzYzeDIxOTAzMTAwNjgzNTQzLWFhMjAxZDk0ZDc3ZDg4Njc5ZGQ0NDI2ZmVkMGMxMjMxWlo=/" target="_self"><span style="color: #3366cc;">UCWEB6.0 JAVA版</span></a></span></p>
<p>　　PSPKVM 是一个PSP上的JAVA模拟器，V0.3.2这个版本一个重要的功能，网络连接出现了。它让我们实现JAVA平台网络浏览器，实现了JAVA QQ，实现虚拟键盘输入！</p>
<p>
<table border="0" cellspacing="0" cellpadding="10" width="95%">
<tbody>
<tr>
<td id="zoom" class="link14pp" colspan="2">
<p><!--正文--><!-- google_ad_section_start(name=content) --></p>
<p>　　PSPKVM软件安装：</p>
<p>　　PSPKVM放在/PSP/GAME150下，虽然安装说明说GAME下也行，但是测试结果放GAME里会死机。</p>
<p>　　然后把JAVA软件放在记忆棒里面，位置随意，因为等会可以用文件浏览方式找到JAR文件。</p>
<p>　　按键说明：</p>
<p>　　&times;-&gt;数字键0&nbsp;&nbsp;&nbsp; □-&gt;数字键1<br />　　上-&gt;数字键2abc △-&gt;数字键3def <br />　　左-&gt;数字键4ghi ○-&gt;数字键5jkl <br />　　右-&gt;数字键6mno L+□-&gt;数字键7pqrs<br />　　下-&gt;数字键8tuv L+△-&gt;数字键9wxyz<br />　　摇杆-&gt;摇杆&nbsp;&nbsp;&nbsp;&nbsp; L+○-&gt;SELECT<br />　　SELECT-&gt;左软键 START-&gt;右软键<br />　　SELECT+L-&gt;*&nbsp;&nbsp;&nbsp;&nbsp; START+R-&gt;# <br />　　L+R+△&nbsp;&nbsp; 在多个任务中切换<br />　　L+R+&times;-&gt; 终止当前任务</p>
<p>　　UCWEB软件安装及设置</p>
<p>　　1、运行PSPKVM</p>
<p align="center"><img src="http://img001.photo.21cn.com/photos/album/20080504/o/623B9B9DEC2396E8E55B93062CBE1BCF.jpg" border="0" alt="" /></p>
<p>　　2、选FIND APPLICATION</p>
<p align="center"><img src="http://img001.photo.21cn.com/photos/album/20080504/o/A9FA1CA114B0130E043D1A215A35BE82.jpg" border="0" alt="" /></p>
<p>　　3、然后以文件浏览方式浏览，找到UCWEB.JAR</p>
<p>　　4、点确认就可以了，然后在主界面就可以见到了，分辨率选480X272设置，如图：</p>
<p align="center"><img src="http://img001.photo.21cn.com/photos/album/20080504/o/82DC3D370AC3A5F0C43E47EEDEBCC3D6.jpg" border="0" alt="" /></p>
<p align="center"><img src="http://img001.photo.21cn.com/photos/album/20080504/o/08296D17BD765E94DE520107AA8530C4.jpg" border="0" alt="" /></p>
<p align="left">　　运行：</p>
<p align="center"><img src="http://img001.photo.21cn.com/photos/album/20080504/o/6D0C5E29A13A04D40D917A59C3AE75AE.jpg" border="0" alt="" /> </p>
<p>　　完成安装，接着是设置UCWEB的参数了，为了解决大家担心的是否GPRS连接，请按下面图片设置！</p>
<p align="center"><img src="http://img001.photo.21cn.com/photos/album/20080504/o/F4068595503C7E4C782D0EC044ADCC9E.jpg" border="0" alt="" /></p>
<p align="center"><img src="http://img001.photo.21cn.com/photos/album/20080504/o/D9EC8AA79A0628CBF737A1AEB28BD196.jpg" border="0" alt="" /></p>
<p align="center"><img src="http://img001.photo.21cn.com/photos/album/20080504/o/08296D17BD765E94DE520107AA8530C4.jpg" border="0" alt="" /></p>
<p>　　最后保存就可以了，只要连接时候选好接入点就OK了。虚拟键盘效果效果图(输入地址很方便)</p>
<p align="center"><img src="http://img001.photo.21cn.com/photos/album/20080504/o/C355D2729818B6F66F25E47AF204B538.jpg" border="0" alt="" /></p>
<p>　　好了，大家可以跟PSP网页浏览内存不足说再见了。UC浏览器的各种扩展功能。网络书签同步、EMAIL等十分实用！</p>
<p>　　我把我手机上的书签已经导入我PSP里了，很方便，和手机共通，过瘾！大家享受去吧，大屏幕！比手机过瘾！在咖啡厅、飞机场，看个EMAIL什么的，总比带个本本轻松。输入地址什么的虽然没有中文输入法，但能输入网址也足够了。</p>
<p>　　SLECT 和 START键对应的是手机上的左右键，很容易上手。</p>
</td>
</tr>
</tbody>
</table>
</p>
          <br/>
          <span style="color:red;">
            <a href="http://azi.javaeye.com/blog/190470#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li><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, 07 May 2008 09:36:40 +0800</pubDate>
        <link>http://azi.javaeye.com/blog/190470</link>
        <guid>http://azi.javaeye.com/blog/190470</guid>
      </item>
          <item>
        <title>Google Maps API资源汇总</title>
        <author>Azi</author>
        <description>
          <![CDATA[
          <br/>
          网站: <a href="http://www.javaeye.com">JavaEye</a>&nbsp;
          作者: <a href="http://azi.javaeye.com">Azi</a>&nbsp;
                    链接：<a href="http://azi.javaeye.com/blog/190177" style="color:red;">http://azi.javaeye.com/blog/190177</a>&nbsp;
          发表时间: 2008年05月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>最近要做的项目要用到Google Maps API，或者51ditu map API。在对比中摸索前行。以下是搜集到的一些文档说明，希望对有同样开发目的的朋友有所帮助！</p>
<blockquote>
<p><span style="color: #33cccc;"><strong>中文资料部分 </strong>（包括中文的文档说明等，以下的网址都是中文内容。）</span><span style="color: #33cccc;"><strong>下面的关于API的中文文档</strong></span></p>
<p>Google Maps API 第2版中文文档</p>
<p><a href="http://www.step1.cn/GoogleApi/map2/documentation.htm" target="_blank"><span style="color: #cce0ff;">http://www.step1.cn/GoogleApi/map2/documentation.htm<img id="snap_com_shot_link_icon" class="snap_preview_icon" style="padding-right: 0px; background-position: -787px 0px; display: inline; padding-left: 0px; font-weight: normal; min-height: 0px; left: auto; float: none; background-image: url(http://i.ixnp.com/images/v3.28/theme/orange/palette.gif); visibility: visible; padding-bottom: 0px; margin: 0px; vertical-align: top; width: 14px; line-height: normal; padding-top: 1px; background-repeat: no-repeat; font-style: normal; font-family: 'trebuchet ms', arial, helvetica, sans-serif; position: static; top: auto; height: 12px; background-color: transparent; text-decoration: none; maxheight: 2000px; maxwidth: 2000px; minwidth: 0px; cssfloat: none; border-width: 0px;" src="http://i.ixnp.com/images/v3.28/t.gif" alt="" /></span></a></p>
<p>Google Maps API 第2版升级指南</p>
<p><a href="http://www.step1.cn/GoogleApi/map2/upgrade.htm" target="_blank"><span style="color: #cce0ff;">http://www.step1.cn/GoogleApi/map2/upgrade.htm<img id="snap_com_shot_link_icon" class="snap_preview_icon" style="padding-right: 0px; background-position: -787px 0px; display: inline; padding-left: 0px; font-weight: normal; min-height: 0px; left: auto; float: none; background-image: url(http://i.ixnp.com/images/v3.28/theme/orange/palette.gif); visibility: visible; padding-bottom: 0px; margin: 0px; vertical-align: top; width: 14px; line-height: normal; padding-top: 1px; background-repeat: no-repeat; font-style: normal; font-family: 'trebuchet ms', arial, helvetica, sans-serif; position: static; top: auto; height: 12px; background-color: transparent; text-decoration: none; maxheight: 2000px; maxwidth: 2000px; minwidth: 0px; cssfloat: none; border-width: 0px;" src="http://i.ixnp.com/images/v3.28/t.gif" alt="" /></span></a></p>
<p>Google Maps API 第2版类参考 <a href="http://www.step1.cn/GoogleApi/map2/reference.htm" target="_blank"></a></p>
<p><a href="http://www.step1.cn/GoogleApi/map2/reference.htm" target="_blank"><span style="color: #cce0ff;">http://www.step1.cn/GoogleApi/map2/reference.htm<img id="snap_com_shot_link_icon" class="snap_preview_icon" style="padding-right: 0px; background-position: -787px 0px; display: inline; padding-left: 0px; font-weight: normal; min-height: 0px; left: auto; float: none; background-image: url(http://i.ixnp.com/images/v3.28/theme/orange/palette.gif); visibility: visible; padding-bottom: 0px; margin: 0px; vertical-align: top; width: 14px; line-height: normal; padding-top: 1px; background-repeat: no-repeat; font-style: normal; font-family: 'trebuchet ms', arial, helvetica, sans-serif; position: static; top: auto; height: 12px; background-color: transparent; text-decoration: none; maxheight: 2000px; maxwidth: 2000px; minwidth: 0px; cssfloat: none; border-width: 0px;" src="http://i.ixnp.com/images/v3.28/t.gif" alt="" /></span></a></p>
<p>另外一个版本的Google Maps API 2中文文档 <a href="http://www.zmap.org/doc/maps/documentation/" target="_blank"><span style="color: #cce0ff;">http://www.zmap.org/doc/maps/documentation/<img id="snap_com_shot_link_icon" class="snap_preview_icon" style="padding-right: 0px; background-position: -787px 0px; display: inline; padding-left: 0px; font-weight: normal; min-height: 0px; left: auto; float: none; background-image: url(http://i.ixnp.com/images/v3.28/theme/orange/palette.gif); visibility: visible; padding-bottom: 0px; margin: 0px; vertical-align: top; width: 14px; line-height: normal; padding-top: 1px; background-repeat: no-repeat; font-style: normal; font-family: 'trebuchet ms', arial, helvetica, sans-serif; position: static; top: auto; height: 12px; background-color: transparent; text-decoration: none; maxheight: 2000px; maxwidth: 2000px; minwidth: 0px; cssfloat: none; border-width: 0px;" src="http://i.ixnp.com/images/v3.28/t.gif" alt="" /></span></a></p>
<p>Google Maps API 第1版中文文档</p>
<p><a href="http://www.step1.cn/GoogleAPI/map/documentation.htm" target="_blank"><span style="color: #cce0ff;">http://www.step1.cn/GoogleAPI/map/documentation.htm<img id="snap_com_shot_link_icon" class="snap_preview_icon" style="padding-right: 0px; background-position: -787px 0px; display: inline; padding-left: 0px; font-weight: normal; min-height: 0px; left: auto; float: none; background-image: url(http://i.ixnp.com/images/v3.28/theme/orange/palette.gif); visibility: visible; padding-bottom: 0px; margin: 0px; vertical-align: top; width: 14px; line-height: normal; padding-top: 1px; background-repeat: no-repeat; font-style: normal; font-family: 'trebuchet ms', arial, helvetica, sans-serif; position: static; top: auto; height: 12px; background-color: transparent; text-decoration: none; maxheight: 2000px; maxwidth: 2000px; minwidth: 0px; cssfloat: none; border-width: 0px;" src="http://i.ixnp.com/images/v3.28/t.gif" alt="" /></span></a></p>
<p><span style="color: #33cccc;"><strong>下面是关于KML文件的中文文档</strong></span></p>
<p>Google Earth KML中文说明（一） <a href="http://gisman.bokee.com/5294713.html" target="_blank"></a></p>
<p><a href="http://gisman.bokee.com/5294713.html" target="_blank"><span style="color: #cce0ff;">http://gisman.bokee.com/5294713.html<img id="snap_com_shot_link_icon" class="snap_preview_icon" style="padding-right: 0px; background-position: -787px 0px; display: inline; padding-left: 0px; font-weight: normal; min-height: 0px; left: auto; float: none; background-image: url(http://i.ixnp.com/images/v3.28/theme/orange/palette.gif); visibility: visible; padding-bottom: 0px; margin: 0px; vertical-align: top; width: 14px; line-height: normal; padding-top: 1px; background-repeat: no-repeat; font-style: normal; font-family: 'trebuchet ms', arial, helvetica, sans-serif; position: static; top: auto; height: 12px; background-color: transparent; text-decoration: none; maxheight: 2000px; maxwidth: 2000px; minwidth: 0px; cssfloat: none; border-width: 0px;" src="http://i.ixnp.com/images/v3.28/t.gif" alt="" /></span></a></p>
<p>Google Earth KML中文说明（二） <a href="http://gisman.bokee.com/5294722.html" target="_blank"></a></p>
<p><a href="http://gisman.bokee.com/5294722.html" target="_blank"><span style="color: #cce0ff;">http://gisman.bokee.com/5294722.html<img id="snap_com_shot_link_icon" class="snap_preview_icon" style="padding-right: 0px; background-position: -787px 0px; display: inline; padding-left: 0px; font-weight: normal; min-height: 0px; left: auto; float: none; background-image: url(http://i.ixnp.com/images/v3.28/theme/orange/palette.gif); visibility: visible; padding-bottom: 0px; margin: 0px; vertical-align: top; width: 14px; line-height: normal; padding-top: 1px; background-repeat: no-repeat; font-style: normal; font-family: 'trebuchet ms', arial, helvetica, sans-serif; position: static; top: auto; height: 12px; background-color: transparent; text-decoration: none; maxheight: 2000px; maxwidth: 2000px; minwidth: 0px; cssfloat: none; border-width: 0px;" src="http://i.ixnp.com/images/v3.28/t.gif" alt="" /></span></a></p>
<p>Google Earth KML中文说明（基于Google Earth客户端版本3.0 的KML 版本2.0） <a href="http://www.step1.cn/googleapi/map/kml.htm" target="_blank"><span style="color: #cce0ff;">http://www.step1.cn/googleapi/map/kml.htm<img id="snap_com_shot_link_icon" class="snap_preview_icon" style="padding-right: 0px; background-position: -787px 0px; display: inline; padding-left: 0px; font-weight: normal; min-height: 0px; left: auto; float: none; background-image: url(http://i.ixnp.com/images/v3.28/theme/orange/palette.gif); visibility: visible; padding-bottom: 0px; margin: 0px; vertical-align: top; width: 14px; line-height: normal; padding-top: 1px; background-repeat: no-repeat; font-style: normal; font-family: 'trebuchet ms', arial, helvetica, sans-serif; position: static; top: auto; height: 12px; background-color: transparent; text-decoration: none; maxheight: 2000px; maxwidth: 2000px; minwidth: 0px; cssfloat: none; border-width: 0px;" src="http://i.ixnp.com/images/v3.28/t.gif" alt="" /></span></a></p>
<p><span style="color: #33cccc;"><strong>英文资料部分</strong> （主要是Google官方的文档说明，如果觉得中文翻译的有问题，也可以看看这些原始内容。)</span></p>
<p>Google Maps API 官方网 <a href="http://www.google.com/apis/maps/" target="_blank"></a></p>
<p><a href="http://www.google.com/apis/maps/" target="_blank"><span style="color: #cce0ff;">http://www.google.com/apis/maps/<img id="snap_com_shot_link_icon" class="snap_preview_icon" style="padding-right: 0px; background-position: -787px 0px; display: inline; padding-left: 0px; font-weight: normal; min-height: 0px; left: auto; float: none; background-image: url(http://i.ixnp.com/images/v3.28/theme/orange/palette.gif); visibility: visible; padding-bottom: 0px; margin: 0px; vertical-align: top; width: 14px; line-height: normal; padding-top: 1px; background-repeat: no-repeat; font-style: normal; font-family: 'trebuchet ms', arial, helvetica, sans-serif; position: static; top: auto; height: 12px; background-color: transparent; text-decoration: none; maxheight: 2000px; maxwidth: 2000px; minwidth: 0px; cssfloat: none; border-width: 0px;" src="http://i.ixnp.com/images/v3.28/t.gif" alt="" /></span></a></p>
<p>Google Maps API 英文文档</p>
<p><a href="http://www.google.com/apis/maps/documentation/" target="_blank"><span style="color: #cce0ff;">http://www.google.com/apis/maps/documentation/<img id="snap_com_shot_link_icon" class="snap_preview_icon" style="padding-right: 0px; background-position: -787px 0px; display: inline; padding-left: 0px; font-weight: normal; min-height: 0px; left: auto; float: none; background-image: url(http://i.ixnp.com/images/v3.28/theme/orange/palette.gif); visibility: visible; padding-bottom: 0px; margin: 0px; vertical-align: top; width: 14px; line-height: normal; padding-top: 1px; background-repeat: no-repeat; font-style: normal; font-family: 'trebuchet ms', arial, helvetica, sans-serif; position: static; top: auto; height: 12px; background-color: transparent; text-decoration: none; maxheight: 2000px; maxwidth: 2000px; minwidth: 0px; cssfloat: none; border-width: 0px;" src="http://i.ixnp.com/images/v3.28/t.gif" alt="" /></span></a></p>
<p>Google Maps API 官方Blog <a href="http://googlemapsapi.blogspot.com/" target="_blank"></a></p>
<p><a href="http://googlemapsapi.blogspot.com/" target="_blank"><span style="color: #cce0ff;">http://googlemapsapi.blogspot.com/<img id="snap_com_shot_link_icon" class="snap_preview_icon" style="padding-right: 0px; background-position: -787px 0px; display: inline; padding-left: 0px; font-weight: normal; min-height: 0px; left: auto; float: none; background-image: url(http://i.ixnp.com/images/v3.28/theme/orange/palette.gif); visibility: visible; padding-bottom: 0px; margin: 0px; vertical-align: top; width: 14px; line-height: normal; padding-top: 1px; background-repeat: no-repeat; font-style: normal; font-family: 'trebuchet ms', arial, helvetica, sans-serif; position: static; top: auto; height: 12px; background-color: transparent; text-decoration: none; maxheight: 2000px; maxwidth: 2000px; minwidth: 0px; cssfloat: none; border-width: 0px;" src="http://i.ixnp.com/images/v3.28/t.gif" alt="" /></span></a></p>
<p>Google Maps API 论坛 <a href="http://groups.google.com/group/Google-Maps-API" target="_blank"></a></p>
<p><a href="http://groups.google.com/group/Google-Maps-API" target="_blank"><span style="color: #cce0ff;">http://groups.google.com/group/Google-Maps-API<img id="snap_com_shot_link_icon" class="snap_preview_icon" style="padding-right: 0px; background-position: -787px 0px; display: inline; padding-left: 0px; font-weight: normal; min-height: 0px; left: auto; float: none; background-image: url(http://i.ixnp.com/images/v3.28/theme/orange/palette.gif); visibility: visible; padding-bottom: 0px; margin: 0px; vertical-align: top; width: 14px; line-height: normal; padding-top: 1px; background-repeat: no-repeat; font-style: normal; font-family: 'trebuchet ms', arial, helvetica, sans-serif; position: static; top: auto; height: 12px; background-color: transparent; text-decoration: none; maxheight: 2000px; maxwidth: 2000px; minwidth: 0px; cssfloat: none; border-width: 0px;" src="http://i.ixnp.com/images/v3.28/t.gif" alt="" /></span></a></p>
<p>Google KML 的官方文档</p>
<p><a href="http://earth.google.com/kml/" target="_blank"><span style="color: #cce0ff;">http://earth.google.com/kml/<img id="snap_com_shot_link_icon" class="snap_preview_icon" style="padding-right: 0px; background-position: -787px 0px; display: inline; padding-left: 0px; font-weight: normal; min-height: 0px; left: auto; float: none; background-image: url(http://i.ixnp.com/images/v3.28/theme/orange/palette.gif); visibility: visible; padding-bottom: 0px; margin: 0px; vertical-align: top; width: 14px; line-height: normal; padding-top: 1px; background-repeat: no-repeat; font-style: normal; font-family: 'trebuchet ms', arial, helvetica, sans-serif; position: static; top: auto; height: 12px; background-color: transparent; text-decoration: none; maxheight: 2000px; maxwidth: 2000px; minwidth: 0px; cssfloat: none; border-width: 0px;" src="http://i.ixnp.com/images/v3.28/t.gif" alt="" /></span></a></p>
<p>Google API官方网 <a href="http://code.google.com/" target="_blank"></a></p>
<p><a href="http://code.google.com/" target="_blank"><span style="color: #cce0ff;">http://code.google.com/</span><img id="snap_com_shot_link_icon" class="snap_preview_icon" style="padding-right: 0px; background-position: -787px 0px; display: inline; padding-left: 0px; font-weight: normal; min-height: 0px; left: auto; float: none; background-image: url(http://i.ixnp.com/images/v3.28/theme/orange/palette.gif); visibility: visible; padding-bottom: 0px; margin: 0px; vertical-align: top; width: 14px; line-height: normal; padding-top: 1px; background-repeat: no-repeat; font-style: normal; font-family: 'trebuchet ms', arial, helvetica, sans-serif; position: static; top: auto; height: 12px; background-color: transparent; text-decoration: none; maxheight: 2000px; maxwidth: 2000px; minwidth: 0px; cssfloat: none; border-width: 0px;" src="http://i.ixnp.com/images/v3.28/t.gif" alt="" /></a></p>
</blockquote>
          <br/>
          <span style="color:red;">
            <a href="http://azi.javaeye.com/blog/190177#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><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 06 May 2008 13:51:52 +0800</pubDate>
        <link>http://azi.javaeye.com/blog/190177</link>
        <guid>http://azi.javaeye.com/blog/190177</guid>
      </item>
          <item>
        <title>详解IE浏览器的缓存</title>
        <author>Azi</author>
        <description>
          <![CDATA[
          <br/>
          网站: <a href="http://www.javaeye.com">JavaEye</a>&nbsp;
          作者: <a href="http://azi.javaeye.com">Azi</a>&nbsp;
                    链接：<a href="http://azi.javaeye.com/blog/189770" style="color:red;">http://azi.javaeye.com/blog/189770</a>&nbsp;
          发表时间: 2008年05月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>我们在上网浏览信息时经常会用到IE里的&ldquo;前进&rdquo;、&ldquo;后退&rdquo;按钮，来调用阅读过的页面。你会发现，这时的显示速度比较快。其实这些刚调出来的内容就存放在电脑的缓存中，而不需再次从网上重新传输数据。这就引出了一个概念&mdash;&mdash;缓存，你对它是否了解呢？让我们一起来了解一下这方面的知识吧！ </p>
<p>　　缓存的概念</p>
<p><br />　　缓存是指在本地使用的电脑中开辟一个空间，作为数据传输的缓冲区。IE里的缓存主要就是用来暂时保存用户以前访问过的信息。既然缓存存在于硬盘之中，那么它肯定是以文件夹的形式出现的。各个不同类型的浏览器都有各个不同的文件夹作为缓存使用。在系统缺省状态下，IE 5.0的缓存文件夹为&ldquo;WINDOWSTemporary Internet Files&rdquo;。</p>
<p>　　缓存的工作原理</p>
<p>　　当用户在浏览器中设置一定量的磁盘缓存后，浏览器上网工作时会把从网上读出的网页、图像以及其他数据存放在磁盘缓存之中，并建立相应的文档索引。然后检查磁盘缓冲区中是否存在相应的数据。如果有，则直接从本地磁盘上读出。缓存按照信息存放的位置可分成内存缓存和硬盘缓存两种。内存缓存是用于暂时存储本次上网所调用的数据资料的，从Internet上传来的每一个网页信息，在内存缓存中都相应地给予保存一个备份，&ldquo;前进&rdquo;和&ldquo;后退&rdquo;实际上是将以前的页面从内存缓存中调出来并显示在用户的浏览器窗口中，在内存缓存中存放的网页信息量和内存缓存的大小有关，内存缓存越大，保存的网页信息量就越多。硬盘缓存是用于保存用户前几次上网时所调用的信息资料，用户从&ldquo;历史记录&rdquo;中调出的内容其实就是保存在硬盘缓存中，只要用户开辟的硬盘缓存足够大，就可保存用户前几个星期甚至几个月前调用过的信息资料。</p>
<p>　　缓存的正确设置</p>
<p>　　如果缓存容量设置的太小，所能存放的数据信息量就很小，大部分数据还是需要从网上重新下载，并且系统还要花费一定的系统资源来频繁清除缓存中的数据，最终结果会使浏览速度明显下降。</p>
<p>　　如果浏览器的缓存设置太大，磁盘缓存中存放的数据信息量将很大，以后每次需要重新访问这些信息时，浏览器将不得不在庞大的缓存信息中搜索需要的文档，这样会使硬盘频繁工作，所需时间将长于从网上下载数据的时间。另外，如果缓存容量设置得太大，在硬盘容量一定的情况下，其他系统程序占用的资源将变得相对较少，从而会降低电脑本身的运行速度，磁盘缓存就失去了应有的作用。如果你经常要访问的信息量很大，而且电脑中的硬盘有较多闲置空间，那么你可以把硬盘缓存的数值设置成100MB～300MB。</p>
<p>　　用户无论使用哪一种浏览器，正确设置浏览器的缓存参数将大大地提高浏览效率，并在一定程度上改善浏览器的工作性能。我们以IE 5.0浏览器为例：</p>
<p>　　打开IE 5.0操作窗口，单击&ldquo;工具&rdquo;菜单中的&ldquo;Internet选项&rdquo;，屏幕上将出现&ldquo;Internet选项&rdquo;对话框。单击&ldquo;常规&rdquo;标签下的&ldquo;Internet临时文件&rdquo;设置栏，单击&ldquo;设置&rdquo;按钮，程序将会打开一个标题为&ldquo;设置&rdquo;对话框。如果用户想节省硬盘的空间，也可选取&ldquo;删除文件&rdquo;按钮，以便释放出更多缓存空间。</p>
<p>　　在&ldquo;设置&rdquo;对话框上有4个单选项：</p>
<p>　　1、每次访问此页时检查：表示浏览器将发送一个信息给所要访问的页面的Web服务器，查询当前访问的信息是否有变动，如无变动，就从硬盘缓存中直接调用，而且每次访问都要发送信息给Web服务器进行验证。</p>
<p>　　2、每次启动Internet Explorer时检查：表示本次上网浏览器将只发送一次信息给Web服务器进行验证，以后无论信息是否发生变动，都从硬盘缓存中直接调用所要访问的页面的信息。</p>
<p>　　3、自动：表示浏览器将自动检查所要访问的信息最近是否发生变动，如有变动，则从Internet上重新下载网页；相反，则直接从硬盘中读取数据。</p>
<p>　　4、不检查：表示对要调用的页面信息不进行校验，直接从硬盘中调用。</p>
<p>　　弄清楚了以上4个选项后，用户就可根据自己的实际情况进行设定，浏览器默认选择&ldquo;自动&rdquo;这一单选项。</p>
<p>　　在&ldquo;使用的磁盘空间处&rdquo;用鼠标直接拖动滑动杆来改变缓存的大小，或者直接在后面的文本框中输入具体的数值。如果用户想改变浏览器缓存的位置，如C盘空间小或为使用方便，用户只需将缓存移到其他分区或者把缓存放到一个易操作的地方，就可通过另外选择一个文件夹来作为缓存。在这里用户只要按下&ldquo;移动文件夹&rdquo;并指定要新建的文件夹名称即可。参数设定后，单击&ldquo;确定&rdquo;按钮，退出选项对话框。</p>
<p>　　注意事项</p>
<p>　　1、磁盘缓存如果使用不当或使用时间较长时，有时会导致浏览器降低工作效率或停止工作。具体表现在：一是打开一个网页时硬盘不停地工作，需很长的时间才有反应。这是因为缓存太大、缓存中数据太多造成的；二是浏览器不工作，无法打开任何网页。这是因为缓存中的数据文档混乱或者已经破坏造成的。解决此类问题的方法是适当减小缓存容量或者定期及时清理缓存中的数据。</p>
<p>　　2、使用缓存后网页不能自动更新，虽然在设置缓存时可自动检测网页是否更新，但实际工作中常出现读出旧网页内容。解决上述故障的方法是随时按下浏览器的&ldquo;刷新&rdquo;或&ldquo;Reload&rdquo;按钮。</p>
          <br/>
          <span style="color:red;">
            <a href="http://azi.javaeye.com/blog/189770#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><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 05 May 2008 15:50:14 +0800</pubDate>
        <link>http://azi.javaeye.com/blog/189770</link>
        <guid>http://azi.javaeye.com/blog/189770</guid>
      </item>
          <item>
        <title>Log4J实践</title>
        <author>Azi</author>
        <description>
          <![CDATA[
          <br/>
          网站: <a href="http://www.javaeye.com">JavaEye</a>&nbsp;
          作者: <a href="http://azi.javaeye.com">Azi</a>&nbsp;
                    链接：<a href="http://azi.javaeye.com/blog/189764" style="color:red;">http://azi.javaeye.com/blog/189764</a>&nbsp;
          发表时间: 2008年05月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>下面给出得Log4J配置文件实现了输出到控制台，文件，回滚文件，发送日志邮件，输出到数据库日志表，自定义标签等全套功能。</p>
<p>log4j.rootLogger=DEBUG,CONSOLE,A1,im<br />#DEBUG,CONSOLE,FILE,ROLLING_FILE,MAIL,DATABASE</p>
<p>log4j.addivity.org.apache=true</p>
<p><br />###################<br /># Console Appender<br />###################<br />log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender<br />log4j.appender.Threshold=DEBUG<br />log4j.appender.CONSOLE.Target=System.out<br />log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout<br />log4j.appender.CONSOLE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n<br />#log4j.appender.CONSOLE.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD] n%c[CATEGORY]%n%m[MESSAGE]%n%n</p>
<p><br />#####################<br /># File Appender<br />#####################<br />log4j.appender.FILE=org.apache.log4j.FileAppender<br />log4j.appender.FILE.File=file.log<br />log4j.appender.FILE.Append=false<br />log4j.appender.FILE.layout=org.apache.log4j.PatternLayout<br />log4j.appender.FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n<br /># Use this layout for LogFactor 5 analysis</p>
<p>&nbsp;</p>
<p>########################<br /># Rolling File<br />########################<br />log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender<br />log4j.appender.ROLLING_FILE.Threshold=ERROR<br />log4j.appender.ROLLING_FILE.File=rolling.log<br />log4j.appender.ROLLING_FILE.Append=true<br />log4j.appender.ROLLING_FILE.MaxFileSize=10KB<br />log4j.appender.ROLLING_FILE.MaxBackupIndex=1<br />log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout<br />log4j.appender.ROLLING_FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n</p>
<p><br />####################<br /># Socket Appender<br />####################<br />log4j.appender.SOCKET=org.apache.log4j.RollingFileAppender<br />log4j.appender.SOCKET.RemoteHost=localhost<br />log4j.appender.SOCKET.Port=5001<br />log4j.appender.SOCKET.LocationInfo=true<br /># Set up for Log Facter 5<br />log4j.appender.SOCKET.layout=org.apache.log4j.PatternLayout<br />log4j.appender.SOCET.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD]%n%c[CATEGORY]%n%m[MESSAGE]%n%n</p>
<p><br />########################<br /># Log Factor 5 Appender<br />########################<br />log4j.appender.LF5_APPENDER=org.apache.log4j.lf5.LF5Appender<br />log4j.appender.LF5_APPENDER.MaxNumberOfRecords=2000</p>
<p><br />########################<br /># SMTP Appender<br />#######################<br />log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender<br />log4j.appender.MAIL.Threshold=FATAL<br />log4j.appender.MAIL.BufferSize=10<br /><a href="mailto:log4j.appender.MAIL.From=chenyl@hollycrm.com">log4j.appender.MAIL.From=xxx@xxx.com</a><br />log4j.appender.MAIL.SMTPHost=mail.hollycrm.com<br />log4j.appender.MAIL.Subject=Log4J Message<br /><a href="mailto:log4j.appender.MAIL.To=chenyl@hollycrm.com">log4j.appender.MAIL.To=xxx@xxx.com</a><br />log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout<br />log4j.appender.MAIL.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n</p>
<p><br />########################<br /># JDBC Appender<br />#######################<br />log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender<br />log4j.appender.DATABASE.URL=jdbc:mysql://localhost:3306/test<br />log4j.appender.DATABASE.driver=com.mysql.jdbc.Driver<br />log4j.appender.DATABASE.user=root<br />log4j.appender.DATABASE.password=<br />log4j.appender.DATABASE.sql=INSERT INTO LOG4J (Message) VALUES ('[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n')<br />log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout<br />log4j.appender.DATABASE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n</p>
<p><br />log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender<br />log4j.appender.A1.File=SampleMessages.log4j<br />log4j.appender.A1.DatePattern=yyyyMMdd-HH'.log4j'<br />log4j.appender.A1.layout=org.apache.log4j.xml.XMLLayout</p>
<p>###################<br />#自定义Appender<br />###################<br />log4j.appender.im = net.cybercorlin.util.logger.appender.IMAppender</p>
<p>log4j.appender.im.host = mail.cybercorlin.net<br />log4j.appender.im.username = username<br />log4j.appender.im.password = password<br />log4j.appender.im.recipient = <a href="mailto:xxxx@xxx.com">xxxx@xxx.com</a></p>
<p>log4j.appender.im.layout=org.apache.log4j.PatternLayout<br />log4j.appender.im.layout.ConversionPattern =[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n</p>
          <br/>
          <span style="color:red;">
            <a href="http://azi.javaeye.com/blog/189764#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/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</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, 05 May 2008 15:42:09 +0800</pubDate>
        <link>http://azi.javaeye.com/blog/189764</link>
        <guid>http://azi.javaeye.com/blog/189764</guid>
      </item>
          <item>
        <title>commons configuration</title>
        <author>Azi</author>
        <description>
          <![CDATA[
          <br/>
          网站: <a href="http://www.javaeye.com">JavaEye</a>&nbsp;
          作者: <a href="http://azi.javaeye.com">Azi</a>&nbsp;
                    链接：<a href="http://azi.javaeye.com/blog/189763" style="color:red;">http://azi.javaeye.com/blog/189763</a>&nbsp;
          发表时间: 2008年05月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>运行时需要的一些组件包： <br />commons beanutils <br />commons collections <br />commons digester <br />commons lang <br />commons logging <br />xml apis or xerces <br />依存关系： <br />Core <br />commons collections <br />commons lang <br />ConfigurationFactory <br />commons logging <br />commons digester <br />DatabaseConfiguration <br />commons logging <br />XMLConfiguration, HierarchicalXMLConfiguraion <br />xml apis or xerces <br />JNDIConfiguration <br />commons logging <br />ConfigurationDynaBean <br />commons beanutils <br />commons logging <br />用ConfigurationFactory 进行配置</p>
<p>portal/<br />|--src/<br />|--WEB-INF/<br />|----config.xml<br />|----properties/<br />|------usergui.properties<br />|----classes/<br />|------ConfigurationFactoryTest.class</p>
<p>ConfigurationFactory 提供了两种方式用于指定配置文件的位置：</p>
<p>setConfigurationURL(URL) <br />setConfigurationFileName(String) <br />使用factory.setConfigurationURL(URL) 方法指定配置文件</p>
<p>ConfigurationFactory factory = new ConfigurationFactory();<br />URL url = new File("WEB-INF/config.xml").toURL();<br />factory.setConfigurationURL(url);<br />Configuration config = factory.getConfiguration();<br />System.out.println(config.getString("colors.background"));</p>
<p>此时config.xml 中其他配置文件的声明要用相对于config.xml 的路径</p>
<p>&lt;?xml version="1.0" encoding="ISO-8859-1" ?&gt;<br />&lt;configuration&gt;<br />&nbsp; &lt;properties fileName="properties/usergui.properties"/&gt;<br />&nbsp; &lt;!--或 fileName="./properties/usergui.properties"--&gt;<br />&lt;/configuration&gt;</p>
<p><br />使用factory.setConfigurationFileName(String) 方法指定配置文件</p>
<p>ConfigurationFactory factory = new ConfigurationFactory();<br />factory.setConfigurationFileName("WEB-INF/config.xml");<br />Configuration config = factory.getConfiguration();<br />System.out.println(config.getString("colors.background")); <br />此时config.xml 中其他配置文件的声明要用相对于项目的根目录的路径：</p>
<p>&lt;?xml version="1.0" encoding="ISO-8859-1" ?&gt;<br />&lt;configuration&gt;<br />&nbsp; &lt;properties fileName="WEB-INF/properties/usergui.properties"/&gt;<br />&lt;/configuration&gt;</p>
<p><br />！注：如果配置文件的路径填写不正确的话就会遇到如下两个Exception <br />org.apache.commons.configuration.ConfigurationFactory.getConfiguration(ConfigurationFactory.java:135) - Exception caught opening stream to URL 表明找不到config.xml <br />org.apache.commons.digester.Digester.endElement(Digester.java:1069) - End event threw exception java.lang.reflect.InvocationTargetException 表明找不到config.xml 中声明的其他配置文件</p>
          <br/>
          <span style="color:red;">
            <a href="http://azi.javaeye.com/blog/189763#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><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 05 May 2008 15:39:18 +0800</pubDate>
        <link>http://azi.javaeye.com/blog/189763</link>
        <guid>http://azi.javaeye.com/blog/189763</guid>
      </item>
          <item>
        <title>如何选择配置管理工具 </title>
        <author>Azi</author>
        <description>
          <![CDATA[
          <br/>
          网站: <a href="http://www.javaeye.com">JavaEye</a>&nbsp;
          作者: <a href="http://azi.javaeye.com">Azi</a>&nbsp;
                    链接：<a href="http://azi.javaeye.com/blog/189749" style="color:red;">http://azi.javaeye.com/blog/189749</a>&nbsp;
          发表时间: 2008年05月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>　　每一个软件项目，无论是工程类项目，还是产品类项目，都必须经历需求分析、系统设计、编码实现、集成测试、部署、交付、维护和支持的过程。在这个过程中，将生成各种各样不同的工件，包括文档、源程序、可执行代码、支持库。更可怕的是，频繁出现的变更是不可避免的，因此面向如此庞大且不断变动的信息集，如何使其有序、高效地存放、查找和利用就成为了一个突出的问题。<br />　　针对这一问题，最早的开发人员尝试过的解决办法是通过手工来实现：<br />　　1)文档：每次修改时都另存为一个新的文件，然后通过文件名进行区分，例如"XXX 软件需求说明书V1.0，XXX软件需求说明书V1.1，XXX 软件需求说明书V2.0."，并且在文件中注明每次版本变化的内容；<br />　　2) 源代码：每次要修改时就将整个工程目录复制一份，将原来的文件夹进行改名，例如"XX 项目V1.0、XX 项目1.01、."，然后在新的目录中进行修改；<br />　　但是这种方法，不仅十分繁琐，容易出错，而且会带来大量的垃圾数据。如果是团队协同开发或者是项目规模较大时，还是会造成很大的混乱。很显然，这样简陋的方法是无法应对这一问题的。<br />　　后来，有人尝试从制造工业领域引入了"配置管理"这一概念，通过不懈的研究与实践，最终形成了一套管理办法和活动原则，这也就是软件配置管理。<br />　　通过软件配置管理，将对软件系统中的多重版本实施系统的管理；全面记载系统开发的历史过程，包括为什么修改，谁作了修改，修改了什么；管理和追踪开发过程中危害软件质量以及影响开发周期的缺陷和变化。并对开发过程进行有效地管理和控制，完整、明确地记载开发过程中的历史变更，形成规范化的文档，不仅使日后的维护和升级得到保证，而且更重要的是，这还会保护宝贵的代码资源，积累软件财富，提高软件重用率，加快投资回报。</p>
<p>&nbsp;</p>
<p>常见的配置管理工具</p>
<p>　　正如前面所述，由于软件配置管理过程十分繁杂，管理对象错综复杂，如果是采用人工的办法不仅费时费力，还容易出错，产生大量的废品。因此，引入一些自动化工具是十分有裨益的，这也是做好配置管理的必要条件。<br />　　正是因为如此，市场上出现了大量的自动化配置管理工具，这些工具的实现原理与基本机制均十分接近，但由于其定位不同，因此各有特点，下面我们就对一些常见的配置管理工具做一简单的介绍。</p>
<p>　　元老：CCC、SCCS、RCS<br />　　上个世纪七十年代初期加利福利亚大学的Leon Presser教授撰写了一篇论文，提出控制变更和配置的概念，之后在1975年，他成立了一家名为SoftTool的公司，开发了自己的配置管理工具：CCC，这也是最早的配置管理工具之一。<br />　　在软件配置管理工具发展史上，继CCC之后，最具有里程碑式的是两个自由软件：Marc Rochkind 的SCCS (Source Code Control System) 和Walter Tichy 的RCS (Revision Control System)，它们对配置管理工具的发展做出了重大的贡献，直到现在绝大多数配置管理工具基本上都源于它们的设计思想和体系架构。<br />　　</p>
<p>&nbsp;&nbsp; 中坚：Rational ClearCase<br />　　Rational 公司是全球最大的软件CASE 工具提供商，现已被IBM收购。也许是受到其拳头产品、可视化建模第一工具Rose 的影响，它开发的配置管理工具ClearCase 也是深受用户的喜爱，是现在应用面最广的企业级、跨平台的配置管理工具之一。<br />　　ClearCase提供了比较全面的配置管理支持，其中包括版本控制、工作空间管理、Build管理等，而且开发人员无需针对其改变现有的环境、工具和工作方式。<br />　　其最大的缺点就在于其价格不菲，每个客户端用户许可证大约需要几千美金，所以在国内应用群体有限。<br />　　1） 版本控制<br />　　ClearCase不仅可以对文件、目录、链接进行版本控制，同时还提供了先进的版本分支和归本功能用于支持并行开发。另外，它还支持广泛的文件类型。<br />　　2）工作空间管理<br />　　可以为开发人员提供私人存储区，同时可以实现成员之间的信息共享，从而为每一位开发人员提供一致、灵活、可重用的工作空间域。<br />　　3） Build管理<br />　　对ClearCase 控制的数据，既可以使用定制脚本，也可使用本机提供的make 程序。<br />　　其最大的缺点就在于其价格不菲，每个客户端用户许可证大约需要几千美金，所以在国内应用群体有限。<br />　&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp; 新秀：Hansky Firefly<br />　　做为H a n s k y 公司软件开发管理套件中重要一员的Firefly，可以轻松管理、维护整个企业的软件资产，包括程序代码和相关文档。Firefly是一个功能完善、运行速度极快的软件配置管理系统，可以支持不同的操作系统和多种集成开发环境，因此它能在整个企业中的不同团队，不同项目中得以应用。<br />　　Firefly基于真正的客户机/服务器体系结构，不依赖于任何特殊的网络文件系统，可以平滑地运行在不同的LAN、WAN 环境中。它的安装配置过程简单易用，Firefly 可以自动、安全地保存代码的每一次变化内容，避免代码被无意中覆盖、修改。项目管理人员使用Firefly可以有效地组织开发力量进行并行开发和管理项目中各阶段点的各种资源，使得产品发布易于管理；并可以快速地回溯到任一历史版本。系统管理员使用Firefly的内置工具可以方便的进行存储库的备份和恢复，而不依赖于任何第三方工具。<br />　　<br />&nbsp;&nbsp;&nbsp; 开源奇葩：CVS<br />　　CVS 是Concurrent Versions System 的缩写，它是开放源代码软件世界的一个伟大杰作，由于其简单易用、功能强大，跨平台，支持并发版本控制，而且免费，它在全球中小型软件企业中得到了广泛使用。<br />　　其最大的遗憾就是缺少相应的技术支持，许多问题的解决需要自已寻找资料，甚至是读源代码。<br />　　<br />&nbsp;&nbsp; 小工作组级：Merant PVCS<br />　　MERANT 公司的PVCS 能够提供对软件配置管理的基本支持，通过使用其图形界面或类似SCCS 的命令，能够基本满足小型项目开发的配置管理需求。PVCS 虽然功能上也基本能够满足需求，但是其性能表现一直较差，逐渐地被市场所冷落。<br />　　<br />&nbsp;&nbsp; 入门级：Microsoft Visual Source Safe<br />　　Visual Source Safe，即VSS，是微软公司为Visual Studio配套开发的一个小型的配置管理工具，准确来说，它仅能够称得上是一个小型的版本控制软件。VSS的优点在于其与Visual Studio实现了无缝集成，使用简单。提供了历史版本记录、修改控制、文件比较、日志等基本功能。<br />　　但其缺点也是十分明显的，只支持Windows平台，不支持并行开发，通过Check out - Modify - Check in的管理方式，一个时间只允许一个人修改代码，而且速度慢、伸缩性差，不支持异地开发。甚至于微软本身也不采用其做为配置管理工具，而是使用一个名为SLM 的内部工具。</p>
<p>&nbsp;</p>
<p>如何选择配置管理工具<br />　　面对这些形形色色，各有千秋的配置管理工具，如何根据组织特点、开发团队需要，选择切合适用的工具呢？笔者就结合工作实践中的经验与大家做一些交流与探讨。<br />　　配置管理工具的选择所需考虑的因素大体包括以下几个因素：<br />　　功能是否符合实际需求？是否符合团队特点？性能是否满意？费用是否可以接受？售后服务如何？接下来，我们就这几方面逐一深入地探讨：<br />　　<br />&nbsp;&nbsp;&nbsp; 1）功能是否符合实际需求，是否符合团队特点<br />　　工具就是用来帮助您解决问题的，因此功能是否符合实际需求是最重要的判断因素。而大多数主流配置管理工具的基本功能都能够满足，因此主要需要判断以下几个因素： </p>
<p><br />&nbsp;&nbsp; 并行开发支持<br />　　在团队协作开发过程中，有两种主要的模式：集体代码权和个体代码权。采用集体代码权模式进行开发时，一段代码可能同时会被多个开发人员同时修改；而采用个体代码权模式进行开发时，每一段代码都始终被一个开发人员独享，别人需要修改时也会通过该开发人员完成。<br />　　而配置管理软件针对这一情况，也采用了不同的策略：Copy-Modify-Merge(拷贝、修改、合并) 的并行开发模式、Check out-Modify-Check in（签出、修改、签入）的独占开发模式。在并行开发模式下，开发人员可以并行开发、更改代码，Firefly会自动检测到代码冲突，并自动合并，或提示开发人员手动解决。<br />　　表一、并行开发支持比较表</p>
<p>工具名称</p>
<p>说明</p>
<p>ClearCase</p>
<p>Copy-Modify-Merge 模式</p>
<p>Firefly</p>
<p>Copy-Modify-Merge 模式</p>
<p>CVS</p>
<p>Copy-Modify-Merge 模式</p>
<p>PVCS</p>
<p>Check out-Modify-Check in 模式</p>
<p>VSS</p>
<p>Check out-Modify-Check in 模式</p>
<p><br />&nbsp;&nbsp; 异地开发支持<br />　　如果你的开发团队分布在不同的开发地点，就需要对工具的异地开发功能进行仔细的评估了。大多数工具都提供基于Web的界面，用户可以通过浏览器执行配置管理的相关操作，而且有些工具就通过这样的方法来实现对异地开发的支持。<br />　　这种实现方法有太多的局限性，例如网络（Internet）连接带宽的限制、防火墙以及安全问题等。真正意义上的异地开发支持，是指在不同的开发地点建立各自的存储库，通过工具提供同步功能自动或手动同步。这样做的好处是与网络无关，即便各个开发地点之间没有实时连通的网络，也可以通过E-Mail 附件等其它方式将同步包发给对方，实现手动的同步。<br />　　表二异地开发支持比较表</p>
<p>工具名称</p>
<p>说明</p>
<p>ClearCase</p>
<p>提供MultiSite 模块，通过自动或手动同步位于不同开发地点的存储库的方式，支持异地开发</p>
<p>Firefly</p>
<p>提供ServerSync 模块，通过自动或手动同步位于不同开发地点的存储库的方式，支持异地开发 </p>
<p>CVS</p>
<p>无专门支持的模块</p>
<p>PVCS</p>
<p>无专门支持的模块</p>
<p>VSS</p>
<p>无专门支持的模块 </p>
<p>　　值得说明的是，在不同开发点建立各自存储库的方式，主要适用于两个或两个以上位于不同地点的开发团队协作开发的情况。如果仅是采用虚拟团队合作的方式，开发人员以个体的形式散落在不同地方，则更适合通过Internet 直接操作远程的配置管理服务器。<br />　　</p>
<p>&nbsp;&nbsp; 跨平台开发支持<br />　　如果企业需要从事多个不同平台下的开发工作，就需要配置管理工具能够对跨平台开发提供支持，否则势必会给开发、测试、发布等各个环节带来不便，将使大量的时间被浪费于代码的手工上传、下载中。 <br />　　表三跨平台开发支持比较表 </p>
<p>工具名称</p>
<p>说明</p>
<p>ClearCase</p>
<p>支持常见的平台</p>
<p>Firefly</p>
<p>软件本身基于Java开发，可在Windows、Linux、Solaris、HP-UX、AIX等常见平台上使用，平台之间的移植也非常方便</p>
<p>CVS</p>
<p>支持几乎所有的操作系统</p>
<p>PVCS</p>
<p>软件本身基于Java 开发，能够支持常见的平台</p>
<p>VSS</p>
<p>仅支持Windows 操作系统</p>
<p>&nbsp;&nbsp; 与开发工具的集成性<br />　　配置管理工具与开发工具是编码过程中最常用到两种工具，因此它们之间的集成性直接影响到开发人员的便利性，如果无法良好集成，开发人员将不可避免地在配置管理工具与开发工具之间来回切换。<br />　　表四与开发工具集成性比较表 </p>
<p>工具名称</p>
<p>说明</p>
<p>ClearCase</p>
<p>直接与资源管理器集成，十分易用</p>
<p>Firefly</p>
<p>与常见开发工具无缝集成</p>
<p>CVS</p>
<p>对开发工具集成性较差</p>
<p>PVCS</p>
<p>仅支持Windows 操作系统</p>
<p>VSS</p>
<p>与Visual Studio开发工具包无缝连接，其它开发工具集成性差</p>
<p>　　2）性能是否满意<br />　　配置管理工具软件的一些性能指标对于最终的选择也有着至关重要的影响。</p>
<p>&nbsp;&nbsp; 运行性能<br />　　如果开发团队规模不大的情况下，配置管理工具软件的性能不会造成很大影响，但如果项目规模比较大，团队成员逐渐增多的情况下，其运行性能就会带来很大的影响。<br />　　表五运行性能比较表 </p>
<p>工具名称</p>
<p>说明</p>
<p>ClearCase</p>
<p>服务器采用多进程机制，使用自带多版本文件系统MVFS，对性能有较大负面影响。做为一款企业级、全面的开发配置管理工具，适用于大型开发团队</p>
<p>Firefly</p>
<p>服务器采用了多线程的应用服务器，性能表现优秀，做为一款企业级、全面的开发配置管理，能适用于50人到上千人的团队</p>
<p>CVS</p>
<p>较高的运行性能，适用于各种级别的开发团队</p>
<p>PVCS</p>
<p>服务器采用文件系统共享方式，对CPU、内存及网络要求较高，性能一般，仅适用于中小型项目团队，不适合于企业级应用</p>
<p>VSS</p>
<p>相对功能单一、简陋，适用于几个人的小型团队，在数据量不大的情况下，性能可以接受</p>
<p>&nbsp;&nbsp; 易用性<br />　　表六易用性比较表</p>
<p>工具名称</p>
<p>说明</p>
<p>ClearCase</p>
<p>安装、配置、使用相对较复杂，需要进行团队培训</p>
<p>Firefly</p>
<p>在提供全面配置管理功能的情况下，安装、配置、使用较为简单，包括安装、配置、培训在内的整个实施周期一般不会超过一个月。</p>
<p>CVS</p>
<p>安装、配置较复杂，但使用比较简单，只需对配置管理做简单培训即可</p>
<p>PVCS</p>
<p>使用比较简单，只需对配置管理做简单培训即可</p>
<p>VSS</p>
<p>安装、配置、使用均较简单，很容易上手使用</p>
<p>　　从用户界面、与开发工具的集成性角度来说，这几款主流的配置管理软件均有较好的设计，均有较好的易用性。<br />　　安全性<br />　　表七安全性比较表 </p>
<p>工具名称</p>
<p>说明</p>
<p>ClearCase</p>
<p>采用C/S模式，需要共享服务器上的存储目录以供客户端访问，这将带来一定安全隐患</p>
<p>Firefly</p>
<p>服务器上的存储目录不用共享，对客户端不透明，客户端不可直接访问存储目录，使系统更安全可靠</p>
<p>CVS</p>
<p>采用C/S 模式，不需要共享服务器上的存储目录，安全性较好</p>
<p>PVCS</p>
<p>基于文件系统共享，而且需要以"可写"的权限共享存储目录，存在较大的安全隐患</p>
<p>VSS</p>
<p>基于文件系统共享实现对服务器的访问，需要共享存储目录，这将带来一定安全隐患</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3）费用是否可以接受<br />　　Rational ClearCase、Hansky Firefly 两款均属于企业级配置管理工具软件,ClearCase价格较贵，，相比之下Hansky Firefly 是一款不错的选择。<br />　　而PVCS其价格大约是每客户端几百美元的水平，对于国内企业来说，性价比不太划算。VSS 是微软打包在Visual Studio开发工具包之中的，显然花费的精力不大，价格也比较便宜，可以做为个人、小项目团队版本控制之用。<br />　　而CVS则是一款完全免费的开源软件，性能较之企业级配置管理工具差距不大，也是一种不错的选择。<br />　　4） 售后服务如何<br />　　表八售后服务比较表</p>
<p>工具名称</p>
<p>说明</p>
<p>ClearCase</p>
<p>大型商用软件，已被IBM公司收购，但国内市场拓展有限，因此服务支持会受到限制。现在中国用户的支持是由位于澳大利亚悉尼的支持中心联系</p>
<p>Firefly</p>
<p>大型商用软件，已在中国成立分公司，全面拓展市场之中，在北京设有支持中心</p>
<p>CVS</p>
<p>做为开源软件，无官方支持，需要用户自己查找资料解决技术问题，现在也出现专门为CVS做技术支持的公司</p>
<p>PVCS</p>
<p>在中国市场开拓有限，国内没有支持中心</p>
<p>VSS</p>
<p>做为微软的非核心产品，技术支持有限。在其网站上有提供一些常见问题，只有对正式购买的用户提供一定的技术支持</p>
<p>售后服务与产品支持也是一个很重要的考察点，工具在使用过程中出现这样那样的问题是很平常的事，有些是因为使用不当，有些则是工具本身的缺陷。这些问题都会直接影响到开发团队的使用，因此随时能够找到专业技术人员解决这些问题就变成十分重要。</p>
          <br/>
          <span style="color:red;">
            <a href="http://azi.javaeye.com/blog/189749#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li><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, 05 May 2008 15:31:22 +0800</pubDate>
        <link>http://azi.javaeye.com/blog/189749</link>
        <guid>http://azi.javaeye.com/blog/189749</guid>
      </item>
          <item>
        <title>Borland</title>
        <author>Azi</author>
        <description>
          <![CDATA[
          <br/>
          网站: <a href="http://www.javaeye.com">JavaEye</a>&nbsp;
          作者: <a href="http://azi.javaeye.com">Azi</a>&nbsp;
                    链接：<a href="http://azi.javaeye.com/blog/189739" style="color:red;">http://azi.javaeye.com/blog/189739</a>&nbsp;
          发表时间: 2008年05月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>Borland是曾经最为欣赏的一个公司。现记录怀念：</p>
<p>2003年5月 Borland将Charles J. Robel 增补为董事会成员 </p>
<p>2003年4月 Borland 为Microsoft&reg; .NET Framework 提供了应用程序生命周期管理策略</p>
<p>Borland 为Microsoft Visual Studio .NET 2003 提供了集成需求管理解决方案－Borland&reg; CaliberRM&reg;</p>
<p>2003年2月 Borland 宣布为Microsoft&reg;.NET Framework提供Borland&reg;Optimizeit&reg; Profiler 性能担保解决方案</p>
<p>首个作为TogetherSoft收购成果进行发布的集成产品。Borland&reg; Together&reg;Edition for JBuilder&reg; 发布并集成到Borland&reg; Enterprise Studio 5 for Java&reg;</p>
<p>2003年1月 Borland完成对Starbase的收购</p>
<p>Borland完成对TogetherSoft的收购</p>
<p>Borland发布用于J2EE&reg;平台的性能担保解决方案－Borland&reg; Optimizeit&reg; ServerTrace </p>
<p>Borland 公布 2002 第四季度收入情况，以及2002年收入增涨达10％</p>
<p>Borland 成为首家许可使用 Microsoft&reg; .NET Framework SDK的公司</p>
<p>2002年11月 Borland 发布Borland&reg; JBuilder&reg; 8 以及 Optimizeit&reg;Suite 5</p>
<p>Borland交付 Borland&reg; C++ Builder&reg; Mobile Edition，扩展了对增强可移动应用程序开发的支持</p>
<p>Borland 参加了由美国商业部长率领的前往非洲的贸易代表团</p>
<p><br />2002年10月 Borland 收购 BoldSoft MDE Aktiebolag</p>
<p>Borland 签署了收购Starbase 公司的最终协议</p>
<p>Borland宣布进军墨西哥，并创建了附属公司－Borland Software de Mexico, S.A.</p>
<p>Borland 在2002的第三季度收入增长了10％</p>
<p>Borland签署了收购 TogetherSoft 公司的最终协议</p>
<p>2002年8月 BEA 与 Borland 针对交付 Java&reg; 与 Web Services解决方案签署全球协议</p>
<p>Borland宣布与IBM签署全球市场销售协议，共同促进在企业中进行的开发工作</p>
<p>Borland交付了首个Microsoft&reg; .NET 独立通道－ Delphi&reg; 7 Studio</p>
<p>2002年7月 Borland 公布连续9个季度持续盈利，同时连续10个季度保持运营中的现金正向流动</p>
<p>Borland发布Borland&reg; Kylix&reg; 3，向位于Linux&reg;操作系统／平台上的Borland&reg; C++的开发提供首个快速应用程序开发解决方案</p>
<p>2002年6月 Borland 参加了由美国商业部长率领的前往墨西哥的贸易代表团</p>
<p>Borland 任命 Scott Langmack 为销售主管 </p>
<p>2002年5月 Borland被软件开发杂志吸收进 Jolt 奖的名誉殿堂</p>
<p>Borland 收购 Highlander Engineering</p>
<p>Borland对 Borland&reg; C++技术进行了预览，该技术将应用于Symbian&reg;操作系统上的2.5G/3G 移动应用程序</p>
<p>2002年4月 Borland由于在软件开发中的卓越表现，被吸收进软件开发Jolt 奖的 &ldquo;名誉殿堂&rdquo; </p>
<p>Borland软件公司参加美－中高级会议</p>
<p>Borland 将SEC前代理董事长 Laura S. Unger 增补进董事会</p>
<p>Borland通过在 Java&reg; 领域所具有的首创性加入OSS</p>
<p>2002年3月 ADC 为其新的支持质量管理（SQM）解决方案的开发与分发选择了Borland&reg; JBuilder&reg; 以及 Borland&reg; Enterprise Server </p>
<p>Borland 与Sprint针对通过应用于Sprint&reg; PCS Wireless Toolkits for the Java&reg; 平台的Borland&reg; JBuilder&reg; MobileSet中的支持实现无线开发，签订了一份销售许可协议。 </p>
<p>Sybase 与 Borland 签订战略合作协议，以便为Sybase Customers 带来先进的Java&reg; 开发环境</p>
<p>Borland 赢得八项2001年度 JAVAPro&reg; 读者评选大奖</p>
<p>Borland 加入Web Services互操作性组织</p>
<p>Borland 加入前往新加坡的美国贸易代表团具有领先地位的多国公司行列</p>
<p>2002 年2月 Borland 发布应用于Microsoft&reg; .NET&reg; 平台的产品策略</p>
<p>Borland&reg; Kylix&reg; 连续两年在LinuxWorld 上获得最佳开发工具称号</p>
<p>2002年1月 Borland 收购 VMGEAR－ OptimizeIt&reg; Suite的开发者，其中包括为Java?开发者提供的性能担保及测试解决方案</p>
<p>Borland 收购高级培训中心有限公司 (ATC)－一家巴西的IT培训公司 </p>
<p>Borland发布Borland&reg; Enterprise Studio for Windows&reg; －一套新型的、紧密集成的、强大的业界领先产品</p>
<p><br />2001年12月 Borland交付 应用于Java&reg; 的Web Services开发环境</p>
<p>Borland 任命前BEA执行官 Charles Hixson 为美洲区副总裁</p>
<p>2001 年11月 Borland 推广采用新的软件平台的 Java&reg;<br />Borland&reg; J2EE&reg; 平台 突出了新的 Java&reg; 解决方案：<br />Borland&reg; Enterprise Studio for Java, Borland&reg; JBuilder 6 以及Borland? Enterprise Server</p>
<p>Borland 发布 Borland JBuilder MobileSet, 应用于新的Sun J2ME 无线工具包</p>
<p>Borland 对 Java Community Process的执行委员会进行了改选</p>
<p>2001年11月 爱立信使用Borland技术，创建供应商支持供应解决方案<br />(con't) <br />Borland 任命BEA前执行官Julian Quinn为亚太区副总裁 </p>
<p>2001年10月 Borland 引领J2EE 应用服务器的业界标准基准 <br />发布应用于ECperf 1.0 基准的 Borland AppServer Kit </p>
<p>Borland Kylix 2 为Linux 交付首个Web Services解决方案，并在Evans 数据公司开发者调查活动中显示出其在Linux 应用程序开发解决方案领域中的领导地位</p>
<p>Borland 与西门子移动公司共同进行无线 Java 的开发</p>
<p>诺基亚与 Borland 共同演示 Java 技术 </p>
<p>作为Borland CEO 的Dale Fuller被选入 SIIA 董事会</p>
<p><br />2001 年9月 Borland 发布应用于 Java 的Web Services策略</p>
<p>Borland 与印度Ingram Micro 签署销售协议</p>
<p>Borland 选择Sonic Software 提供业界领先的电子商务通信</p>
<p>Borland 宣布其业绩突出的普通股股票回购授权最高可达$3000万 </p>
<p>2001年8月 Borland 发布应用于Linux Web支持策略</p>
<p>Borland 在中国建立首家公司</p>
<p>2001 年7月 Borland 为Linux 系列交付 Kylix Open Edition </p>
<p>Borland 发布首个大型机支持产品－ Borland TeamSource DSP</p>
<p>2001年6月 Borland 赢得六项 2001年度 JAVAPro 读者评选大奖，同时 Borland JBuilder 赢得 JavaWorld 编辑评选大奖</p>
<p>诺基亚与Borland 合作，共同支持用于无线设备SAP的 Java 应用程序的开发，并共同集成 Java 开发环境</p>
<p>2001 年5月 Borland 的 Two-WayTools 获得专利权</p>
<p>2001年4月 Borland 收入增长，并在第一季度取得盈利</p>
<p>Borland JBuilder 连续两年获得 Jolt 奖</p>
<p>2001年1月 Borland 发布世界上首个应用于Linux平台的快速应用程序开发环境－ Borland Kylix</p>
<p>Inprise 公司更名为Borland</p>
<p>2000年11月 Inprise 收购Bedouin, Inc., 以便加速创建新的大型机支持商务单元和产品</p>
<p>2000年7月 Inprise 公布第一季度的收益情况以及第三季度运营效益</p>
<p>2000年5月 Inprise 任命 Doug Barre 为运营主管</p>
<p>1999年10月 Inprise 发布业界首个应用程序服务器，用于集成EJB? 和 CORBA?</p>
<p>1999年4月 Dale L. Fuller 成为总裁及CEO</p>
<p>1998年6月 Borland International更名为 Inprise</p>
<p>1997年7月 Borland 发布Borland JBuilder 系列Java 开发工具，用于创建公司&ldquo;国际网络&rdquo;应用程序</p>
<p>1997年11月 Borland 收购 Visigenic, 用以加速企业处理市场的增长</p>
<p>1995年2月 Borland发布Borland Delphi 和 Borland Delphi Client/Server; Borland Delphi , 在可视开发工具领域建立了新的标准</p>
<p>1995年1月 Philippe Kahn 辞去总裁及CEO</p>
<p>1993年11月 Borland 发布业界首个完整的压缩包用户／服务器解决方案－Borland Client/Server Pack</p>
<p>1992年2月 Borland 首次公开演示用于OS/2 2.0的 Borland C++ 与 Borland ObjectVision 2.0 </p>
<p>Borland 正式开始在加利福尼亚的Scotts Valley建立新的公司总部。三百多名当地政府及商界领导人参加了庆祝典礼</p>
<p>1991年10月 Philippe Kahn 成为PC杂志主办的第八界年度奖评选的1991年度技术优秀奖获得者。该奖是在COMDEX（计算机分销商展览会）上颁布的 </p>
<p>1989年12月 Borland 宣布首次在美国公开销售证券。该证券包含2,252,000 股Borland普通股的销售，每股最初上市成本为$10.00 </p>
<p>1986年7月 Borland成为上市公司，最初有价证券的公开销售在伦敦的未上市有价证券市场进行 </p>
<p>Borland在英国及法国建立了欧洲公司，欧洲总部设在巴黎</p>
<p>1983年11月20日 Borland 推出Borland Turbo Pascal, 它是应用于 Turbo Language Series的旗舰产品，能够对Pascal Language进行高速编辑及全面扩展</p>
<p>1983年5月2日 Philippe Kahn 和Anders heijsberg 在加利福尼亚的 Scotts Valley建立了Borland国际有限公司，从事个人计算机的高性能编程语言及应用程序软件进行开发与市场开拓</p>
          <br/>
          <span style="color:red;">
            <a href="http://azi.javaeye.com/blog/189739#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li><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, 05 May 2008 15:17:21 +0800</pubDate>
        <link>http://azi.javaeye.com/blog/189739</link>
        <guid>http://azi.javaeye.com/blog/189739</guid>
      </item>
          <item>
        <title>Session详解 </title>
        <author>Azi</author>
        <description>
          <![CDATA[
          <br/>
          网站: <a href="http://www.javaeye.com">JavaEye</a>&nbsp;
          作者: <a href="http://azi.javaeye.com">Azi</a>&nbsp;
                    链接：<a href="http://azi.javaeye.com/blog/189737" style="color:red;">http://azi.javaeye.com/blog/189737</a>&nbsp;
          发表时间: 2008年05月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>本文为转贴，由于写得太好了，珍藏。</p>
<p>作者：郎云鹏（dev2dev ID: hippiewolf）</p>
<p>摘要：虽然session机制在web应用程序中被采用已经很长时间了，但是仍然有很多人不清楚session机制的本质，以至不能正确的应用这一技术。本文将详细讨论session的工作机制并且对在Java web application中应用session机制时常见的问题作出解答。</p>
<p>目录：<br /><a href="http://dev2dev.bea.com.cn/bbs/jishudata/ArticleShow.jsp?Id=10#1">一、术语session</a><br /><a href="http://dev2dev.bea.com.cn/bbs/jishudata/ArticleShow.jsp?Id=10#2">二、HTTP协议与状态保持</a><br /><a href="http://dev2dev.bea.com.cn/bbs/jishudata/ArticleShow.jsp?Id=10#3">三、理解cookie机制</a><br /><a href="http://dev2dev.bea.com.cn/bbs/jishudata/ArticleShow.jsp?Id=10#4">四、理解session机制</a><br /><a href="http://dev2dev.bea.com.cn/bbs/jishudata/ArticleShow.jsp?Id=10#5">五、理解javax.servlet.http.HttpSession</a><br /><a href="http://dev2dev.bea.com.cn/bbs/jishudata/ArticleShow.jsp?Id=10#6">六、HttpSession常见问题</a><br /><a href="http://dev2dev.bea.com.cn/bbs/jishudata/ArticleShow.jsp?Id=10#7">七、跨应用程序的session共享</a><br /><a href="http://dev2dev.bea.com.cn/bbs/jishudata/ArticleShow.jsp?Id=10#8">八、总结</a><br /><a href="http://dev2dev.bea.com.cn/bbs/jishudata/ArticleShow.jsp?Id=10#9">参考文档</a></p>
<p id="#1"><strong>一、术语session</strong><br />在我的经验里，session这个词被滥用的程度大概仅次于transaction，更加有趣的是transaction与session在某些语境下的含义是相同的。</p>
<p>session，中文经常翻译为会话，其本来的含义是指有始有终的一系列动作/消息，比如打电话时从拿起电话拨号到挂断电话这中间的一系列过程可以称之为一个session。有时候我们可以看到这样的话&ldquo;在一个浏览器会话期间，...&rdquo;，这里的会话一词用的就是其本义，是指从一个浏览器窗口打开到关闭这个期间①。最混乱的是&ldquo;用户（客户端）在一次会话期间&rdquo;这样一句话，它可能指用户的一系列动作（一般情况下是同某个具体目的相关的一系列动作，比如从登录到选购商品到结账登出这样一个网上购物的过程，有时候也被称为一个transaction），然而有时候也可能仅仅是指一次连接，也有可能是指含义①，其中的差别只能靠上下文来推断②。</p>
<p>然而当session一词与网络协议相关联时，它又往往隐含了&ldquo;面向连接&rdquo;和/或&ldquo;保持状态&rdquo;这样两个含义，&ldquo;面向连接&rdquo;指的是在通信双方在通信之前要先建立一个通信的渠道，比如打电话，直到对方接了电话通信才能开始，与此相对的是写信，在你把信发出去的时候你并不能确认对方的地址是否正确，通信渠道不一定能建立，但对发信人来说，通信已经开始了。&ldquo;保持状态&rdquo;则是指通信的一方能够把一系列的消息关联起来，使得消息之间可以互相依赖，比如一个服务员能够认出再次光临的老顾客并且记得上次这个顾客还欠店里一块钱。这一类的例子有&ldquo;一个TCP session&rdquo;或者&ldquo;一个POP3 session&rdquo;③。</p>
<p>而到了web服务器蓬勃发展的时代，session在web开发语境下的语义又有了新的扩展，它的含义是指一类用来在客户端与服务器之间保持状态的解决方案④。有时候session也用来指这种解决方案的存储结构，如&ldquo;把xxx保存在session里&rdquo;⑤。由于各种用于web开发的语言在一定程度上都提供了对这种解决方案的支持，所以在某种特定语言的语境下，session也被用来指代该语言的解决方案，比如经常把Java里提供的javax.servlet.http.HttpSession简称为session⑥。</p>
<p>鉴于这种混乱已不可改变，本文中session一词的运用也会根据上下文有不同的含义，请大家注意分辨。<br />在本文中，使用中文&ldquo;浏览器会话期间&rdquo;来表达含义①，使用&ldquo;session机制&rdquo;来表达含义④，使用&ldquo;session&rdquo;表达含义⑤，使用具体的&ldquo;HttpSession&rdquo;来表达含义⑥</p>
<p id="#2"><strong>二、HTTP协议与状态保持</strong><br />HTTP协议本身是无状态的，这与HTTP协议本来的目的是相符的，客户端只需要简单的向服务器请求下载某些文件，无论是客户端还是服务器都没有必要纪录彼此过去的行为，每一次请求之间都是独立的，好比一个顾客和一个自动售货机或者一个普通的（非会员制）大卖场之间的关系一样。</p>
<p>然而聪明（或者贪心？）的人们很快发现如果能够提供一些按需生成的动态信息会使web变得更加有用，就像给有线电视加上点播功能一样。这种需求一方面迫使HTML逐步添加了表单、脚本、DOM等客户端行为，另一方面在服务器端则出现了CGI规范以响应客户端的动态请求，作为传输载体的HTTP协议也添加了文件上载、cookie这些特性。其中cookie的作用就是为了解决HTTP协议无状态的缺陷所作出的努力。至于后来出现的session机制则是又一种在客户端与服务器之间保持状态的解决方案。</p>
<p>让我们用几个例子来描述一下cookie和session机制之间的区别与联系。笔者曾经常去的一家咖啡店有喝5杯咖啡免费赠一杯咖啡的优惠，然而一次性消费5杯咖啡的机会微乎其微，这时就需要某种方式来纪录某位顾客的消费数量。想象一下其实也无外乎下面的几种方案：<br />1、该店的店员很厉害，能记住每位顾客的消费数量，只要顾客一走进咖啡店，店员就知道该怎么对待了。这种做法就是协议本身支持状态。<br />2、发给顾客一张卡片，上面记录着消费的数量，一般还有个有效期限。每次消费时，如果顾客出示这张卡片，则此次消费就会与以前或以后的消费相联系起来。这种做法就是在客户端保持状态。<br />3、发给顾客一张会员卡，除了卡号之外什么信息也不纪录，每次消费时，如果顾客出示该卡片，则店员在店里的纪录本上找到这个卡号对应的纪录添加一些消费信息。这种做法就是在服务器端保持状态。</p>
<p>由于HTTP协议是无状态的，而出于种种考虑也不希望使之成为有状态的，因此，后面两种方案就成为现实的选择。具体来说cookie机制采用的是在客户端保持状态的方案，而session机制采用的是在服务器端保持状态的方案。同时我们也看到，由于采用服务器端保持状态的方案在客户端也需要保存一个标识，所以session机制可能需要借助于cookie机制来达到保存标识的目的，但实际上它还有其他选择。</p>
<p id="#3"><strong>三、理解cookie机制</strong> <br />cookie机制的基本原理就如上面的例子一样简单，但是还有几个问题需要解决：&ldquo;会员卡&rdquo;如何分发；&ldquo;会员卡&rdquo;的内容；以及客户如何使用&ldquo;会员卡&rdquo;。</p>
<p>正统的cookie分发是通过扩展HTTP协议来实现的，服务器通过在HTTP的响应头中加上一行特殊的指示以提示浏览器按照指示生成相应的cookie。然而纯粹的客户端脚本如JavaScript或者VBScript也可以生成cookie。</p>
<p>而cookie的使用是由浏览器按照一定的原则在后台自动发送给服务器的。浏览器检查所有存储的cookie，如果某个cookie所声明的作用范围大于等于将要请求的资源所在的位置，则把该cookie附在请求资源的HTTP请求头上发送给服务器。意思是麦当劳的会员卡只能在麦当劳的店里出示，如果某家分店还发行了自己的会员卡，那么进这家店的时候除了要出示麦当劳的会员卡，还要出示这家店的会员卡。</p>
<p>cookie的内容主要包括：名字，值，过期时间，路径和域。<br />其中域可以指定某一个域比如.google.com，相当于总店招牌，比如宝洁公司，也可以指定一个域下的具体某台机器比如www.google.com或者froogle.google.com，可以用飘柔来做比。<br />路径就是跟在域名后面的URL路径，比如/或者/foo等等，可以用某飘柔专柜做比。<br />路径与域合在一起就构成了cookie的作用范围。<br />如果不设置过期时间，则表示这个cookie的生命期为浏览器会话期间，只要关闭浏览器窗口，cookie就消失了。这种生命期为浏览器会话期的cookie被称为会话cookie。会话cookie一般不存储在硬盘上而是保存在内存里，当然这种行为并不是规范规定的。如果设置了过期时间，浏览器就会把cookie保存到硬盘上，关闭后再次打开浏览器，这些cookie仍然有效直到超过设定的过期时间。</p>
<p>存储在硬盘上的cookie可以在不同的浏览器进程间共享，比如两个IE窗口。而对于保存在内存里的cookie，不同的浏览器有不同的处理方式。对于IE，在一个打开的窗口上按Ctrl-N（或者从文件菜单）打开的窗口可以与原窗口共享，而使用其他方式新开的IE进程则不能共享已经打开的窗口的内存cookie；对于Mozilla Firefox0.8，所有的进程和标签页都可以共享同样的cookie。一般来说是用javascript的window.open打开的窗口会与原窗口共享内存cookie。浏览器对于会话cookie的这种只认cookie不认人的处理方式经常给采用session机制的web应用程序开发者造成很大的困扰。</p>
<p>下面就是一个goolge设置cookie的响应头的例子<br />HTTP/1.1 302 Found<br />Location: http://www.google.com/intl/zh-CN/<br />Set-Cookie: PREF=ID=0565f77e132de138:NW=1:TM=1098082649:LM=1098082649:S=KaeaCFPo49RiA_d8; expires=Sun, 17-Jan-2038 19:14:07 GMT; path=/; domain=.google.com<br />Content-Type: text/html</p>
<p align="center">&nbsp;</p>
<p><br />这是使用HTTPLook这个HTTP Sniffer软件来俘获的HTTP通讯纪录的一部分</p>
<p align="center">&nbsp;</p>
<p><br />浏览器在再次访问goolge的资源时自动向外发送cookie</p>
<p align="center">&nbsp;</p>
<p><br />使用Firefox可以很容易的观察现有的cookie的值<br />使用HTTPLook配合Firefox可以很容易的理解cookie的工作原理。</p>
<p align="center">&nbsp;</p>
<p><br />IE也可以设置在接受cookie前询问</p>
<p align="center">&nbsp;</p>
<p><br />这是一个询问接受cookie的对话框。</p>
<p id="#4"><strong>四、理解session机制</strong><br />session机制是一种服务器端的机制，服务器使用一种类似于散列表的结构（也可能就是使用散列表）来保存信息。</p>
<p>当程序需要为某个客户端的请求创建一个session的时候，服务器首先检查这个客户端的请求里是否已包含了一个session标识 - 称为session id，如果已包含一个session id则说明以前已经为此客户端创建过session，服务器就按照session id把这个session检索出来使用（如果检索不到，可能会新建一个），如果客户端请求不包含session id，则为此客户端创建一个session并且生成一个与此session相关联的session id，session id的值应该是一个既不会重复，又不容易被找到规律以仿造的字符串，这个session id将被在本次响应中返回给客户端保存。</p>
<p>保存这个session id的方式可以采用cookie，这样在交互过程中浏览器可以自动的按照规则把这个标识发挥给服务器。一般这个cookie的名字都是类似于SEEESIONID，而。比如weblogic对于web应用程序生成的cookie，JSESSIONID=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764，它的名字就是JSESSIONID。</p>
<p>由于cookie可以被人为的禁止，必须有其他机制以便在cookie被禁止时仍然能够把session id传递回服务器。经常被使用的一种技术叫做URL重写，就是把session id直接附加在URL路径的后面，附加方式也有两种，一种是作为URL路径的附加信息，表现形式为http://...../xxx;jsessionid=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764<br />另一种是作为查询字符串附加在URL后面，表现形式为http://...../xxx?jsessionid=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764<br />这两种方式对于用户来说是没有区别的，只是服务器在解析的时候处理的方式不同，采用第一种方式也有利于把session id的信息和正常程序参数区分开来。<br />为了在整个交互过程中始终保持状态，就必须在每个客户端可能请求的路径后面都包含这个session id。</p>
<p>另一种技术叫做表单隐藏字段。就是服务器会自动修改表单，添加一个隐藏字段，以便在表单提交时能够把session id传递回服务器。比如下面的表单<br />&lt;form name="testform" action="/xxx"&gt;<br />&lt;input type="text"&gt;<br />&lt;/form&gt;<br />在被传递给客户端之前将被改写成<br />&lt;form name="testform" action="/xxx"&gt;<br />&lt;input type="hidden" name="jsessionid" value="ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764"&gt;<br />&lt;input type="text"&gt;<br />&lt;/form&gt;<br />这种技术现在已较少应用，笔者接触过的很古老的iPlanet6(SunONE应用服务器的前身)就使用了这种技术。<br />实际上这种技术可以简单的用对action应用URL重写来代替。</p>
<p>在谈论session机制的时候，常常听到这样一种误解&ldquo;只要关闭浏览器，session就消失了&rdquo;。其实可以想象一下会员卡的例子，除非顾客主动对店家提出销卡，否则店家绝对不会轻易删除顾客的资料。对session来说也是一样的，除非程序通知服务器删除一个session，否则服务器会一直保留，程序一般都是在用户做log off的时候发个指令去删除session。然而浏览器从来不会主动在关闭之前通知服务器它将要关闭，因此服务器根本不会有机会知道浏览器已经关闭，之所以会有这种错觉，是大部分session机制都使用会话cookie来保存session id，而关闭浏览器后这个session id就消失了，再次连接服务器时也就无法找到原来的session。如果服务器设置的cookie被保存到硬盘上，或者使用某种手段改写浏览器发出的HTTP请求头，把原来的session id发送给服务器，则再次打开浏览器仍然能够找到原来的session。</p>
<p>恰恰是由于关闭浏览器不会导致session被删除，迫使服务器为seesion设置了一个失效时间，当距离客户端上一次使用session的时间超过这个失效时间时，服务器就可以认为客户端已经停止了活动，才会把session删除以节省存储空间。</p>
<p id="#5"><strong>五、理解javax.servlet.http.HttpSession</strong><br />HttpSession是Java平台对session机制的实现规范，因为它仅仅是个接口，具体到每个web应用服务器的提供商，除了对规范支持之外，仍然会有一些规范里没有规定的细微差异。这里我们以BEA的Weblogic Server8.1作为例子来演示。</p>
<p>首先，Weblogic Server提供了一系列的参数来控制它的HttpSession的实现，包括使用cookie的开关选项，使用URL重写的开关选项，session持久化的设置，session失效时间的设置，以及针对cookie的各种设置，比如设置cookie的名字、路径、域，cookie的生存时间等。</p>
<p>一般情况下，session都是存储在内存里，当服务器进程被停止或者重启的时候，内存里的session也会被清空，如果设置了session的持久化特性，服务器就会把session保存到硬盘上，当服务器进程重新启动或这些信息将能够被再次使用，Weblogic Server支持的持久性方式包括文件、数据库、客户端cookie保存和复制。</p>
<p>复制严格说来不算持久化保存，因为session实际上还是保存在内存里，不过同样的信息被复制到各个cluster内的服务器进程中，这样即使某个服务器进程停止工作也仍然可以从其他进程中取得session。</p>
<p>cookie生存时间的设置则会影响浏览器生成的cookie是否是一个会话cookie。默认是使用会话cookie。有兴趣的可以用它来试验我们在第四节里提到的那个误解。</p>
<p>cookie的路径对于web应用程序来说是一个非常重要的选项，Weblogic Server对这个选项的默认处理方式使得它与其他服务器有明显的区别。后面我们会专题讨论。</p>
<p>关于session的设置参考[5] http://e-docs.bea.com/wls/docs70/webapp/weblogic_xml.html#1036869</p>
<p id="#6"><strong>六、HttpSession常见问题</strong><br />（在本小节中session的含义为⑤和⑥的混合）</p>
<p><br />1、session在何时被创建<br />一个常见的误解是以为session在有客户端访问时就被创建，然而事实是直到某server端程序调用HttpServletRequest.getSession(true)这样的语句时才被创建，注意如果JSP没有显示的使用 &lt;%@page session="false"%&gt; 关闭session，则JSP文件在编译成Servlet时将会自动加上这样一条语句HttpSession session = HttpServletRequest.getSession(true);这也是JSP中隐含的session对象的来历。</p>
<p>由于session会消耗内存资源，因此，如果不打算使用session，应该在所有的JSP中关闭它。</p>
<p>2、session何时被删除<br />综合前面的讨论，session在下列情况下被删除a.程序调用HttpSession.invalidate();或b.距离上一次收到客户端发送的session id时间间隔超过了session的超时设置;或c.服务器进程被停止（非持久session）</p>
<p>3、如何做到在浏览器关闭时删除session<br />严格的讲，做不到这一点。可以做一点努力的办法是在所有的客户端页面里使用javascript代码window.oncolose来监视浏览器的关闭动作，然后向服务器发送一个请求来删除session。但是对于浏览器崩溃或者强行杀死进程这些非常规手段仍然无能为力。</p>
<p>4、有个HttpSessionListener是怎么回事<br />你可以创建这样的listener去监控session的创建和销毁事件，使得在发生这样的事件时你可以做一些相应的工作。注意是session的创建和销毁动作触发listener，而不是相反。类似的与HttpSession有关的listener还有HttpSessionBindingListener，HttpSessionActivationListener和HttpSessionAttributeListener。</p>
<p>5、存放在session中的对象必须是可序列化的吗<br />不是必需的。要求对象可序列化只是为了session能够在集群中被复制或者能够持久保存或者在必要时server能够暂时把session交换出内存。在Weblogic Server的session中放置一个不可序列化的对象在控制台上会收到一个警告。我所用过的某个iPlanet版本如果session中有不可序列化的对象，在session销毁时会有一个Exception，很奇怪。</p>
<p>6、如何才能正确的应付客户端禁止cookie的可能性<br />对所有的URL使用URL重写，包括超链接，form的action，和重定向的URL，具体做法参见[6]<br />http://e-docs.bea.com/wls/docs70/webapp/sessions.html#100770</p>
<p>7、开两个浏览器窗口访问应用程序会使用同一个session还是不同的session<br />参见第三小节对cookie的讨论，对session来说是只认id不认人，因此不同的浏览器，不同的窗口打开方式以及不同的cookie存储方式都会对这个问题的答案有影响。</p>
<p>8、如何防止用户打开两个浏览器窗口操作导致的session混乱<br />这个问题与防止表单多次提交是类似的，可以通过设置客户端的令牌来解决。就是在服务器每次生成一个不同的id返回给客户端，同时保存在session里，客户端提交表单时必须把这个id也返回服务器，程序首先比较返回的id与保存在session里的值是否一致，如果不一致则说明本次操作已经被提交过了。可以参看《J2EE核心模式》关于表示层模式的部分。需要注意的是对于使用javascript window.open打开的窗口，一般不设置这个id，或者使用单独的id，以防主窗口无法操作，建议不要再window.open打开的窗口里做修改操作，这样就可以不用设置。</p>
<p>9、为什么在Weblogic Server中改变session的值后要重新调用一次session.setValue<br />做这个动作主要是为了在集群环境中提示Weblogic Server session中的值发生了改变，需要向其他服务器进程复制新的session值。</p>
<p>10、为什么session不见了<br />排除session正常失效的因素之外，服务器本身的可能性应该是微乎其微的，虽然笔者在iPlanet6SP1加若干补丁的Solaris版本上倒也遇到过；浏览器插件的可能性次之，笔者也遇到过3721插件造成的问题；理论上防火墙或者代理服务器在cookie处理上也有可能会出现问题。<br />出现这一问题的大部分原因都是程序的错误，最常见的就是在一个应用程序中去访问另外一个应用程序。我们在下一节讨论这个问题。</p>
<p id="#7">七、跨应用程序的session共享<br /><br />常常有这样的情况，一个大项目被分割成若干小项目开发，为了能够互不干扰，要求每个小项目作为一个单独的web应用程序开发，可是到了最后突然发现某几个小项目之间需要共享一些信息，或者想使用session来实现SSO(single sign on)，在session中保存login的用户信息，最自然的要求是应用程序间能够访问彼此的session。</p>
<p>然而按照Servlet规范，session的作用范围应该仅仅限于当前应用程序下，不同的应用程序之间是不能够互相访问对方的session的。各个应用服务器从实际效果上都遵守了这一规范，但是实现的细节却可能各有不同，因此解决跨应用程序session共享的方法也各不相同。</p>
<p>首先来看一下Tomcat是如何实现web应用程序之间session的隔离的，从Tomcat设置的cookie路径来看，它对不同的应用程序设置的cookie路径是不同的，这样不同的应用程序所用的session id是不同的，因此即使在同一个浏览器窗口里访问不同的应用程序，发送给服务器的session id也可以是不同的。</p>
<p align="center">&nbsp; </p>
<p>根据这个特性，我们可以推测Tomcat中session的内存结构大致如下。</p>
<p align="center">&nbsp;</p>
<p>笔者以前用过的iPlanet也采用的是同样的方式，估计SunONE与iPlanet之间不会有太大的差别。对于这种方式的服务器，解决的思路很简单，实际实行起来也不难。要么让所有的应用