<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>吃饱睡觉</title>
    <description>吃饭睡觉乃人生至乐</description>
    <link>http://jjz.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>丢人阿，居然在指针上犯了错误</title>
        <author>姜太公</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jjz.javaeye.com">姜太公</a>&nbsp;
          链接：<a href="http://jjz.javaeye.com/blog/212052" style="color:red;">http://jjz.javaeye.com/blog/212052</a>&nbsp;
          发表时间: 2008年07月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>虽然从未用c/c++正儿八经的写过东西，但我一直认为自己对c/c++的掌握还是很不错的，想不到还没正式使用就栽了跟头。</p>
<pre name="code" class="cpp">char *str = &quot;Hello World&quot;;
size_t len = strlen(str);
memset(str, 65 ,len);
cout &lt;&lt; str &lt;&lt; endl;</pre>
&nbsp;
<p>结果总是报段错误，我以为是memeset函数的用法不对，我用的len太大了，导致访问了不该访问的内存，就把len改成了1，想不到还是报段错误。错了几次之后，我把代码改成了这样：</p>
<pre name="code" class="cpp">char str[] = &quot;Hello World&quot;;
size_t len = strlen(str);
memset(str, 65 ,len);
cout &lt;&lt; str &lt;&lt; endl;
</pre>
<p>&nbsp;想不到竟然可以了。</p>
<p>我一直以为char *str和char str[]是一样的，会一个正常运行，一个出错呢。没办法，google了一下，发现自己果然是学艺不精，原来char *str和char str[]的编译方式是不一样的。编译器会把char *str = &quot;Hello World&quot;这种形式中的Hello world放在常量区，把地址放在str，相当于const char *str = &quot;Hello World&quot;，不能用str[3]这种方式修改。而对char str[] = &quot;Hello World&quot;，编译器看成char str[] = {'H', 'e', 'l'...'\0'}，各字符是放在栈上的，可以用str[]这样的形式修改。</p>
<p>终于弄清楚了，惭愧的很啊</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://jjz.javaeye.com/blog/212052#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/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 06 Jul 2008 15:26:33 +0800</pubDate>
        <link>http://jjz.javaeye.com/blog/212052</link>
        <guid>http://jjz.javaeye.com/blog/212052</guid>
      </item>
      <item>
        <title>628,贵州</title>
        <author>姜太公</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jjz.javaeye.com">姜太公</a>&nbsp;
          链接：<a href="http://jjz.javaeye.com/blog/210684" style="color:red;">http://jjz.javaeye.com/blog/210684</a>&nbsp;
          发表时间: 2008年07月02日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><span>话说森林即将召开由匹克公司赞助的深林运动会，森林的小动物们都怀着激动而又兴奋的心情作着ALL林运动会的准备工作。<br />
<br />
就在此时，蜘蛛博士的网站忽然传出了不和谐的声音，一桩12年前尘封已久的小白兔碎尸案浮出水面。<br />
<br />
为了维护森林中和平、宁静的气氛，狮子国王作出重要批示，一定要以维护森林的稳定为第一目标。黑猫警长临危赴命，带领手下的白猫警探进行了多方面、立体式的调查，尤其动用了传说中的鹦鹉舆论军团。最后得出结论，原来12年前被碎尸的小白兔是自杀。<br />
<br />
大森林又恢复了往日的宁静，黑猫警长和白猫警探召开了新闻发布会，发布会是在祥和的气氛中进行的，由于事前准备很充分，黑猫警长预料到了所有记者可能提出的问题，然后将答案分抄几个本本，分给参加新闻发布会的各位警探，在发布会进行的过程中，警探们对记者的提问对答如流，充分的体现了森林公共安全署人员的高水平、高素质。尤其在提问的过程中，一位警号为250的警探在回答问题前给大家敬了个军礼，让大家深受感动。<br />
<br />
就这样，一桩12年的疑案今朝终得昭雪，狮子国王给黑猫警长记予一等功。大森林也为迎接匹克公司赞助的深林运动会创造了良好的社会氛围。小动物们都称赞狮子国王的英明神武，黑猫警长的机智勇敢。正是他们，大森林又一次的回到了明媚的阳光下。<br />
</span>
</p>
          <br/>
          <span style="color:red;">
            <a href="http://jjz.javaeye.com/blog/210684#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</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/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</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 16:24:40 +0800</pubDate>
        <link>http://jjz.javaeye.com/blog/210684</link>
        <guid>http://jjz.javaeye.com/blog/210684</guid>
      </item>
      <item>
        <title>C++子类对父类方法的覆盖</title>
        <author>姜太公</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jjz.javaeye.com">姜太公</a>&nbsp;
          链接：<a href="http://jjz.javaeye.com/blog/207866" style="color:red;">http://jjz.javaeye.com/blog/207866</a>&nbsp;
          发表时间: 2008年06月25日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>昨天看《C++高级编程》，其中讲到了子类可以覆盖父类中的私有方法。当时吓了一跳，如果我用了一个第三方的库，继承了里面的某个类，自己写了个私有方法都得慎之又慎，一不小心可就覆盖了它的私有方法，谁知道会出现什么稀奇古怪的错误！</p>
<p>今天写点代码试了下，发现私有方法是virtual时才能在子类中覆盖。</p>
<pre name="code" class="cpp">#include &lt;iostream&gt;
using namespace std;

class P{
	private:
		virtual void showMeImpl();
	public:
		void showMe();
};

void P::showMeImpl(){
	cout &lt;&lt; &quot;here is the parent&quot; &lt;&lt; endl;
}

void P::showMe(){
	showMeImpl();
}

class C : public P{
	private:
		void showMeImpl();
};

void C::showMeImpl(){
	cout &lt;&lt; &quot;here is the child&quot; &lt;&lt; endl;
}
 
int main(int argc, char* argv){
	P p;
	p.showMe();
	C c;
	c.showMe();
}</pre>
<p>&nbsp;输出：here is the parent<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; here is the child<br />
如果P中的showMeImpl不用virtual修饰，输出就是期望的两次here is the parent。</p>
<p>C++确定什么时候调用哪个方法还是比较上脑筋的。加入子类C重写了父类的showMe方法。输出here is the child。</p>
<pre name="code" class="cpp">P p;
C c;
p = c;
p.showMe();   //方式1
</pre>
<p>&nbsp;不管子类和父类方法是否用virtual修饰，都会输出here is parent。</p>
<pre name="code" class="java">C c;
P&amp; p = c;
p.showMe();  //方式2
P* p2 = &amp;c;
p2-&gt;showMe(); //方式3</pre>
<p>&nbsp;这两种方式，如果父类和子类的方法用virtual修饰，会调用子类方法。如果没有用virtual修饰，会调用父类方法。</p>
<p>&nbsp;</p>
<p>解释：第二种和第三种方式，如果没有用virtual，同样直接硬编码父类showMe函数地址。用了virtual修饰后，会建立一个虚拟表，包含了指向虚方法实现的指针，调用虚方法时会进入虚拟表以找到正确的实现。所以关于子类覆盖父类私有方法的解释是：调用showMeImpl是进入虚拟表找到子类的实现，所以输出here is child。第一种情况我就不清楚了可能是引用和指针形式下，p和c在内存里就是同一个东西，使得它们的虚函数表地址一样。</p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://jjz.javaeye.com/blog/207866#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</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><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 25 Jun 2008 14:34:40 +0800</pubDate>
        <link>http://jjz.javaeye.com/blog/207866</link>
        <guid>http://jjz.javaeye.com/blog/207866</guid>
      </item>
      <item>
        <title>单源最短路径</title>
        <author>姜太公</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jjz.javaeye.com">姜太公</a>&nbsp;
          链接：<a href="http://jjz.javaeye.com/blog/201211" style="color:red;">http://jjz.javaeye.com/blog/201211</a>&nbsp;
          发表时间: 2008年06月07日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>内容：略</p>
          <br/>
          <span style="color:red;">
            <a href="http://jjz.javaeye.com/blog/201211#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/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 07 Jun 2008 20:53:22 +0800</pubDate>
        <link>http://jjz.javaeye.com/blog/201211</link>
        <guid>http://jjz.javaeye.com/blog/201211</guid>
      </item>
      <item>
        <title>最小生成树</title>
        <author>姜太公</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jjz.javaeye.com">姜太公</a>&nbsp;
          链接：<a href="http://jjz.javaeye.com/blog/201210" style="color:red;">http://jjz.javaeye.com/blog/201210</a>&nbsp;
          发表时间: 2008年06月07日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 最小生成树的两种经典算法：prim算法和kruskal算法都是基于贪心算法的。它们的基本思想都是每一步选取不会形成回路的最小权值的边，对于一个具有n个定点的连通图G，选取n+1条边后形成的树就是G的最小生成树。</p>
<p>&nbsp;&nbsp;&nbsp; &nbsp; 设A为最小生成树的一个子集，对于一条边(u,v)，如果把它加入到A后，A仍然是最小生成树的子集，就把这样的边(u,v)称为安全边。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 有一下定理：设图G=(V,E)是一个无向连通图，并且在E上定义一个具有实数值的加权函数w。设A是G的某个最小生成树的子集。设割(S,V-S)是G的任意一个不妨害A的割(A中不存在通过割的边)，且边(u,v)是通过割(S,V-S)的一条权值最小的边(轻边),则边(u,v)对集合A是安全的。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 证明略</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 推论：设G(V,E)是一个无向连通图，并且在E上定义了相应的实数加权函数w，设A是G的某一最小生成树的子集。设C=(Vc,Ec)为深林Ga=(V,A)的一个连同分支，如果边(u,v)是连接C和Ga中其他某连通分支的一条轻边，则(u,v)对集合A是安全的。</p>
<p>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  上面的一个定理和一割推论就是prim算法和kruskal算法的理论基础。</p>
<p>kruskal直接按推论得出，它把图分成多个不相交的集合(深林)，把边按权值从小到大排序。每次选取最小权值的边(u,v)，如果该边还没有加入生成树子集A中(u和v不在同一集合中)，这是一条安全边，把它加入到A中，并把u和v所在的集合合并。</p>
<p>&nbsp;</p>
<p>prim算法把顶点分成两部分A和V-A，每次从集合V-A和A的所有相连边中选择最小权值的边(u,v),u&isin;A,v&isin;V-A，由于割(A,V-A)是不妨害A的，所以边(u,v)必定是安全的。每次把v添加到A中后，松弛与v相邻的且在V-A的顶点。当把所有的顶点加入到A中后，整棵树就生成完毕了。</p>
          <br/>
          <span style="color:red;">
            <a href="http://jjz.javaeye.com/blog/201210#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/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 07 Jun 2008 20:49:41 +0800</pubDate>
        <link>http://jjz.javaeye.com/blog/201210</link>
        <guid>http://jjz.javaeye.com/blog/201210</guid>
      </item>
      <item>
        <title>ibatis缓存效果测试</title>
        <author>姜太公</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jjz.javaeye.com">姜太公</a>&nbsp;
          链接：<a href="http://jjz.javaeye.com/blog/172360" style="color:red;">http://jjz.javaeye.com/blog/172360</a>&nbsp;
          发表时间: 2008年03月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><span style="font-size: 12pt; font-family: 宋体;">条件：数据库有两张表：news和category,新闻<span>10000</span>
条数据，分类<span>7条数据</span>
，新闻类(News)里包含一个分类(Category)</span>
<span style="font-size: 12pt; font-family: 宋体;"></span>
&nbsp;<span style="font-size: 12pt; font-family: 宋体;"><span>1)<span style="font-family: 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
</span>
</span>
<span style="font-size: 12pt; font-family: 宋体;">不使用缓存，<span>n+1</span>
方式获取新闻对应的分类。读取全部<span>(10000</span>
条符合条件<span>)</span>
需<span>11.38</span>
秒左右。</span>
<span style="font-size: 12pt; font-family: 宋体;">&nbsp;</span>
</p>
<table class="MsoTableGrid" cellspacing="0" border="1" cellpadding="0" style="border-collapse: collapse; border: medium none">
<tbody>
<tr>
<td valign="top" width="130" style="padding-right: 5.4pt; padding-left: 5.4pt; padding-bottom: 0cm; width: 97.7pt; padding-top: 0cm; background-color: transparent; border: windowtext 1pt solid">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span style="font-size: 12pt; font-family: 宋体;">&nbsp;</span>
</p>
</td>
<td valign="top" width="65" style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; padding-bottom: 0cm; border-left: #ece9d8; width: 48.95pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent"><span style="font-size: 12pt; font-family: 宋体;">20</span>
</td>
<td valign="top" width="94" style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; padding-bottom: 0cm; border-left: #ece9d8; width: 70.5pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent"><span style="font-size: 12pt; font-family: 宋体;">40</span>
</td>
<td valign="top" width="94" style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; padding-bottom: 0cm; border-left: #ece9d8; width: 70.5pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent"><span style="font-size: 12pt; font-family: 宋体;">60</span>
</td>
<td valign="top" width="94" style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; padding-bottom: 0cm; border-left: #ece9d8; width: 70.5pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent"><span style="font-size: 12pt; font-family: 宋体;">80</span>
</td>
<td valign="top" width="91" style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; padding-bottom: 0cm; border-left: #ece9d8; width: 67.95pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent"><span style="font-size: 12pt; font-family: 宋体;">100</span>
</td>
</tr>
<tr>
<td valign="top" width="130" style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: #ece9d8; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 1pt solid; width: 97.7pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent"><span style="font-size: 12pt; font-family: 宋体;">ibatis</span>
<span style="font-size: 12pt; font-family: 宋体;">逻辑分页</span>
</td>
<td valign="top" width="65" style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: #ece9d8; padding-left: 5.4pt; padding-bottom: 0cm; border-left: #ece9d8; width: 48.95pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent"><span style="font-size: 12pt; font-family: 宋体;">0.45</span>
</td>
<td valign="top" width="94" style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: #ece9d8; padding-left: 5.4pt; padding-bottom: 0cm; border-left: #ece9d8; width: 70.5pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent"><span style="font-size: 12pt; font-family: 宋体;">0.47</span>
</td>
<td valign="top" width="94" style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: #ece9d8; padding-left: 5.4pt; padding-bottom: 0cm; border-left: #ece9d8; width: 70.5pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent"><span style="font-size: 12pt; font-family: 宋体;">0.52</span>
</td>
<td valign="top" width="94" style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: #ece9d8; padding-left: 5.4pt; padding-bottom: 0cm; border-left: #ece9d8; width: 70.5pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent"><span style="font-size: 12pt; font-family: 宋体;">0.55</span>
</td>
<td valign="top" width="91" style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: #ece9d8; padding-left: 5.4pt; padding-bottom: 0cm; border-left: #ece9d8; width: 67.95pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent"><span style="font-size: 12pt; font-family: 宋体;">0.57</span>
</td>
</tr>
<tr>
<td valign="top" width="130" style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: #ece9d8; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 1pt solid; width: 97.7pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent"><span style="font-size: 12pt; font-family: 宋体;">数据库物理分页</span>
</td>
<td valign="top" width="65" style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: #ece9d8; padding-left: 5.4pt; padding-bottom: 0cm; border-left: #ece9d8; width: 48.95pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent"><span style="font-size: 12pt; font-family: 宋体;">0.15</span>
</td>
<td valign="top" width="94" style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: #ece9d8; padding-left: 5.4pt; padding-bottom: 0cm; border-left: #ece9d8; width: 70.5pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent"><span style="font-size: 12pt; font-family: 宋体;">0.19</span>
</td>
<td valign="top" width="94" style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: #ece9d8; padding-left: 5.4pt; padding-bottom: 0cm; border-left: #ece9d8; width: 70.5pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent"><span style="font-size: 12pt; font-family: 宋体;">0.22</span>
</td>
<td valign="top" width="94" style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: #ece9d8; padding-left: 5.4pt; padding-bottom: 0cm; border-left: #ece9d8; width: 70.5pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent"><span style="font-size: 12pt; font-family: 宋体;">0.27</span>
</td>
<td valign="top" width="91" style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: #ece9d8; padding-left: 5.4pt; padding-bottom: 0cm; border-left: #ece9d8; width: 67.95pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent"><span style="font-size: 12pt; font-family: 宋体;">0.30</span>
</td>
</tr>
</tbody>
</table>
<p><span style="font-size: 12pt; font-family: 宋体;">&nbsp;</span>
<span style="font-size: 12pt; font-family: 宋体;"><span>2)<span style="font-family: 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
</span>
</span>
<span style="font-size: 12pt; font-family: 宋体;">对分类使用缓存，新闻不使用缓存，<span>n+1</span>
方式读取新闻对应分类。读取全部<span>(10000</span>
条符合条件<span>)</span>
需<span>0.89</span>
秒</span>
<span style="font-size: 12pt; font-family: 宋体;">&nbsp;</span>
</p>
<table class="MsoTableGrid" cellspacing="0" border="1" cellpadding="0" style="border-collapse: collapse; border: medium none">
<tbody>
<tr>
<td valign="top" width="130" style="padding-right: 5.4pt; padding-left: 5.4pt; padding-bottom: 0cm; width: 97.7pt; padding-top: 0cm; background-color: transparent; border: windowtext 1pt solid">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span style="font-size: 12pt; font-family: 宋体;">&nbsp;</span>
</p>
</td>
<td valign="top" width="65" style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; padding-bottom: 0cm; border-left: #ece9d8; width: 48.95pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent"><span style="font-size: 12pt; font-family: 宋体;">20</span>
</td>
<td valign="top" width="94" style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; padding-bottom: 0cm; border-left: #ece9d8; width: 70.5pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent"><span style="font-size: 12pt; font-family: 宋体;">40</span>
</td>
<td valign="top" width="94" style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; padding-bottom: 0cm; border-left: #ece9d8; width: 70.5pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent"><span style="font-size: 12pt; font-family: 宋体;">60</span>
</td>
<td valign="top" width="94" style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; padding-bottom: 0cm; border-left: #ece9d8; width: 70.5pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent"><span style="font-size: 12pt; font-family: 宋体;">80</span>
</td>
<td valign="top" width="91" style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: windowtext 1pt solid; padding-left: 5.4pt; padding-bottom: 0cm; border-left: #ece9d8; width: 67.95pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent"><span style="font-size: 12pt; font-family: 宋体;">100</span>
</td>
</tr>
<tr>
<td valign="top" width="130" style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: #ece9d8; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 1pt solid; width: 97.7pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent"><span style="font-size: 12pt; font-family: 宋体;">ibatis</span>
<span style="font-size: 12pt; font-family: 宋体;">逻辑分页</span>
</td>
<td valign="top" width="65" style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: #ece9d8; padding-left: 5.4pt; padding-bottom: 0cm; border-left: #ece9d8; width: 48.95pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent"><span style="font-size: 12pt; font-family: 宋体;">0.43</span>
</td>
<td valign="top" width="94" style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: #ece9d8; padding-left: 5.4pt; padding-bottom: 0cm; border-left: #ece9d8; width: 70.5pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent"><span style="font-size: 12pt; font-family: 宋体;">0.44</span>
</td>
<td valign="top" width="94" style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: #ece9d8; padding-left: 5.4pt; padding-bottom: 0cm; border-left: #ece9d8; width: 70.5pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent"><span style="font-size: 12pt; font-family: 宋体;">0.44</span>
</td>
<td valign="top" width="94" style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: #ece9d8; padding-left: 5.4pt; padding-bottom: 0cm; border-left: #ece9d8; width: 70.5pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent"><span style="font-size: 12pt; font-family: 宋体;">0.44</span>
</td>
<td valign="top" width="91" style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: #ece9d8; padding-left: 5.4pt; padding-bottom: 0cm; border-left: #ece9d8; width: 67.95pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent"><span style="font-size: 12pt; font-family: 宋体;">0.45</span>
</td>
</tr>
<tr>
<td valign="top" width="130" style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: #ece9d8; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 1pt solid; width: 97.7pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent"><span style="font-size: 12pt; font-family: 宋体;">数据库物理分页</span>
</td>
<td valign="top" width="65" style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: #ece9d8; padding-left: 5.4pt; padding-bottom: 0cm; border-left: #ece9d8; width: 48.95pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent"><span style="font-size: 12pt; font-family: 宋体;">0.11</span>
</td>
<td valign="top" width="94" style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: #ece9d8; padding-left: 5.4pt; padding-bottom: 0cm; border-left: #ece9d8; width: 70.5pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent"><span style="font-size: 12pt; font-family: 宋体;">0.11</span>
</td>
<td valign="top" width="94" style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: #ece9d8; padding-left: 5.4pt; padding-bottom: 0cm; border-left: #ece9d8; width: 70.5pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent"><span style="font-size: 12pt; font-family: 宋体;">0.12</span>
</td>
<td valign="top" width="94" style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: #ece9d8; padding-left: 5.4pt; padding-bottom: 0cm; border-left: #ece9d8; width: 70.5pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent"><span style="font-size: 12pt; font-family: 宋体;">0.12</span>
</td>
<td valign="top" width="91" style="border-right: windowtext 1pt solid; padding-right: 5.4pt; border-top: #ece9d8; padding-left: 5.4pt; padding-bottom: 0cm; border-left: #ece9d8; width: 67.95pt; padding-top: 0cm; border-bottom: windowtext 1pt solid; background-color: transparent"><span style="font-size: 12pt; font-family: 宋体;">0.13</span>
</td>
</tr>
</tbody>
</table>
<p><span style="font-size: 12pt; font-family: 宋体;">&nbsp;</span>
</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 42pt; text-indent: -21pt; tab-stops: list 42.0pt"><span style="font-size: 12pt; font-family: 宋体;"><span>3)<span style="font-family: 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
</span>
</span>
<span style="font-size: 12pt; font-family: 宋体;">新闻使用缓存<span>(size:150)</span>
，<span>n+1</span>
方式读取新闻对应分类。读取全部<span>(10000</span>
条符合条件<span>)</span>
需<span>0.0007</span>
秒，但很消耗内存。它是把所有的内容读出，作为缓存的一项，后面的查询都能从缓存命中，几乎不用时间。</span>
</p>
<p><span style="font-size: 12pt; font-family: 宋体;">&nbsp;</span>
<span style="font-size: 12pt; font-family: 宋体;">备注：</span>
<span style="font-size: 12pt; font-family: 宋体;"><span>1.<span style="font-family: 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
</span>
</span>
<span style="font-size: 12pt; font-family: 宋体;">第一次使用<span>SqlMapClient</span>
时，<span>ibatis</span>
会做一些初始化工作，所以应该取第二次后读取数据库所用的时间为测试结果</span>
</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 84pt; text-indent: -21pt; tab-stops: list 84.0pt"><span style="font-size: 12pt; font-family: 宋体;"><span>2.<span style="font-family: 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
</span>
</span>
<span style="font-size: 12pt; font-family: 宋体;">ibatis</span>
<span style="font-size: 12pt; font-family: 宋体;">的把一次查询得到的结果作为缓存的&ldquo;一项&rdquo;，缓存<span>size</span>
的单位就是这个项。一个<span>category List</span>
是一项，单个的一个<span>Category</span>
也是一项，并且它们可以同时存在的，相互间没有任何关系。从缓存中取数据的条件是：当前查询和缓存项对应的查询语句相同，并且参数也相同。</span>
</p>
<p><span style="font-size: 12pt; font-family: 宋体;"></span>
</p>
&nbsp;
<p>从这个测试可以看出，对1对1关联，如果被关联的一方数据量不大，使用缓存可以解决n+1的效率问题。当然，也可以使用联合查询，我更倾向前者，方式优雅，效率不低，而且内存消耗也比后者低。另外，ibatis的分页效果不太好，除非数据量很小，否则不要使用，才10000条数据，速度几乎比物理分页慢了3倍。数据量增大，会慢的更厉害。慎用列表的缓存，尤其是多条件查询生成的列表。如果各种条件组合有n中情况，如果这个n小于size，ibatis几乎会缓存整个数据库。</p>
          <br/>
          <span style="color:red;">
            <a href="http://jjz.javaeye.com/blog/172360#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><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, 16 Mar 2008 16:25:00 +0800</pubDate>
        <link>http://jjz.javaeye.com/blog/172360</link>
        <guid>http://jjz.javaeye.com/blog/172360</guid>
      </item>
      <item>
        <title>让applet和IE共享session</title>
        <author>姜太公</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jjz.javaeye.com">姜太公</a>&nbsp;
          链接：<a href="http://jjz.javaeye.com/blog/164875" style="color:red;">http://jjz.javaeye.com/blog/164875</a>&nbsp;
          发表时间: 2008年02月25日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>上个项目中做了一个客户端，直接通过http向服务器发送数据，让服务器添加到数据库。在服务器上，执行这个操作要求客户已经是验证的。但在applet里用java.net包里类链接服务器后，服务器会给applet分配一个新的session（也可能不分配）而不是浏览器的session。仔细想了想服务器跟踪客户的方法，有一下几种：</p>
<p><br />
1.完全采用客户端cookie，所有的信息保存在客户端cookie上。浏览器提交请求时，会附带提交cookie。</p>
<p>2.信息保存在服务器上，在客户端cookie存放一个id，也就是sessionid，浏览器提交请求是，附带提交cookie，服务器通过这个id查找到相应的session</p>
<p>3.如果客户端禁用了cookie，可以通过url提交这个sessionid。一般java web应用中，是在url里加上;jsessionid=XXXXXXXXXXXXXXXXXXX。这里我用的就是这个方法。</p>
<p>&nbsp;</p>
<p>用户请求包含applet的jsp页面时，在把用户的session id输出为applet的一个参数。applet提交请求时，比如请求add_data.do，变成add_data.do;jsessionid=sessionId。</p>
<p>&nbsp;</p>
<p>注意：测试中我发现(tomcat6)，;jsessionid必需放在参数的前面。比如add_data.do;jsessionid=xxxxxxx?x=aa，如果写成add_data.do?x=aa;jsessionid=xxxxxx则无效，可能是服务器解析url出了点错误。</p>
<p>&nbsp;</p>
<p>另外方法时，写个session监听器，把所有新建的session保存在一个hash表里，用户提交jsessionid参数，根据这个参数，自己查找而不是依赖服务器查找相应的session。</p>
<pre name="code" class="java">package com.rc.web.listener;

import javax.servlet.http.*;
import javax.servlet.ServletContext;
import java.util.HashMap;

/**
 * Web application lifecycle listener.
 * @author jiangjizhong
 */
public class SessionListener implements HttpSessionListener {

    public void sessionCreated(HttpSessionEvent e) {
        HttpSession session = e.getSession();
        Hash&lt;String, HttpSession&gt; sessions =(HashMap&lt;String, HttpSession&gt;)
                session.getServletContext().getAttribute(&quot;sessions&quot;);
        if (sessions == null) {
            sessions = new HashMap&lt;String, HttpSession&gt;();
        }
        sessions.put(session.getId(), session);
        session.getServletContext().setAttribute(&quot;sessions&quot;, sessions);
    }

    public void sessionDestroyed(HttpSessionEvent e) {
        HttpSession session = e.getSession();
      
                session.getServletContext().getAttribute(&quot;sessions&quot;);
        if (sessions != null) {
            sessions.remove(session.getId());
        }
    }
}
</pre>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://jjz.javaeye.com/blog/164875#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</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><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 25 Feb 2008 19:20:09 +0800</pubDate>
        <link>http://jjz.javaeye.com/blog/164875</link>
        <guid>http://jjz.javaeye.com/blog/164875</guid>
      </item>
      <item>
        <title>网站多用户权限管理的一个解决方案</title>
        <author>姜太公</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jjz.javaeye.com">姜太公</a>&nbsp;
          链接：<a href="http://jjz.javaeye.com/blog/105075" style="color:red;">http://jjz.javaeye.com/blog/105075</a>&nbsp;
          发表时间: 2007年07月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          看了discuz后台的用户权限设定，很详细，觉得很不错，就想自己要是能做出来就好了。<br />绞尽脑汁想出来一点，拿出来给高手看看，抛砖引玉，希望高手们能提出更好的方案，让大家以后权限管理的时候更轻松些。思考过程就不说了，没什么理论性的东西，无非是想想平时接触的操作系统，软家等的权限管理方式，再“灵光一闪”就得到了结果。<br />	通过URL匹配控制访问权限，也就是在用户请求某个URL的时候，查看该用户是否有这个权限。这个“查看”是在一个Filter中进行的。判断用户是否有权限的标准是在一个xml文件中配置的。Dtd文档如下<br /><pre name="code" class="java">&lt;?xml version="1.0" encoding="UTF-8"?>


&lt;!ELEMENT privilege (globe-error?,allmapping,user-name,mapping*)>
&lt;!ELEMENT globe-error (#PCDATA)>
&lt;!ELEMENT allmapping (#PCDATA)>
&lt;!ELEMENT user-name (#PCDATA)>
&lt;!ELEMENT mapping (error?, message)>
&lt;!ELEMENT error (#PCDATA)>
&lt;!ELEMENT message (#PCDATA)>

&lt;!ATTLIST globe-error redirect (false|true) "false">
&lt;!ATTLIST error redirect (false|true) "false">
&lt;!ATTLIST mapping 
	name CDATA #REQUIRED
    url CDATA #REQUIRED 
    code CDATA #REQUIRED>
&lt;!ATTLIST message key CDATA #IMPLIED ></pre><br />Xml文档的核心是mapping元素，有url，code属性(必选)和error，message子元素。url表示匹配的URL，code是权限码，当用户的权限码符合这里的配置的权限码时，就认为用户用权限访问该URL，name属性唯一表示一个mapping。allmapping元素是的内容所有mapping元素name的集合，每个name之间用一个符号隔开，比如’|’或’,’都可以，用来帮助自动生成权限码，后面详细说明。Error(可选，如果没有则使用globe-error)是用户无权限时显示的错误页面，redirect属性(可选)制定forward到错误页面还是redirect到forward页面。message指定返回的错误信息(支持国际化)。<br /><br />用户的权限码存放在用户的session中，由于我习惯上把用户信息放在一个User对象中，再保存到session中，所以这里我的想法是User对象中有个属性表示用户权限码，比如可以这样获取：<br />	<pre name="code" class="java">pcode=(User)session.getAttribute("user").getCode();//pcode就是用户权限码</pre><br />下面就开始说权限是如何设定的了。<br />	先说说linux的文件权限设定，比如设定一个文件的权限111010010(所有者读写执行，同组读，其他人读)，用了三组三位的二进制数，第一组是文件所有者，第二组是和所有者在同一组的用户，第三组是和所有者没有任何关系的其他人。每一组中，第一位表示“读”的权限，第二位表示“写”的权限，第三位表示“执行”的权限。好，我们的权限表示方法也出现了，allmapping元素的作用也显示出来了。allmapping中有n的mapping设定，mapping中name出现的顺序是有意义的，不过开发者不用关心它的顺序，让大家注意顺序是为了下面说明的更方便点。例如：<br /><pre name="code" class="java">&lt;allmapping>read|add|delete&lt;allmapping>
&lt;mapping name=”read” url=”/read.do”>
	&lt;error>/errorpage.jsp&lt;/error>
	&lt;message key=”error.read”>没有权限读取的信息&lt;/message>
&lt;/mapping>
&lt;mapping name=”add” url=”/add.do”>
	&lt;error>/errorpage.jsp&lt;/error>
	&lt;message key=”error.add”>没有权限添加的信息&lt;/message>
&lt;/mapping>
&lt;mapping name=”delete” url=”/delete.do”>
	&lt;error>/errorpage.jsp&lt;/error>
	&lt;message key=”error.delete”>没有权限删除的信息&lt;/message>
&lt;/mapping></pre><br /><br />用户的权限最终表示成一个二进制数，当用户访问一个URL是，如果第i个mapping匹配了这个URL，就检查用户权限二进制数的第i位，如果该位为1说明用户有此权限，为0则说明用户无此权限。<br /><br />OK，那么怎么设定用户权限呢？总不能随便给一串二进制数吧！当然不能。下面是两个设定用户权限的方法：<br />	一：用户权限用二进制数表示，在负责权限管理的类中(所有的一切和validation一样，应该是有一个类库的)有getCode(mapping-name)方法，getCode返回一个n位二进制串，如果名字为mapping-name的mapping在第i位，则此二进制数的第i位为1，其他位为0。如果用户设定的权限有read和add，使用getCode(“read”)和getCode(“add”)获得两串权限码，再进行按位或运算就得到用户的最终权限码，用上面的设置，getCode(“read”)返回”100”,getCode(“add”)返回”010”，用户的权限码就是100|010=110，也就是读和添加权限。<br />	二：用户权限用十进制数表示，经常用linux的朋友可能更喜欢这种方式，因为大家都喜欢用”chmod 744 文件名”的方式设定文件权限。这种方式中，负责权限管理的类返回的是一个10进制数，这个十进数的值和上面说的二进制数的值是相等的，比如二进制返回100，十进制就是4(二进制转十进制嘛！)。和上面相似，这次不是按位或运算，而是直接加运算。<br />还是设置读和添加权限，getCode(“read”)返回4,getCode(“add”)返回2,用户权限的表示就是2+4=6.<br /><br />上面是总体方案，在具体实现时，用一个长整型数表示权限。还设计了一个接口：<br />	<pre name="code" class="java">Privilege{
		public long getPrivilege()
}//User对象应该实现这个接口，这样在Filter中我们使用
Privilege p=(Privilege)session.getAttribute("user");
p.getPrivilege();</pre>就可以获取权限码。<br />其他细节还有url可以使用正则表达式，如果用户请求的url匹配多个配置项，那么只有用户的权限匹配所有的要求时才能算通过。这也安全性好一点。对没有配置的url，默认全部不需要任何权限，即任何人可访问。<br /><br />在前台，我们一般都不会显示不想用户看到的超链接。比如对一个只有发布新闻的用户，肯定不想他看到删除新闻的链接。我的方案是在设计一个标签&lt;privilege>有url属性，表示下面的操作要访问的url。如删除新闻：<br />	<pre name="code" class="java">&lt;privilege url="/deletenews.do">other&lt;/privilege></pre><br />标签的大致实现是：获取当前用户权限码，获取配置文件中url的权限码。如果当前用户的权限不足以访问该url，则skipbody，否则eavlbody。(个人觉得很方便，省去了一堆if)。<br /><br />整体的思路就是这样，我写了一个实现，已经证明可行，自认为自己的OOD太差，代码写的也不精致。不敢再拿出来献丑，而且仅就实现这个方法来说，还是很容易的。<br />恳请各位提出不足或更好的方案，或为此方案写出漂亮的代码。
          <br/>
          <span style="color:red;">
            <a href="http://jjz.javaeye.com/blog/105075#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><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>Tue, 24 Jul 2007 22:56:04 +0800</pubDate>
        <link>http://jjz.javaeye.com/blog/105075</link>
        <guid>http://jjz.javaeye.com/blog/105075</guid>
      </item>
  </channel>
</rss>