<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>discovery & surprise</title>
    <description>探索、发现、惊奇，当你脱口而出：“呀”--这是多么美妙的一种赞叹和体验！</description>
    <link>http://discovery.group.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>IE tab在Firefox里开发时的作用.</title>
        <author>rmn190</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rmn190.javaeye.com">rmn190</a>&nbsp;
          链接：<a href="http://discovery.group.javaeye.com/group/blog/225592" style="color:red;">http://discovery.group.javaeye.com/group/blog/225592</a>&nbsp;
          发表时间: 2008年08月07日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 以前看一些网页时有些不能在firefox里很好的打开或一些按钮就不能用,经人推荐后知道IE tab插件可以解决这样的问题.装上后也没多想这个插件在我们开发B/S软件时的作用.<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 现在饱受IE/firefox里的显示效果与JavaScript的不同所带来的之苦后,突然意识到: 能不能在firefox里用IE tab来跟踪调试JavaScript呢?毕竟前段时间为了找能在IE里跟踪JavaScript执行情况的插件折腾了好久,也没能找到一个上手的好工具.现在若能用IE tab来在firefox里跟踪的话, 岂不两全其美? 既可以显示IE里的效果又可以像firefox那样地用firebug来跟踪javaScript的执行细节.<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这也太爽了! 到底能不能成功呢? 用原来项目中的页面一试,果然可以!<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 现在博文记下来今天的这点收获,以期日后查询.</p>
          <br/>
          <span style="color:red;">
            <a href="http://discovery.group.javaeye.com/group/blog/225592#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>Thu, 07 Aug 2008 18:12:38 +0800</pubDate>
        <link>http://discovery.group.javaeye.com/group/blog/225592</link>
        <guid>http://discovery.group.javaeye.com/group/blog/225592</guid>
      </item>
      <item>
        <title>Acegi系列(一), 配置出问题了...</title>
        <author>rmn190</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rmn190.javaeye.com">rmn190</a>&nbsp;
          链接：<a href="http://discovery.group.javaeye.com/group/blog/210720" style="color:red;">http://discovery.group.javaeye.com/group/blog/210720</a>&nbsp;
          发表时间: 2008年07月02日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>Acegi的配置出问题了:</p>
<p><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1, 登录后所有连接都能访问. --&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2, 同样的IP,同样的浏览器中可以在不Logout情况下连续登录.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3, 即使不登录也能访问里面的连接. <br />
<br />
找到Acegi的配置文件看了又看,那么长的配置,那么多的Bean,又是那么长的类名,一头雾水,这可从哪下手呢?Google,Baidu里搜索了一番也没有找到合适的答案.倒是找到以前写的博客,这让我想起以前为了解决登录类型问题时就多多少少研究过Acegi,不过当时也只是单独从配置文件来看的,根本没没接触它背后的实现.那个问题(登录类型)解决后就把Acegi又放下了.<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 看来现在又到了跟Acegi交手的时候了.<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 与上次不同,这次交手更多地是从其背后的实现上来理解它的配置.<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Acegi是解决Java里提供安全保护的开源框架,它的核心内容就是认证(Authentication)与授权(Authorization).那认证是什么授权又是什么?第一次听到认证这人词,就不由自主地想到了现在四六级证,毕业证学位证啥的,这里的认证与我们常的证有什么联系?一点点的联系也没有?<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 结合自己以前的理解再好好的搜了下后,得出如下的认识:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 安全(Security)保护是为系统提供一套机制,以便让系统的功能只让一部分人操作.这个生活中有很多的实例,比如说我们给门加锁,加了锁后就只能是有钥匙的人才能正常的进去.而认证与授权正是安全保护所应用的两个手段(一时想不到什么更贴切的词,就先用&quot;手段&quot;吧),JavaEE里有个专门的缩写JAAS就是说这个事儿,其中认证是围绕&quot;你是谁?&quot;这个问题展开的,而授权是围绕&quot;你可以做什么&quot;展开的.<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 生活中有什么形象的例子来帮助我们理解认证与授权两个有些怪怪的词儿呢?当然有的,以我们用ATM取钱为例,我们插入银行卡,输入密码,密码正确后我们才可以进行像查询,取钱,转帐这样的操作.对密码的验证就是看看你是不是银行卡的Owner,这个&quot;看看&quot;的动作在安全保护里就叫作&quot;认证&quot;了,认证成功后,系统记下你的信息,这样我们就可以做实打实的事了,这个实打实的事的操作是有权限的,我们肯定不希望别人来取我们的钱,只能通过&quot;认证&quot;这一关的人才可能取钱.<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 上面的例子有些简化或者说一些步骤合在一起了.大家都认为&quot;取钱&quot;这一操作是需要保护,也没有对用户是否登录的验证(因为我们取钱时与AMT的Session很短,也就是取完一次后就退出了).而在软件里做安全保护时,这两个虽然不是最重要的,但也是必须的.<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 于是有了下面示意图:<img src="http://www.javaeye.com/upload/attachment/29729/c83f4a77-1c45-3f7d-ae6e-eaf5a5c185fd.jpg" alt="AcegiProcess" />
</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (1)处的&quot;Is secure resource&quot;对应着我们取钱时默认的规则,也就是对每一个请求Acegi先判断下要访问的Resource是否是受保护的.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (2)处的Principal exists也就是的取钱时对用户是否登录的验证.若没有登录就到(3)处的Login.若是已登录的,就直接到(4)处的Principal has authorized role判断.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (3)处的Login OK对应着取钱时的输入密码及对其的验证,若成功就到(4)处的判断.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (4)处的判读是看当前用户是否有操作的授权,在取钱时,ATM机会自动地把那些没权操作的选项隐藏起来,可选的操作当然也都是有权的了.<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这样经过这么一系列的筛选,我们终于可以取到钱了.<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这是对Acegi的一个大致了解,但上图所示的四步具体是怎么实现的以及可以通过什么配置来达到这种层层设防的效果呢?在下篇博客中我将试着做些解释.</p>
          <br/>
          <span style="color:red;">
            <a href="http://discovery.group.javaeye.com/group/blog/210720#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, 02 Jul 2008 17:25:25 +0800</pubDate>
        <link>http://discovery.group.javaeye.com/group/blog/210720</link>
        <guid>http://discovery.group.javaeye.com/group/blog/210720</guid>
      </item>
      <item>
        <title>IE与FireFox在显示远程图片上的一点不同</title>
        <author>rmn190</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rmn190.javaeye.com">rmn190</a>&nbsp;
          链接：<a href="http://discovery.group.javaeye.com/group/blog/210245" style="color:red;">http://discovery.group.javaeye.com/group/blog/210245</a>&nbsp;
          发表时间: 2008年07月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>项目中要用浏览器访问远程电脑上的图片,最终要在浏览器中显示的HTML如下:<br />
<br />
&nbsp;<br />
<br /></p>
<pre name="code" class="html">&lt;a href=&quot;\\file01\MCMrep\MMTTest\Target\{E3D891D5-1C51-4021-B533-67E7A0A5E501}.JPG&quot;&gt;
                &lt;img width=&quot;150&quot; height=&quot;118&quot; alt=&quot;&quot; src=&quot;\\file01\MCMrep\MMTTest\Target\{E3D891D5-1C51-4021-B533-67E7A0A5E501}.JPG&quot;/&gt;
 &lt;/a&gt;</pre>
&nbsp;
<p><br />
&nbsp;<br />
<br />
&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这里的file01是通过在WindowsOS里C:\WINDOWS\system32\drivers\etc\hosts文件加了如下一行配置得到的:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10.1.**.*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; file01</p>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 刚开始时用FireFox来做实验调试,可那个图片一直不能显示出来,如图所显:</p>
<p><img src="http://www.javaeye.com/upload/attachment/29619/e22ff299-d275-35b5-8d33-6ade05f8cfb7.jpg" height="300" alt="FireFox里的显示效果" style="vertical-align: middle;" width="300" />
 <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 最终生成HTML没什么问题,但一直显示不出来.通过与同事交流知道这是FireFox不支持远程图片的原因.<br />
<br />
&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 后来改用IE来显示那段HTML代码时,没问题了,显示如下:</p>
<p><img src="http://www.javaeye.com/upload/attachment/29617/7002201e-882d-3068-8f27-276016f3a67d.jpg" alt="IE里的显示效果" style="vertical-align: middle;" />
<br />
<br />
&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 原来浏览器在处理远程图片时还是有不同的,现在记下来,为以后用.</p>
          <br/>
          <span style="color:red;">
            <a href="http://discovery.group.javaeye.com/group/blog/210245#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, 01 Jul 2008 18:05:14 +0800</pubDate>
        <link>http://discovery.group.javaeye.com/group/blog/210245</link>
        <guid>http://discovery.group.javaeye.com/group/blog/210245</guid>
      </item>
      <item>
        <title>精雕细刻:用户交互的Message反馈</title>
        <author>rmn190</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rmn190.javaeye.com">rmn190</a>&nbsp;
          链接：<a href="http://discovery.group.javaeye.com/group/blog/210063" style="color:red;">http://discovery.group.javaeye.com/group/blog/210063</a>&nbsp;
          发表时间: 2008年07月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;</p>
<p><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 随着做Coder的日子一天天多了起来,自己对软件的理解也渐渐有所加深,按一般瓜熟蒂落的思路,在这篇的Blog里记录一下用户交互时的Validation和Message反馈的重要性.</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 记得刚学Java时,自己的注意力都放在软件真正要做的事上,例如一个网上付费的操作,自己能想的(或想的最多的)就是业务层如何操作,怎么来配置事务控制,怎么在DAO层完成这个付费所涉及的小功能块.现在日子久了,也能更多地从用户的角度来考虑问题并考虑用户的感受了.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 软件是用来做事的,这没什么可说的,但这个做事是通过的用户的操作来完成的,用户的操作就是与软件系统的一次交互,交互时用户就得知道后台系统处理的结果怎样,而后台所需的数据也该在处理前通过某种规则的验证. 这样就有了交互时所需要的做的Validation和Message反馈.</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Validation这个不必多说,关键是反馈回的Message的显示,以及显示后在什么情况下disable掉或hidden起来.</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 现在的B/S结构中的不少运用Ajax来改善用户交互,有了Ajax(再加上一些JavaScript的framework),B/S越来越接近于C/S的富功能表现与交互.另一方面,由于有了Ajax的灵活性,Message的管理也更加方便,在这个方便的基础上,如果处理不当也就很是混乱了.</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下面试着从最根儿上的用户交互出发来一步步引出Message的考虑点. 用户的一次交互的组成部分有:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1,提交前的Validation(JavaScript在Browse端验证及其验证信息的反馈),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2,提交到后台的验证及真正的业务处理,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3,处理结果以Message的形式反馈给用户.</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Validation和后台的处理都有具体的业务规则来处理,这里不必多说.重点说说Message的显示.</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Message在Browse里反馈给用户时,可能最容易想到的就是采用Alert的方式.不过这种alert的方式虽然能达到朴素的效果,但总是不够优雅.于是就用了通过JavaScript在DOM动态显示Message的新方法.在具体操作上我们可以在整个页面中定义一个id为messageDisplay的DIV,再写一个名为displayMessage的JavaScript Function.</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 采用DIV的方式显示Message与那种很原始的Alert相比有它优雅的好处,不过有些不足或者说是需要我们再在具体操作中加以弥补的是要视情况来决定这个div是否要隐藏起来.比如说页面中有如下的一个input:</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input type = "text" id = "username" /&gt;</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用户输入UserName,Browse这边也做非语义的验证,这时(为了说明问题)我们在此反馈给用户一个信息:User name is OK.现在的问题是这条信息显示给用户后它会一直在这呆着的,我们在什么时候把它隐藏起来?若不采取任何有效的措施的话,这条信息会被新的Message覆盖掉,这显然不是我们最想要的结果,毕竟这个Message是很被动地消失了的.有没有什么更的方式来让它以"很情愿"的方式disappear呢?</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 现在能想到的是:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1, 当用户在做其它操作时(如鼠标点别的按钮)也触发一个事件,通过这个事件响应把Message隐藏起来.是有些复杂.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2, 给这个Message点下时,让它在指定时间(比如说30秒)后自动disappear.这也不是很容易实现.</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一个小小的Message居然牵涉到这么多麻烦事,不由的想起IBM的Lotus产品了,人家那才就世界级的.</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 上面是以动态的角度来看如何处理那个DIV的显示与否,下面的这点相对来说容易些: 以红绿来显示Message的性质,也就是当Message时成功类型时就以绿色来显示,若是失败类型的Message时就以红色来显示.这个就是小Case了,具体的实现也就不再多说了.</p>
          <br/>
          <span style="color:red;">
            <a href="http://discovery.group.javaeye.com/group/blog/210063#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, 01 Jul 2008 10:32:55 +0800</pubDate>
        <link>http://discovery.group.javaeye.com/group/blog/210063</link>
        <guid>http://discovery.group.javaeye.com/group/blog/210063</guid>
      </item>
      <item>
        <title>Tomcat源码&quot;历险&quot;之protected关键字理解</title>
        <author>rmn190</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rmn190.javaeye.com">rmn190</a>&nbsp;
          链接：<a href="http://discovery.group.javaeye.com/group/blog/209577" style="color:red;">http://discovery.group.javaeye.com/group/blog/209577</a>&nbsp;
          发表时间: 2008年06月30日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>周末了有大块时间,我又忍不住地想鼓捣下Tomcat的源码,像往常一样又是从头看起:org.apache.catalina.startup.Bootstrap类.顾名思义，这个类是Tomcat启动时的main方法所在类.这个类本身没什么特别的,可看着看着,发现有点不对:怎么这个类里ClassLoader类型的三个属性是用protected来修饰的,而这个类本身又是不能再被extends的(也就是用final来修饰的)?</p>
<p>&nbsp;</p>
<p>不对呀,这不自绝后路吗?用protected修饰的属性只能在本类或子类中访问,而这个类又给final掉了,protected在此不就多此一举了么?难道说protected修饰的成员可以让本package中的其它类访问?</p>
<p>&nbsp;</p>
<p>是Tomcat作者写错了?还是自己对protected关键字的理解有问题?</p>
<p>&nbsp;</p>
<p>这种情况下我是不怎么相信自己的,于是先用代码试了下.</p>
<p>&nbsp;</p>
<p>1, 验证protected修饰的成员可以让本package中的其它类访问,我用如下的两个类:</p>
<pre name="code" class="java">package accessControl;

public class ProtectedAccess {
	protected int aNumber;
}</pre>
<p>&nbsp;..........</p>
<pre name="code" class="java">package accessControl;

import accessControl.innerPackage.AnotherProtectedAccess;

public class LabClass {
	private ProtectedAccess pa= new ProtectedAccess();
	
	
	public void printProtectedAccess() {
		System.out.println("Result: "+pa.aNumber);		
	}
}</pre>
<p>&nbsp;.........</p>
<p>当在LabClass类里写了上面的pa.aNumber时,Eclipse没有报错.</p>
<p>&nbsp;</p>
<p>2,验证protected修饰的成员不能被本package外的类访问,我用了如下个类:</p>
<p>&nbsp;</p>
<pre name="code" class="java">package accessControl.innerPackage;

public class AnotherProtectedAccess {
 	protected int bNumber;
}

</pre>
<p>&nbsp;..........</p>
<p>&nbsp;</p>
<pre name="code" class="java">package accessControl;

import accessControl.innerPackage.AnotherProtectedAccess;

public class LabClass {
	private ProtectedAccess pa= new ProtectedAccess();
	private AnotherProtectedAccess apa = new AnotherProtectedAccess();
	
	public void printProtectedAccess() {
		System.out.println("Result: "+pa.aNumber);
		// System.out.println("Result of apa: "+apa.bNumber); 
		// The field AnotherProtectedAccess.bNumber is not visible		
	}
}</pre>
<p>&nbsp;写下apa.bNumber后,Eclipse报错了:The field AnotherProtectedAccess.bNumber is not visible.</p>
<p>&nbsp;</p>
<p>以上实验纠正了我的一个认识:protected修饰的成员可以被本package里的其它类访问的,而不是只能被子类和本类访问.</p>
<p>再看Thinking In Java,这本书里有如下的描述:</p>
<p><br />&nbsp;1, The levels of access control from "most access" to "least access" are public,protected,package access(which has no keyword), and private.</p>
<p><br />&nbsp;2,&nbsp; protected also gives package access - that ism other classes in the same package may access protected elements.</p>
<p>&nbsp;</p>
<p>这样也就进一步证实了实验结果.</p>
<p>&nbsp;</p>
<p><br />上面的这个实验是验证了protected修饰的成员除了被子类访问外,还可以被本package里的类访问.不错.但这里的Bootstrap类是final了,这样就没有子类而只剩下同package里其它的类访问了.可不写岂不更好?难道说是Tomcat项目组的疏忽?还是另有别的我现在还没接触到的东东?</p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://discovery.group.javaeye.com/group/blog/209577#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, 30 Jun 2008 09:17:11 +0800</pubDate>
        <link>http://discovery.group.javaeye.com/group/blog/209577</link>
        <guid>http://discovery.group.javaeye.com/group/blog/209577</guid>
      </item>
      <item>
        <title>待人接物方面的一些积累(1)</title>
        <author>rmn190</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rmn190.javaeye.com">rmn190</a>&nbsp;
          链接：<a href="http://discovery.group.javaeye.com/group/blog/208596" style="color:red;">http://discovery.group.javaeye.com/group/blog/208596</a>&nbsp;
          发表时间: 2008年06月27日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>1,晚上吃饭后给钱时,应该给的钱是4块,由于钱包里的钱都是零钱,我先拿出三个一块的给了服务员,接着又掏出另一个一块的.</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 值得改进的地方是,我在掏那三块钱的同时也该说下"这是三块,我再拿一块的."</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当然服务员也没说什么,我是觉得这有不足容易引起误会的地方,需要改进.</p>
<p>&nbsp;</p>
<p>2,昨晚一块聊天时,另外一个不怎么熟的人说给我们名片,为了认识.他给我名片时我很注意地站起来用双手去接,而且拿到手后也礼貌地认真看那些基本介绍.</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 不过值得改进的地方是,接到名片后,我应该主动的告诉他我的电话和姓名,或更自然的做法是,照着他名片上的打电话号码,边说"我给你打下,我的名字是rmn190".</p>
          <br/>
          <span style="color:red;">
            <a href="http://discovery.group.javaeye.com/group/blog/208596#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 12:11:55 +0800</pubDate>
        <link>http://discovery.group.javaeye.com/group/blog/208596</link>
        <guid>http://discovery.group.javaeye.com/group/blog/208596</guid>
      </item>
      <item>
        <title>四个用前写的点东西:关于Ant以及由此联想到自己为什么喜欢编程 </title>
        <author>rmn190</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rmn190.javaeye.com">rmn190</a>&nbsp;
          链接：<a href="http://discovery.group.javaeye.com/group/blog/208587" style="color:red;">http://discovery.group.javaeye.com/group/blog/208587</a>&nbsp;
          发表时间: 2008年06月27日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>2008-2-19 9:41:06</p>
<p><br />我为什么喜欢编程?</p>
<p><br />这些天又再一次地思考这个问题了,今天在学Ant时又给了这个问题增添了一新的补充.</p>
<p><br />&nbsp;以前听说过Ant这个工具,知道给通过写个配置文件就可以自动地对所写的Java源文件进行编译,打包什么的,不过由于一直在用Eclipse也没有拿出大块时间来系统地学它.</p>
<p>&nbsp;</p>
<p>&nbsp;前些天做PushTool时,Jerry说整个项目是用Ant来统一部署的.是吧,对于项目管理来说根本就用不着再装一个Eclispe.昨天看F有本书,很厚的,内容是用Ant来进行Java开发的.竟然有专门这样的书!这些天也总给看到别人在写Ant的配置文件什么的.这样就感觉我也得专门来学下这个了.</p>
<p>&nbsp;</p>
<p>&nbsp;从昨天下午开始学到现在,以前所知道的那些知识都过了一遍.对Ant的感觉也越来越强.今天来的学的这些更是让我对Ant另眼相看,它很有Spring的味道嘛.</p>
<ol>
<li>&nbsp;可以写Property定义变量来避免重复写些String,这样很是便于以后的更改.</li>
<li>&nbsp;可以写depends属性,这样就不必来记住命令的先后顺序而直接执行最终想要那个命令.</li>
<li>&nbsp;可以用default来设置,很智能嘛!</li>
<li>&nbsp;&nbsp;现在竟然还可单独写一个execute方法而不写main就可以用Ant来执行,这已经与当初的compile-&gt;jar-&gt;run又高出一大步了.<br />&nbsp;&nbsp;可以在自写的类中通过Project这个类来访问build.xml中的配置.<br />&nbsp;&nbsp;......................</li>
</ol>
<p>&nbsp;有了这些新奇地发现,现在对编程的喜爱就又深了一步,这个Ant现在不单单是做为项目管理给我帮助,它又从另一个方面给我启示.在这方面很像下棋,看似没法补救的棋局经高手分析后就能迅速找出破绽,从而出奇致胜.</p>
<p><br />&nbsp;再深一步说,这也是一种生活状态,有坚定的信念.不气馁,不放弃!</p>
          <br/>
          <span style="color:red;">
            <a href="http://discovery.group.javaeye.com/group/blog/208587#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:57:08 +0800</pubDate>
        <link>http://discovery.group.javaeye.com/group/blog/208587</link>
        <guid>http://discovery.group.javaeye.com/group/blog/208587</guid>
      </item>
      <item>
        <title>在Java里不用Socket而直接操作远程计算机里的文件.</title>
        <author>rmn190</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rmn190.javaeye.com">rmn190</a>&nbsp;
          链接：<a href="http://discovery.group.javaeye.com/group/blog/207981" style="color:red;">http://discovery.group.javaeye.com/group/blog/207981</a>&nbsp;
          发表时间: 2008年06月25日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>今天上班时偶然发现在Java里可以在不用Socket情况下操作远程电脑机的文件,有点惊喜,记下来.</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 工作中的电脑在C:\WINDOWS\system32\drivers\etc\hosts这个文件里做了如下一行配置:</p>
<p><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10.1.**.*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; file01</p>
<p><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 现在我用如下的代码来给file01这个电脑里加一个目录:</p>
<pre name="code" class="java">String fileNameRemotelyDir = "\\\\file01\\MCMrep\\MMTTest\\Target\\TestDir";
new File(fileNameRemotelyDir).mkdirs();</pre>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 代码运行前file01指定目录下的情况是这样的:</p>
<p>&nbsp;</p>
<p>&nbsp;<img src="http://www.javaeye.com/upload/attachment/28992/474acad2-d19f-37f1-94c1-450881f1b81c.jpg" alt="before" style="vertical-align: middle;" /></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 执行上述代码后,file01的目录结构如下所示:</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; <img src="http://www.javaeye.com/upload/attachment/28990/3694d8d0-2486-3e43-abfb-740f88cf1526.jpg" alt="after" style="vertical-align: middle;" /></p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; 刚发现时是有些惊讶,不过想想这也是完全可以做的:Java虚拟机直接调用操作系统的相关功能就可以"类本地化"地操作指定的文件了.这也正是Java平台独立性的一个体现吧?<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c++在不改代码情况下可以做到吗?</p>
          <br/>
          <span style="color:red;">
            <a href="http://discovery.group.javaeye.com/group/blog/207981#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 18:27:43 +0800</pubDate>
        <link>http://discovery.group.javaeye.com/group/blog/207981</link>
        <guid>http://discovery.group.javaeye.com/group/blog/207981</guid>
      </item>
      <item>
        <title>about  @SuppressWarnings.</title>
        <author>rmn190</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rmn190.javaeye.com">rmn190</a>&nbsp;
          链接：<a href="http://discovery.group.javaeye.com/group/blog/207458" style="color:red;">http://discovery.group.javaeye.com/group/blog/207458</a>&nbsp;
          发表时间: 2008年06月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>about&nbsp; @SuppressWarnings.</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 项目组来了个很Picky的头,看到Eclipse里有大量的Warning小发了下脾气后,让用@SuppressWarnings这个标注来把Warning去掉.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为了去掉由于泛型的Warning,我们用了@SuppressWarnings("unchecked"),为了去掉那些由于deprecation而引起的Warning,用了@SuppressWarnings("deprecation").但一个类中既有unchecked又有deprecation时,怎么办?于是用了一个很权宜之计:在类声明那用@SuppressWarnings("deprecation"),而在相应的方法声明里用@SuppressWarnings("unchecked").</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用了效果当然也达到了,可就想问在一个单独的@SuppressWarnings里既去掉deprecation又去掉unchecked呢?觉得应该可以达到的.于是就用下面的方式来试.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1,@SuppressWarnings("deprecation","unchecked"),不行,Eclipse报错.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2,@SuppressWarnings("deprecation,unchecked"),不行,还是报错.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3,看@SuppressWarnings的源码,只有一个String[]类型的value.就想用@SuppressWarnings(new String[]{"deprecation","unchecked"}),还是不行,报错.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4, Google了下后,发现了这个@SuppressWarnings(value={"deprecation"}),于是就想起来了@SuppressWarnings(value={"deprecation","unchecked"}).呵呵,成了.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 好久没用接触过标注了,快忘了. 现在记下来.</p>
          <br/>
          <span style="color:red;">
            <a href="http://discovery.group.javaeye.com/group/blog/207458#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, 24 Jun 2008 13:50:05 +0800</pubDate>
        <link>http://discovery.group.javaeye.com/group/blog/207458</link>
        <guid>http://discovery.group.javaeye.com/group/blog/207458</guid>
      </item>
      <item>
        <title>老掉牙的话题</title>
        <author>rmn190</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rmn190.javaeye.com">rmn190</a>&nbsp;
          链接：<a href="http://discovery.group.javaeye.com/group/blog/206870" style="color:red;">http://discovery.group.javaeye.com/group/blog/206870</a>&nbsp;
          发表时间: 2008年06月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>老掉牙的话题<br />
<br />
&nbsp;&nbsp;&nbsp; 周末了就想看些像欧洲杯这样轻松点的东西,看了没几个,后来找到一个叫&lt;上班那些事&gt;的节目,呵呵不错,于是挑了个 点开看看.也真是的老掉牙的话题,因为这些话题市面上有太多太多的书来描述,也给出N多的建议,不过当时我的生活工作情景使的我没心思去想,久而久之习惯思维形成了,见了这样话题我也就懒的去想.<br />
&nbsp; <br />
&nbsp;&nbsp; 现在,在新的工作环境中已有半年多了,今天再看到这样话题,总觉得自己该静下心来好好想想了.<br />
<br />
<br />
&nbsp;&nbsp; &quot;说的是什么呀?&quot;怎么一堆事说不清了, --- 这么自责.先简单地记下来,再从长计议吧.<br />
<br />
1. 我想升职的几个话题:<br />
&nbsp;&nbsp; &nbsp;1.1,业务力与管理力: 彼得原理.<br />
&nbsp;&nbsp; &nbsp;1.2, 学习能力,领导能力,团队合作精神.<br />
&nbsp;&nbsp; &nbsp;1.3, 有哪些要素制约着你的升职:工作能力,人脉关系,老板知道你了解你.<br />
&nbsp;&nbsp; &nbsp;1.4, 世界卫生组织关于健康的定义: 身体,精神,人际关系.<br />
<br />
2, 亚健康的预防和治疗<br />
&nbsp;&nbsp; &nbsp;2.1 叩头: 用手敲头,每天早上或晚上用手轻敲头部大概50次.<br />
&nbsp;&nbsp; &nbsp;2.2 梳头: 每天一次,每次三到五分钟.<br />
&nbsp;&nbsp; &nbsp;2.3:击掌: 越响越好,二十次.<br />
&nbsp;&nbsp; &nbsp;2.4:浴手: 心静神凝,耳不旁听,目不远视,意守肚脐,由慢到快搓热.</p>
          <br/>
          <span style="color:red;">
            <a href="http://discovery.group.javaeye.com/group/blog/206870#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, 22 Jun 2008 17:33:46 +0800</pubDate>
        <link>http://discovery.group.javaeye.com/group/blog/206870</link>
        <guid>http://discovery.group.javaeye.com/group/blog/206870</guid>
      </item>
      <item>
        <title>记录下来以备日后往深地追: 父类构造器里的多态.</title>
        <author>rmn190</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rmn190.javaeye.com">rmn190</a>&nbsp;
          链接：<a href="http://discovery.group.javaeye.com/group/blog/206838" style="color:red;">http://discovery.group.javaeye.com/group/blog/206838</a>&nbsp;
          发表时间: 2008年06月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          下面这段代码:<pre name="code" class="java">
public class Qdb extends Depend
{
    int i = 30;
    public Qdb()
    {
        print();
        super.print();
        i = 40;
    }

    void print()
    {
        System.out.println("Target=> " + i);
    }


    public static void main(String[] args)
    {
        new Qdb();
    }
}

class Depend
{
    int i = 10;
    public Depend()
    {
        print();
        i = 20;
    }

    void print()
    {
        System.out.println("Depend=> " + i);
    }
}
</pre><br />我的预期结果:<br />	Depend=> 10<br />	Target=>30<br />	Depend=>20<br /><br />而最终结果是:<br />	Target=> 0<br />	Target=> 30<br />	Depend=> 20<br /><br />这里面涉及到的Java知识点有:<br />	1, 方法的覆盖.<br />	2, 属性在整个类初始化时的赋值时机.<br />	3, 子类初始化时先执行父类的构造方法.<br />	4, 当子类里有父类里同名的属性时,怎么处理?<br /><br />所得到的是:子类在初始化时在先执行父类的的构造方法这不假,但当在父类的构造方法里要调用有覆盖嫌疑的方法时(也就是本例中的print方法)要调用子类里的方法.<br />	....<br />后来多想想后,觉得出现"Target=> 0"很正常的: 毕竟现在是要初始一个子类的实例,JVM在背后要先调用父类里的构造方法,但这是为子类做前期准备的,在这个构造方法里要调用的方法也应该是子类自身的--也就是子类的print方法.<br /><br />但上面这是演义型的解释,没有官方的正式解释.为以后的正式研究做前期的感性积累.
          <br/>
          <span style="color:red;">
            <a href="http://discovery.group.javaeye.com/group/blog/206838#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>Sun, 22 Jun 2008 15:21:05 +0800</pubDate>
        <link>http://discovery.group.javaeye.com/group/blog/206838</link>
        <guid>http://discovery.group.javaeye.com/group/blog/206838</guid>
      </item>
      <item>
        <title>记录下来以备日后往深地追: 浮点型转为整型</title>
        <author>rmn190</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rmn190.javaeye.com">rmn190</a>&nbsp;
          链接：<a href="http://discovery.group.javaeye.com/group/blog/206834" style="color:red;">http://discovery.group.javaeye.com/group/blog/206834</a>&nbsp;
          发表时间: 2008年06月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          同学在学PHP时注意到一个实现细节,他也在Java里试了下,发现有些意思也发给我,我发现也挺有意思,代码如下:<br /><pre name="code" class="java">
public class Test{
	public static void main(String args){
		System.out.println((int)(0.1 * 10));	
		System.out.println((int)(0.7 * 10));	
		System.out.println((int)((0.1 + 0.7) * 10));
	}
}
</pre><br />在运行前,我也没多想,认为结果是: 1,7,8. 而运行后的结果是1,7,7.<br /><br />有些纳闷,后来试了下,<br />		System.out.println(((0.1 + 0.7) * 10));<br /><br />也就是没有转变整型,结果成了: 1,7,7.999999999.<br /><br />现在明白了,简而言之,是Java在把浮点型数转为整型时就一刀切地抹出了小数点后信息.而PHP里就给出了更符合常人处理.<br /><br />现在想问或想再往深地钻研的是计算机是怎么来表示浮点型数据的,以及怎么来处理它与整型数的转化.
          <br/>
          <span style="color:red;">
            <a href="http://discovery.group.javaeye.com/group/blog/206834#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, 22 Jun 2008 14:25:05 +0800</pubDate>
        <link>http://discovery.group.javaeye.com/group/blog/206834</link>
        <guid>http://discovery.group.javaeye.com/group/blog/206834</guid>
      </item>
      <item>
        <title>一个小菜鸟对企业应用分层的再认识(1).</title>
        <author>rmn190</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rmn190.javaeye.com">rmn190</a>&nbsp;
          链接：<a href="http://discovery.group.javaeye.com/group/blog/177574" style="color:red;">http://discovery.group.javaeye.com/group/blog/177574</a>&nbsp;
          发表时间: 2008年03月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          一个小菜鸟对企业应用分层的再认识(1).<br /><br /><br />企业级应用的分层.<br /><br />&quot;呵,这可是个大的话题!&quot;,小菜写下这篇Blog的题目时,不免有些胆怯.<br /><br />不过小菜还是觉得有理由把这些天的一些心得与认识Log下来,权成是煤炭形成中的另一块木材.<br /><br />下面先从这些天的工作内容说起.<br /><br />小菜这些天工作中是用JSON包装一些数据,并交给JSP里的JavaScript来处理.项目中原用的处理方式是这样的:Server端把JavaScript里想要的东西拼成字符串,在JSP里取出并把这个字符串赋值给HTML中的一个&lt;input&gt;标签里的value,JavaScript要用时从那个value里取出那个拼成的字符串,调用JavaScript里String类型的split方法,形成一个数组.<br /><br />于是代码中就有了下面的语句.<br /><br />&nbsp;&nbsp; &nbsp;Java端(用Spring MVC):<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;String delimiter = &quot;,.,&quot;;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;String mm = ...;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;String capitalOfChing = ...;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;String engine = ...;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;String nodeValue = mm+delimiter + capitalOfChing +delimiter+engine+delimiter+&quot;金鱼&quot;;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;return new ModelAndView(&quot;要跳转到jsp页面&quot;,&quot;model&quot;,nodeValue);<br />&nbsp;&nbsp; &nbsp;jsp:<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;input id = &quot;wunei&quot; value = &quot;${model.nodeValue}&quot; /&gt;<br />&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp;JavaScript:<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;var nodeValue = document.getElementById(&quot;wunei&quot;);<br /><br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;var valueArray = nodeValue.split(&quot;,.,&quot;);<br /><br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;想要mm时,就从valueArray里取第一个元素:<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;var mm = valueArray[0];<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;想看中国首都是什么,就取第一个元素:<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;var capitalOfChing = valueArray[1];<br /><br /><br />&nbsp;天难!这样的交换数据,还不把小菜这样的coder给累死!又没有文档可看Java端传来的第一个元素代表什么,只能从跋山涉水地到Java端去看它最原始的nodeValue是怎么生成的.好在小菜毅力深厚,Java端代码里硬是剥出了valueArray的基因信息.<br /><br />&nbsp;说了半天了还没有说到分层上呢,呵呵,有些投入了.<br /><br />在这样的工作中不免想起了前些看到一个观点:把JavaScript也单独拿出来作为企业级应用系统中的一层,用JSON来作数据交换的工具.<br /><br />呵呵,你反了你!一个小小的JavaScript还想与Hibernate这样成名已久的持久层平起平坐,分庭抗礼???<br /><br />这可得感谢Ajax的培养,那么Ajxa又是怎么帮了JavaScript一把呢?且看下回.(呵呵,这些天小菜听评书听多了.)
          <br/>
          <span style="color:red;">
            <a href="http://discovery.group.javaeye.com/group/blog/177574#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>Sat, 29 Mar 2008 12:31:08 +0800</pubDate>
        <link>http://discovery.group.javaeye.com/group/blog/177574</link>
        <guid>http://discovery.group.javaeye.com/group/blog/177574</guid>
      </item>
      <item>
        <title>Jaql: A JSON Query Language</title>
        <author>rmn190</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rmn190.javaeye.com">rmn190</a>&nbsp;
          链接：<a href="http://discovery.group.javaeye.com/group/blog/176995" style="color:red;">http://discovery.group.javaeye.com/group/blog/176995</a>&nbsp;
          发表时间: 2008年03月27日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Jaql: A JSON Query Language<br /><br /> http://www.jaql.org/release/0.1/jaql-overview.html<br /><br /> 一种JSON的查询语言,很类似于XQuery.<br /> 就像SQL之于关系型数据库,XQuery之于XML.<br /><br /> 不过由于JSON相当于XML更简洁,在这一点上很看好这个Jaql,虽然它现在只是0.1的版本,主流语言也没有支持.<br /><br /> 很看好!
          <br/>
          <span style="color:red;">
            <a href="http://discovery.group.javaeye.com/group/blog/176995#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>Thu, 27 Mar 2008 17:51:59 +0800</pubDate>
        <link>http://discovery.group.javaeye.com/group/blog/176995</link>
        <guid>http://discovery.group.javaeye.com/group/blog/176995</guid>
      </item>
      <item>
        <title>Eclispe中安装JSEclipse插件.</title>
        <author>rmn190</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rmn190.javaeye.com">rmn190</a>&nbsp;
          链接：<a href="http://discovery.group.javaeye.com/group/blog/176916" style="color:red;">http://discovery.group.javaeye.com/group/blog/176916</a>&nbsp;
          发表时间: 2008年03月27日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Eclispe中安装JSEclipse插件.<br /><br />在Eclipse里点Menu中的Help,再选Software updates,再选Find and Install...<br />进入Feature/Update对话框,对此对话框里选中&quot;Search for new features fo install&quot;一项后,点&quot;next&quot;,下一个对话框里选&quot;New Remote Site...&quot;,在弹出对话框的URL中输入&quot;http://download.macromedia.com/pub/labs/jseclipse/autoinstall/&quot;,Name栏里输入一个名字,现在我们就写&quot;JSEclispe&quot;,点OK.<br /><br />随后,Eclispe就会自动下载JSEclipse插件,下载完毕后会提醒你安装,这时选安装,再重启Eclipse就可以用这个插件了.<br />
          <br/>
          <span style="color:red;">
            <a href="http://discovery.group.javaeye.com/group/blog/176916#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, 27 Mar 2008 16:16:26 +0800</pubDate>
        <link>http://discovery.group.javaeye.com/group/blog/176916</link>
        <guid>http://discovery.group.javaeye.com/group/blog/176916</guid>
      </item>
      <item>
        <title>JSON,Ajax,Spring组合使用时的一个问题.</title>
        <author>rmn190</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rmn190.javaeye.com">rmn190</a>&nbsp;
          链接：<a href="http://discovery.group.javaeye.com/group/blog/176726" style="color:red;">http://discovery.group.javaeye.com/group/blog/176726</a>&nbsp;
          发表时间: 2008年03月27日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <br /><br />工作中用到JSON,可当它与Ajax结合使用时有一个槛过不去了.<br /><br />情况是这样的:<br /><br />在Server端用Spring MVC往ModelAndView里放进一个由JSONOjbect转来的字符串<br />&nbsp;&nbsp; &nbsp; String jsonString = JsonUtil.makeJsonStringForMenuUpdate(result, menu, task);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; model.put(&quot;jsonStringMenuUpdating&quot;, jsonString);<br /><br />&nbsp;&nbsp; &nbsp; return new ModelAndView(???????????,&quot;model&quot;,model);<br /><br />可这个返回路径不好处理了.在不用JSON时,这个路径指向一个jsp,在这个jsp里把Model里的值转为xml:<br />用如下的代码:<br />&lt;result&gt;<br />&nbsp;&nbsp; &nbsp;&lt;return_code&gt;&lt;c:out value=&quot;${model.result}&quot;/&gt;&lt;/return_code&gt;<br />&nbsp;&nbsp; &nbsp;&lt;message&gt;&lt;c:out value=&quot;${model.cMessage}&quot;/&gt;&lt;/message&gt;<br />&nbsp;&nbsp; &nbsp;&lt;nodeValue&gt;&lt;c:out value=&quot;${model.NodeValue}&quot;/&gt;&lt;/nodeValue&gt;<br />&nbsp;&nbsp; &nbsp;&lt;order&gt;&lt;c:out value=&quot;${model.order}&quot;/&gt;&lt;/order&gt;<br />&nbsp;&nbsp; &nbsp;&lt;startDate&gt;&lt;fmt:formatDate value=&quot;${model.startDate}&quot; pattern=&quot;MM/dd/yyyy HH:mm:ss&quot;/&gt;&lt;/startDate&gt;<br /><br />&nbsp;&nbsp; &nbsp;&lt;endDate&gt;&lt;fmt:formatDate value=&quot;${model.endDate}&quot; pattern=&quot;MM/dd/yyyy HH:mm:ss&quot;/&gt;&lt;/endDate&gt;<br />&nbsp;&nbsp; &nbsp;&lt;task&gt;&lt;c:out value = &quot;${model.task}&quot; /&gt;&lt;/task&gt;<br />&lt;/result&gt;<br /><br />再在jQuery里用如下的方式来处理这个xml:<br />&nbsp;&nbsp; &nbsp;type:'post',<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; datatype:'xml',<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; success:&nbsp;&nbsp;&nbsp; function(xml) {}.<br /><br />但把原来的这个xml换成JSON来实现时,从Spring那边返回的JSONString在JavaScript这边怎么接住呢?<br /><br />Google后,发现jQuery里的ajax可以支持datatype为json,但这个json格式的数据在SpringMVC那端又怎么发出来呢?<br />
          <br/>
          <span style="color:red;">
            <a href="http://discovery.group.javaeye.com/group/blog/176726#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>Thu, 27 Mar 2008 13:32:07 +0800</pubDate>
        <link>http://discovery.group.javaeye.com/group/blog/176726</link>
        <guid>http://discovery.group.javaeye.com/group/blog/176726</guid>
      </item>
      <item>
        <title>You Used JavaScript to Write WHAT?</title>
        <author>rmn190</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rmn190.javaeye.com">rmn190</a>&nbsp;
          链接：<a href="http://discovery.group.javaeye.com/group/blog/176160" style="color:red;">http://discovery.group.javaeye.com/group/blog/176160</a>&nbsp;
          发表时间: 2008年03月26日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          You Used JavaScript to Write WHAT?<br /><br />这些天由JSON引出了JavaScript的使用问题,真是边查资料边做.<br /><br />在Google的时候发现下面这篇关于什么时候选用JavaScript的分析文章,觉得很有必要log进来,以便日后查找.<br /><br />http://www.cio.com/article/175950<br />
          <br/>
          <span style="color:red;">
            <a href="http://discovery.group.javaeye.com/group/blog/176160#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, 26 Mar 2008 10:47:56 +0800</pubDate>
        <link>http://discovery.group.javaeye.com/group/blog/176160</link>
        <guid>http://discovery.group.javaeye.com/group/blog/176160</guid>
      </item>
      <item>
        <title>在使用JSON时的一点麻烦事.</title>
        <author>rmn190</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rmn190.javaeye.com">rmn190</a>&nbsp;
          链接：<a href="http://discovery.group.javaeye.com/group/blog/176142" style="color:red;">http://discovery.group.javaeye.com/group/blog/176142</a>&nbsp;
          发表时间: 2008年03月26日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          在使用JSON时的一点麻烦事.<br /><br /><br /><br />问题的是这样的,当用JSON传回数据在HTML上用时总有双(单)引号的问题,即把JSON里的数据赋给HTML里某一元素的value属性时JSON值里的双(单)引号与HTML本身的引号就混在一起了.鼓捣了半天也没搞定,真是郁闷.<br /><br />下面是一个简化的例子.<br /><br />&lt;html&gt;<br />&nbsp;&nbsp; &nbsp;&lt;script&nbsp; Language=&quot;javascript&quot;&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;//这个menuList是利用JSON从Java端传回的数据.<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;var menulist = {&quot;MenuList&quot;:<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;[{&quot;cMenuText&quot;:&quot;Valentine's Day test&quot;,&quot;cMenuTypeID&quot;:1},<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; {&quot;cMenuText&quot;:&quot;User Request&quot;,&quot;cContentTypeID&quot;:8}]<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; };<br />&nbsp;&nbsp; &nbsp;&lt;/script&gt;<br /><br />&nbsp;&nbsp; &nbsp;&lt;ul&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;script Language=&quot;javascript&quot;&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;var strCheckBox;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;for( i=0; i&lt;menulist.MenuList.length; i++ ){<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;var menuWrapper = menulist.MenuList[i];<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;document.write(&quot;&lt;li class='treeItem' id='db_cartridgeID_contentTypeID'&gt;&quot;);<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;strCheckBox =&nbsp; &quot;&lt;input type='checkbox'&nbsp; value='' &gt;&quot;;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;// ..............(1)&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;document.write(strCheckBox+&quot;&lt;/li&gt;&quot;);<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/script&gt;<br />&nbsp;&nbsp; &nbsp;&lt;/ul&gt;<br />&lt;/html&gt;<br /><br />麻烦事就是(1)处value的赋值.本来是想把menuList里的&quot;cMenuText&quot;和&quot;cMenuTypeID&quot;的值拼成一个字符串放到这里的,可拼的过程中总有引号出错的问题.<br /><br />下面是我试过的几种途径:<br />1,直接在(1)处把menulist中相应数据拼出来.<br />&nbsp;&nbsp; &nbsp;即:value = 'menuWrapper.cMenuText+menuWrapper.cMenuTypeID'<br /><br />&nbsp;&nbsp; &nbsp;这样处理后,用firebug看结果如下:<br />&nbsp;&nbsp; &nbsp;&lt;li id=&quot;db_cartridgeID_contentTypeID&quot; class=&quot;treeItem&quot;&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;input type=&quot;checkbox&quot; value=&quot;menuWrapper.cMenuText+menuWrapper.cMenuTypeID&quot;/&gt;<br />&nbsp;&nbsp; &nbsp;&lt;/li&gt;<br /><br />&nbsp;&nbsp; &nbsp;这显然不对,浏览器根本就没有解析menuWrapper.cMenuText而直接把它当字符串放在这里.<br /><br />2,在(1)处拼串时去掉单引号,即:<br />&nbsp;&nbsp; &nbsp;value = menuWrapper.cMenuText+menuWrapper.cMenuTypeID<br /><br />&nbsp;&nbsp; &nbsp;结果与上面的一样:<br />&nbsp;&nbsp; &nbsp;&lt;li id=&quot;db_cartridgeID_contentTypeID&quot; class=&quot;treeItem&quot;&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;input type=&quot;checkbox&quot; value=&quot;menuWrapper.cMenuText+menuWrapper.cMenuTypeID&quot;/&gt;<br />&nbsp;&nbsp; &nbsp;&lt;/li&gt;<br /><br />3,把(1)处的整个一句改为:<br />&nbsp;&nbsp; &nbsp;strCheckBox =&nbsp; &quot;&lt;input type='checkbox'&nbsp; value = &quot;+menuWrapper.cMenuText+menuWrapper.cMenuTypeID + &quot;/&gt;&quot;;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<br /><br />&nbsp;&nbsp; &nbsp;这样比上面的两个好些,结果如下:<br />&nbsp;&nbsp; &nbsp;&lt;li id=&quot;db_cartridgeID_contentTypeID&quot; class=&quot;treeItem&quot;&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;input type=&quot;checkbox&quot; test1=&quot;&quot; day=&quot;&quot; value=&quot;Valentine's&quot;/&gt;<br />&nbsp;&nbsp; &nbsp;&lt;/li&gt;<br /><br />&nbsp;&nbsp; &nbsp;到这里问题引出来了,也就是menuWrapper.cMenuText的值,也就是&quot;Valentine's Day test&quot;在浏览器里被拆开了,而这个拆的过程是以空格和单引号为delimitor,这样与HTML自身的单引号或空格就混了从而造成了HTML里有了test1和day这样的属性.<br /><br />.............................<br /><br />写到这里也渐渐清晰了,这个问题实际上与JSON一点关系都没有,问题的根本在于用JavaScript操作HTML时单(双)引号的问题.
          <br/>
          <span style="color:red;">
            <a href="http://discovery.group.javaeye.com/group/blog/176142#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, 26 Mar 2008 10:20:15 +0800</pubDate>
        <link>http://discovery.group.javaeye.com/group/blog/176142</link>
        <guid>http://discovery.group.javaeye.com/group/blog/176142</guid>
      </item>
      <item>
        <title>eval()方法有了点感觉</title>
        <author>rmn190</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rmn190.javaeye.com">rmn190</a>&nbsp;
          链接：<a href="http://discovery.group.javaeye.com/group/blog/176040" style="color:red;">http://discovery.group.javaeye.com/group/blog/176040</a>&nbsp;
          发表时间: 2008年03月25日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>Evaluates a string and executes it as if it was script code</p><p>&nbsp;</p><p>&quot;动态解析!&quot; </p><p>&nbsp;</p><p>找了下面两个例子，对eval()方法有了些感觉．感觉这个东东像是那种病毒，它自己可以自我复制，又像是又一套执行环境，它里面可以执行String类型的句子，<br /><br />&lt;html&gt;<br />&lt;body&gt;<br /><br />&lt;script type=&quot;text/javascript&quot;&gt;<br /><br />&nbsp;&nbsp; &nbsp;try{<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;alert(&quot;Result: &quot;+eval(prompt(&quot;Enter an expression: &quot;,&quot; &quot;)) );<br />&nbsp;&nbsp; &nbsp;}catch(exception){<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;alert(exception);<br />&nbsp;&nbsp; &nbsp;}<br /><br />&lt;/script&gt;<br /><br />&lt;/body&gt;<br />&lt;/html&gt;<br /><br />在这个网页面里实验&quot;http://www.w3schools.com/DHTML/tryit.asp?filename=trydhtml_randombanner&quot;<br />&lt;html&gt;<br />&lt;body&gt;<br /><br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;script type=&quot;text/javascript&quot;&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;image0=&quot;/banners/w3schools.gif&quot;;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;href0=&quot;/default.asp&quot;;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;alt0=&quot;W3Schools.com&quot;;<br /><br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;image1=&quot;/banners/rd_htmlref.jpg&quot;;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;href1=&quot;http://www.w3schools.com/html/html_reference.asp&quot;;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;alt1=&quot;HTML Reference&quot;;<br /><br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;image2=&quot;/banners/rd_xhtml.jpg&quot;;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;href2=&quot;http://www.w3schools.com/xhtml/default.asp&quot;;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;alt2=&quot;ASP Free&quot;;<br /><br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;len=3;<br /><br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;now=new Date();<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;now=now.getSeconds();<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;rnd=now%len;<br /><br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;image=eval(&quot;image&quot;+rnd);<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;href=eval(&quot;href&quot;+rnd);<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;alt=eval(&quot;alt&quot;+rnd);<br /><br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;document.write(&quot;I am Here:&quot; + image + &quot;&lt;hr&gt; &quot; + rnd + &quot;&lt;hr&gt; &quot; );<br /><br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;document.write(&quot;&lt;a href='&quot; + href + &quot;'&gt;&quot;);<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;document.write(&quot;&lt;img src='&quot; + image + &quot;' alt='&quot; + alt + &quot;'&gt;&lt;/a&gt;&quot;);&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/script&gt;<br /><br />&nbsp;&nbsp; &nbsp;&lt;h3&gt;Refresh this page to see the banner change&lt;/h3&gt;<br /><br />&lt;/body&gt;<br />&lt;/html&gt;<br /><br />把<br />image=eval(&quot;image&quot;+rnd);<br />href=eval(&quot;href&quot;+rnd);<br />alt=eval(&quot;alt&quot;+rnd);<br />改为:<br />image=&quot;image&quot;+rnd;<br />href=&quot;href&quot;+rnd;<br />alt=&quot;alt&quot;+rnd;<br /><br />后,出事了,</p><p>现象如下:<br />这是改后的显示:&quot;I am Here: image2&quot;,改前的显示为&quot;I am Here: /banners/w3schools.gif&quot;.<br /><br />自己拼的字符串仅仅是一个干巴巴的字符串,而用eval()后的字符串就有了指针的灵性!!!</p><p>&nbsp;</p><p>&nbsp;</p><p>现在感觉这个eval()就像Java里的源代码调用自己的.class一样,eval()自己可以自我编译.<br /><br />可这个与JSON又有什么关系呢?还是感觉不出什么必然的联系.</p>
          <br/>
          <span style="color:red;">
            <a href="http://discovery.group.javaeye.com/group/blog/176040#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, 25 Mar 2008 21:29:54 +0800</pubDate>
        <link>http://discovery.group.javaeye.com/group/blog/176040</link>
        <guid>http://discovery.group.javaeye.com/group/blog/176040</guid>
      </item>
      <item>
        <title>JavaScript里的eval()方法 与JSON的关系?</title>
        <author>rmn190</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rmn190.javaeye.com">rmn190</a>&nbsp;
          链接：<a href="http://discovery.group.javaeye.com/group/blog/176025" style="color:red;">http://discovery.group.javaeye.com/group/blog/176025</a>&nbsp;
          发表时间: 2008年03月25日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <br /><br />项目中用到JSON,以前也只是听说过,这是我第一次用,现在有一个问题,贴出来作为积累,也很是希望能有高手指点一下.<br /><br />在JSP页面中,有这样的一段javascript代码:<br /><br />&lt;script Language=&quot;javascript&quot;&gt;<br />&nbsp;&nbsp; &nbsp;var menulist = eval(&lt;c:out value='${model.menuListString}' escapeXml='false'&nbsp; /&gt;);<br />&lt;/script&gt;<br /><br />这里的eval()方法也是第一次用,Google后找到了下面的说明(网址为http://today.java.net/pub/a/today/2006/04/27/building-ajax-with-dojo-and-json.html#what-is-json):<br /><br />JSON is a Java library that helps convert Java objects into a string representation. This string, when eval()ed in JavaScript, produces an array that contains all of the information that the Java object contained. JSON's object notation grammar is suitable for encoding many nested object structures. Since this grammar is much smaller than its XML counterpart, and given the convenience of the eval() function, it is an ideal choice for fast and efficient data transport between browser and server.<br /><br />可这个eval()是具体干什么的?在下面的这个<br />&nbsp;&nbsp; &nbsp;var menulist = eval(&lt;c:out value='${model.menuListString}' escapeXml='false'&nbsp; /&gt;);<br />代码里把eval()删去后没发现什么影响.<br /><br />在http://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_eval页面中看到下面的演示代码:<br /><br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;script type=&quot;text/javascript&quot;&gt;<br /><br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;eval(&quot;x=10;y=20;document.write(x*y)&quot;);<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;document.write(&quot;&lt;br /&gt;&quot;);<br /><br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;document.write(eval(&quot;2+2&quot;));<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;document.write(&quot;&lt;br /&gt;&quot;);<br /><br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;var x=10;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;document.write(eval(x+17));<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;document.write(&quot;&lt;br /&gt;&quot;);<br /><br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;eval(&quot;alert('Hello world')&quot;);<br /><br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/script&gt;<br />可这与JSON又有什么关系呢?<br />
          <br/>
          <span style="color:red;">
            <a href="http://discovery.group.javaeye.com/group/blog/176025#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, 25 Mar 2008 20:16:15 +0800</pubDate>
        <link>http://discovery.group.javaeye.com/group/blog/176025</link>
        <guid>http://discovery.group.javaeye.com/group/blog/176025</guid>
      </item>
      <item>
        <title>用了Acegi后怎么从Login.jsp里传不过来parameter呢?</title>
        <author>rmn190</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rmn190.javaeye.com">rmn190</a>&nbsp;
          链接：<a href="http://discovery.group.javaeye.com/group/blog/175277" style="color:red;">http://discovery.group.javaeye.com/group/blog/175277</a>&nbsp;
          发表时间: 2008年03月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          作为实验,在login.jsp里加一条&lt;input type = "hidden" name = "testPara" value = "Spring"/>,想在Server端用<br />	String teamType = httpServletRequest.getParameter("testPara");<br />        System.out.println("testPara: "+teamType);<br />看看能否得到这个testPara,可Console上的显示为:testPara: null.这是怎么回事?如何改进?
          <br/>
          <span style="color:red;">
            <a href="http://discovery.group.javaeye.com/group/blog/175277#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, 24 Mar 2008 09:23:34 +0800</pubDate>
        <link>http://discovery.group.javaeye.com/group/blog/175277</link>
        <guid>http://discovery.group.javaeye.com/group/blog/175277</guid>
      </item>
      <item>
        <title>锅把断了</title>
        <author>rmn190</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rmn190.javaeye.com">rmn190</a>&nbsp;
          链接：<a href="http://discovery.group.javaeye.com/group/blog/175269" style="color:red;">http://discovery.group.javaeye.com/group/blog/175269</a>&nbsp;
          发表时间: 2008年03月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <br /><br />刚才刷锅--也是炒菜时用的那种炒瓢,锅把断了,幸好锅里凉水,要是做好饭正端着走时断了,那我可就要烫着了.<br /><br />锅把断了,自己想想也是,还是没经验,端锅时怎么就不往里捉下呢?就是因为没往里捉,时间久了那个塑料把肯定经不住自然就要断了.再说现在锅的质量也不是很好,塑料的质量先不说,单说锅把上那截金属太短了,若没有中间的金属轴做支撑,塑料的材料怎么能经得住呢?<br /><br />现在把断了,做饭时用着不方便,端时更不方便.怎么处理呢?找买锅的那个去换?自己觉得也不大可能,毕竟这个锅已用了一段时间.自己修?什么工具也没有,材料也没有怎么修?两个方案折衷一下,去找买锅的老板,让他帮着修,只要把锅把安原样&quot;粘&quot;住后,在把的下面绑两三截粗一点的铁丝作支撑,用时再注意下,应该就没问题了.<br /><br />上面说的是修补,但作为后事之师,为了以后买锅买东西的长点经验,也得把这次断把事件引用的思考总结总结.<br /><br />1,以后买东西前最好先想先买过的人问下,看他们有什么经验可取,就是教训也行的.要是不方便,上网搜一下,总能找到一些.<br />2,以买锅为例,买前想下一个锅都有哪些值得注意的地方,会不会生锈?锅把是否易断?锅把背后的支撑轴是否足够长?锅把是否容易被拷焦?当然做锅的厂家更应该想到这些了.<br /><br />现在能想到的就是这些了,贴上来,以飨食者,锅嘛是用来做饭的啦.
          <br/>
          <span style="color:red;">
            <a href="http://discovery.group.javaeye.com/group/blog/175269#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>Mon, 24 Mar 2008 08:32:49 +0800</pubDate>
        <link>http://discovery.group.javaeye.com/group/blog/175269</link>
        <guid>http://discovery.group.javaeye.com/group/blog/175269</guid>
      </item>
      <item>
        <title>用千千静听把rm转换为MP3格式</title>
        <author>rmn190</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rmn190.javaeye.com">rmn190</a>&nbsp;
          链接：<a href="http://discovery.group.javaeye.com/group/blog/175106" style="color:red;">http://discovery.group.javaeye.com/group/blog/175106</a>&nbsp;
          发表时间: 2008年03月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          用千千静听把rm转换为MP3格式<br /><br />转换时完全采用默认的设置,成功了,在MP3里也能听,可也太大了,一个rm格式的文件也就20M左右,可一转换成MP3后,一下子大到了100M,这可不行.<br /><br />这个怎么来弥补下呢?能不能牺牲下音质来把转换后的文件大小降下来?
          <br/>
          <span style="color:red;">
            <a href="http://discovery.group.javaeye.com/group/blog/175106#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>Sun, 23 Mar 2008 14:07:42 +0800</pubDate>
        <link>http://discovery.group.javaeye.com/group/blog/175106</link>
        <guid>http://discovery.group.javaeye.com/group/blog/175106</guid>
      </item>
      <item>
        <title>ldap与jndi有什么不同？</title>
        <author>rmn190</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rmn190.javaeye.com">rmn190</a>&nbsp;
          链接：<a href="http://discovery.group.javaeye.com/group/blog/175100" style="color:red;">http://discovery.group.javaeye.com/group/blog/175100</a>&nbsp;
          发表时间: 2008年03月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          ldap与jndi有什么不同？<br /><br />请问ldap与jndi有什么不同？它们都是进行目录管理的。 &nbsp;<br />&nbsp; 什么时候用ldap,&nbsp;&nbsp; 什么时候用jndi? <br /><br />&nbsp; 利用JNDI可以间接地访问ldap里的资源么?
          <br/>
          <span style="color:red;">
            <a href="http://discovery.group.javaeye.com/group/blog/175100#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>Sun, 23 Mar 2008 13:25:31 +0800</pubDate>
        <link>http://discovery.group.javaeye.com/group/blog/175100</link>
        <guid>http://discovery.group.javaeye.com/group/blog/175100</guid>
      </item>
      <item>
        <title>ldap与Acegi? ----Acegi配置文件解剖</title>
        <author>rmn190</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rmn190.javaeye.com">rmn190</a>&nbsp;
          链接：<a href="http://discovery.group.javaeye.com/group/blog/175041" style="color:red;">http://discovery.group.javaeye.com/group/blog/175041</a>&nbsp;
          发表时间: 2008年03月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          ldap与Acegi? ----Acegi配置文件解剖<br /><br />这两个之间没什么必然的联系吧?ldap不熟悉,Acegi更是不熟悉.呵呵,这两个再搅和在一起就乱了.<br /><br />ldap好像是与数据库连接相关的一个东东,那它与现在常见的数据库连接JDBC有什么区别?与JNDI呢?与这两个比又有什么优势?这个优势又怎么暗合了Acegi的需求?<br /><br />对于Acegi只知道它是与Spring协作很好的一个Security框架,先不说Security别的方面,现在只看它如何管理登录这块,登录肯定是要访问数据库,那么在Acegi的配置文件中又是怎么来体现管理这个访问数据库的呢?<br /><br />仔细研究项目中定义的applicationContext-acegi-secutiry.xml文件,这里面配置了如下的几个Bean:<br />&nbsp;1,filterChainProxy --&gt;org.acegisecurity.util.FilterChainProxy<br />&nbsp;&nbsp; &nbsp;property: filterInvocationDefinitionSource,其值有:<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;CONVERT_URL_TOLOWERCASE_BEFORE_COMPARISON<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;PATTEN_TYPE_APCHE_ANT<br /><br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;/**=httpSessionContextIntegrationFilter,&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;logoutFilter,authenicationProcessingFilter,securityContextHolderAwareRequestFilter,rememberMeProcessingFilter,anonymousProcessingFilter,exceptionTranslationFilter,filterInvocationInterceptor<br /><br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;?**<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;这么一长串是参数是干啥的,filterInvocationDefinitionSource是个什么类型?<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;看了一下它的源代码,其类型为:FilterInvocationDefinitionSource,那么这个类型怎么又会接收上面那么长的字符串?<br /><br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;再看FilterInvocationDefinitionSource的源代码,它是个接口,这下更惨了,FilterChainProxy初始化调用set时怎么又会初始化一个接口?内部匿名类?<br /><br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;先往下看.........<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;?<br />2,httpSessionContextIntegrationFilter --&gt;org.acegisecurity.context.HttpSessionContextIntegrationFilter. 这个类没有属性可配.<br />3,logoutFilter --&gt;org.acegisecurity.ui.logout.LogoutFilter <br />&nbsp;&nbsp; &nbsp;通过&lt;constuctor-arg&gt;配置了value=&quot;/index.htm&quot;.<br />&nbsp;&nbsp; &nbsp;又通过&lt;constructor-arg&gt;配置了 一个List其值为:<br />&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp;&lt;ref bean = &quot;remeberMeServices&quot;&gt;?????????????????????????????????<br />&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp;和&lt;bean class = &quot;org.acegisecurity.ui.logout.SecurityContextLogoutHandler&quot; /&gt;<br />4,authenicationProcessingFilter --&gt; org.acegisecurity.ui.webapp.AuthenticationProcessingFilter<br />&nbsp;&nbsp; &nbsp;六个property:<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;authenticationManager ref authenticationManager ??????????????????????????<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;authenticationFailureUrl value=&quot;/jsp/accessDenied.jsp&quot;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;alwaysUseDefaultTargetUrl value = &quot;true&quot;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;defaultTargetUrl value=&quot;/pages/content.html&quot;/<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;filterProcessesUrl value=&quot;/jsp/j_acegi_security_check&quot; ???????这个好像很关键的.<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;rememberMeServices&nbsp; ref=&quot;rememberMeServices&quot; ???????????????????<br />5,securityContextHolderAwareRequestFilter --&gt;　org.acegisecurity.wrapper.SecurityContextHolderAwareRequestFilter　没任何属性可配．<br /><br />6,rememberMeProcessingFilter --&gt; org.acegisecurity.ui.rememberme.RememberMeProcessingFilter<br />&nbsp;&nbsp; &nbsp;两个属性: <br />&nbsp;&nbsp; &nbsp;authenticationManager ref=&quot;authenticationManager&quot; ???????????????????<br />&nbsp;&nbsp; &nbsp;rememberMeServices ref=&quot;rememberMeServices&quot; ??????????????????<br /><br />7,anonymousProcessingFilter --&gt; org.acegisecurity.providers.anonymous.AnonymousProcessingFilter<br />&nbsp;&nbsp; &nbsp;两个属性:<br />&nbsp;&nbsp; &nbsp;key value=&quot;changeThis&quot;<br />&nbsp;&nbsp; &nbsp;userAttribute&nbsp; value=&quot;anonymousUser,ROLE_ANONYMOUS&quot;<br /><br />8,exceptionTranslationFilter --&gt; org.acegisecurity.ui.ExceptionTranslationFilter<br />&nbsp;&nbsp; &nbsp;两个属性:<br />&nbsp;&nbsp; &nbsp;&lt;property name=&quot;authenticationEntryPoint&quot;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean class=&quot;org.acegisecurity.ui.webapp.AuthenticationProcessingFilterEntryPoint&quot;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name=&quot;loginFormUrl&quot; value=&quot;/jsp/login.jsp&quot;/&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name=&quot;forceHttps&quot; value=&quot;false&quot;/&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bean&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name=&quot;accessDeniedHandler&quot;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean class=&quot;org.acegisecurity.ui.AccessDeniedHandlerImpl&quot;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name=&quot;errorPage&quot; value=&quot;/jsp/accessDenied.jsp&quot;/&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bean&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br /><br />9,filterInvocationInterceptor --&gt; org.acegisecurity.intercept.web.FilterSecurityInterceptor<br />&nbsp;&nbsp; &nbsp;三个属性:<br />&nbsp;&nbsp; &nbsp;authenticationManager ref=&quot;authenticationManager&quot; ???????????????????????<br />&nbsp;&nbsp; &nbsp;&lt;property name=&quot;accessDecisionManager&quot;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean class=&quot;org.acegisecurity.vote.AffirmativeBased&quot;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name=&quot;allowIfAllAbstainDecisions&quot; value=&quot;false&quot;/&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name=&quot;decisionVoters&quot;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;list&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean class=&quot;org.acegisecurity.vote.RoleVoter&quot;/&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean class=&quot;org.acegisecurity.vote.AuthenticatedVoter&quot;/&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/list&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bean&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name=&quot;objectDefinitionSource&quot;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PATTERN_TYPE_APACHE_ANT<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /jsp/login.jsp=ROLE_ANONYMOUS<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /jsp/**=ROLE_MPIXTOOLGROUP<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/value&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br /><br />10, rememberMeServices --&gt; org.acegisecurity.ui.rememberme.TokenBasedRememberMeServices<br />&nbsp;&nbsp; &nbsp;两个属性:<br />&nbsp;&nbsp; &nbsp;&lt;property name=&quot;userDetailsService&quot; ref=&quot;userDetailsService&quot;/&gt; ????????????<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name=&quot;key&quot; value=&quot;changeThis&quot;/&gt;<br />11, authenticationManager --&gt; org.acegisecurity.providers.ProviderManager<br />&nbsp;&nbsp; &nbsp;一个属性:<br />&nbsp;&nbsp; &nbsp;&lt;property name=&quot;providers&quot;&gt; ????????难道说这可就是登录信息的验证来源?providers嘛.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;list&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- To Disable LDAP, comment out ldapAuthProvider reference below --&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ref local=&quot;ldapAuthProvider&quot;/&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ref local=&quot;daoAuthenticationProvider&quot;/&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean class=&quot;org.acegisecurity.providers.anonymous.AnonymousAuthenticationProvider&quot;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name=&quot;key&quot; value=&quot;changeThis&quot;/&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bean&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean class=&quot;org.acegisecurity.providers.rememberme.RememberMeAuthenticationProvider&quot;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name=&quot;key&quot; value=&quot;changeThis&quot;/&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bean&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/list&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />12, daoAuthenticationProvider --&gt; org.acegisecurity.providers.dao.DaoAuthenticationProvider<br />&nbsp;&nbsp; &nbsp;一个属性:<br />&nbsp;&nbsp; &nbsp;&lt;property name=&quot;userDetailsService&quot; ref=&quot;userDetailsService&quot;/&gt;<br />13, userDetailsService --&gt; org.acegisecurity.userdetails.memory.InMemoryDaoImpl<br />&nbsp;&nbsp; &nbsp;一个属性:<br />&nbsp;&nbsp; &nbsp;&lt;property name=&quot;userMap&quot;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jklaassen=4moreyears,ROLE_ADMIN<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; test=test,ROLE_MPIXTOOLGROUP&nbsp;&nbsp; ?????????????这是静态的验证,没有去数据库里查用户和密码吗?<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; devteam=get2work,ROLE_MPIXTOOLGROUP<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jgaerlan=1234,ROLE_MPIXTOOLGROUP<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; opts=opts,ROLE_OPERATIONS<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/value&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br /><br />&nbsp;&nbsp; &nbsp;注意下面有一段配置被注释掉了: ??????????????这个是要到数据库里查找吧?<br />&nbsp;&nbsp; &nbsp;&lt;!--<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &lt;bean id=&quot;userDetailsService&quot; class=&quot;org.acegisecurity.userdetails.jdbc.JdbcDaoImpl&quot;&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;property name=&quot;dataSource&quot;&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &lt;ref bean=&quot;dataSource&quot;/&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/property&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;property name=&quot;usersByUsernameQuery&quot;&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;{call dbo.MLab_User_GetInfoByUserName(?)}&lt;/value&gt; <br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/property&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;property name=&quot;authoritiesByUsernameQuery&quot;&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;{call dbo.MLab_UserRole_GetInfoByID(?)}&lt;/value&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/property&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &lt;/bean&gt;<br />&nbsp;&nbsp; &nbsp;--&gt;<br />14, initialDirContextFactory --&gt; org.acegisecurity.ldap.DefaultInitialDirContextFactory<br />&nbsp;&nbsp; &nbsp;其配置如下:<br />&nbsp;&nbsp; &nbsp;&lt;constructor-arg value=&quot;ldap://dc03:389/OU=Employees,OU=Pleasanton,dc=kittyhawk,dc=funmail,dc=com&quot;/&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name=&quot;managerDn&quot;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;cn=mpixtool,OU=Employees,OU=Pleasanton,dc=kittyhawk,dc=funmail,dc=com&lt;/value&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name=&quot;managerPassword&quot;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;p@55w0rd&lt;/value&gt; ??????????????????这个密码并没有用到呀,而是用test的<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br /><br /><br />15, userSearch --&gt; org.acegisecurity.ldap.search.FilterBasedLdapUserSearch ?????????这个来负责登录用户的验证?<br />&nbsp;&nbsp; &nbsp;&lt;constructor-arg index=&quot;0&quot;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;&lt;/value&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/constructor-arg&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;constructor-arg index=&quot;1&quot;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;sAMAccountName={0}&lt;/value&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/constructor-arg&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;constructor-arg index=&quot;2&quot;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ref local=&quot;initialDirContextFactory&quot;/&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/constructor-arg&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name=&quot;searchSubtree&quot;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;true&lt;/value&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />16, &nbsp;&nbsp; &nbsp;ldapAuthProvider --&gt; org.acegisecurity.providers.ldap.LdapAuthenticationProvider<br />&nbsp;&nbsp; &nbsp;&lt;constructor-arg&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean class=&quot;org.acegisecurity.providers.ldap.authenticator.BindAuthenticator&quot;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;constructor-arg&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ref local=&quot;initialDirContextFactory&quot;/&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/constructor-arg&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name=&quot;userSearch&quot;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ref local=&quot;userSearch&quot;/&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bean&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/constructor-arg&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;constructor-arg&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean class=&quot;org.acegisecurity.providers.ldap.populator.DefaultLdapAuthoritiesPopulator&quot;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;constructor-arg&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ref local=&quot;initialDirContextFactory&quot;/&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/constructor-arg&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;constructor-arg&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;&lt;/value&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/constructor-arg&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name=&quot;groupRoleAttribute&quot;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;cn&lt;/value&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name=&quot;rolePrefix&quot;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;ROLE_&lt;/value&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name=&quot;convertToUpperCase&quot;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;true&lt;/value&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name=&quot;defaultRole&quot;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;IS_AUTHENTICATED_FULLY&lt;/value&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bean&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/constructor-arg&gt;<br /><br />一共配置了16个Bean,<br />&nbsp;&nbsp; &nbsp;filterChainProxy引用的Bean有:<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;--httpSessionContextIntegrationFilter,上面标号的第2个Bean.<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;--logoutFilter,上面标号的第3个Bean.<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;----这个logoutFilter引用的有:<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;------ rememberMeServices(标号为10)<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;--------这个rememberMeServices引用的有:<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;----------userDetailsService(标号为13)<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;--authenicationProcessingFilter, 上面标号的第4个Bean.<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;----这个authenicationProcessingFilter引用的有:<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;------authenticationManager(标号为11)<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;--------这个authenticationManager引用的有:<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;----------ldapAuthProvider(标号为16)<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;------------这个IdapAuthProvider引用的有:<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;--------------initialDirContextFactory(标号为14)<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;--------------userSearch(标号为15)<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;----------daoAuthenticationProvider(标号为12)<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;------------这个authenticationManager引用的有:<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;--------------userDetailsService(标号为13)<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;------ rememberMeServices(标号为10)<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;--securityContextHolderAwareRequestFilter, 上面标号的第5个Bean.<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;--rememberMeProcessingFilter,上面标号的第6个Bean.<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;----这个rememberMeProcessingFilter引用的有:<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;------authenticationManager(标号为11)<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;------ rememberMeServices(标号为10)<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;--anonymousProcessingFilter,上面标号的第7个Bean.<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;--exceptionTranslationFilter,上面标号的第8个Bean.<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;--filterInvocationInterceptor,上面标号的第9个Bean.<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;----这个filterInvocationInterceptor引用的有:<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;------authenticationManager(标号为11)<br /><br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;止此整个Bean树解析完毕,16个Bean中除了filterChainProxy自己外的15个里它引用了8个,另外的7个又都间接地引用,filterChainProxy是带头大哥无疑了!<br />
          <br/>
          <span style="color:red;">
            <a href="http://discovery.group.javaeye.com/group/blog/175041#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, 23 Mar 2008 12:19:06 +0800</pubDate>
        <link>http://discovery.group.javaeye.com/group/blog/175041</link>
        <guid>http://discovery.group.javaeye.com/group/blog/175041</guid>
      </item>
  </channel>
</rss>