﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-1+1=2,0+0=0</title><link>http://www.blogjava.net/tsylo/</link><description>日月累积</description><language>zh-cn</language><lastBuildDate>Sun, 03 May 2026 10:13:43 GMT</lastBuildDate><pubDate>Sun, 03 May 2026 10:13:43 GMT</pubDate><ttl>60</ttl><item><title>扩展OSWorkflow(一、引子，从WPS到EOS到中国企业工作流)</title><link>http://www.blogjava.net/tsylo/archive/2008/08/30/225733.html</link><dc:creator>江上一叶舟</dc:creator><author>江上一叶舟</author><pubDate>Sat, 30 Aug 2008 05:48:00 GMT</pubDate><guid>http://www.blogjava.net/tsylo/archive/2008/08/30/225733.html</guid><wfw:comment>http://www.blogjava.net/tsylo/comments/225733.html</wfw:comment><comments>http://www.blogjava.net/tsylo/archive/2008/08/30/225733.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/tsylo/comments/commentRss/225733.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tsylo/services/trackbacks/225733.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 几个月前公司有个项目，项目建设内容较为简单，使用Websphere process server(以下简称WPS)建设几条流程。<br />
&nbsp;&nbsp;&nbsp; 在该项目前期，我曾经带领一个团队使用wps做了一个项目，这个项目中有八九条流程，在使用wps的过程当中，我发现wps根本不适合做一些复杂的人工审批工作流，ibm软件日趋全球化，但却忽略了很多本土化的东西，譬如说wps，作为金融行业融合企业内部服务的soa总线级产品，其内嵌的ESB根本达不到应有的性能(每笔交易时间)，而作为电信行业流程引擎，却忽略了最重要的中国国情--人工审批。在前几天上海分公司信息化部召开的技术讨论会议中，我就目前公司内部系统中几个技术难点发出提问，ibm的工程师与老板都不知所云。<br />
&nbsp;&nbsp;&nbsp; 中外文化差异很大，国外的工作流希望自动化环节更多一些，减少人工参与，降低上行下达过程中人为的，可能造成误差，而中国则不然，中国要求自动化环节少一些，决策都由人来审批，从处长到经理，从经理到分管领导，审批通过还不能作数，要签字盖章，留作日后证据。为什么会有这样的差异，这个问题暂且交给余秋雨之流去论述，我们只讲技术，既然中国企业工作流中讲究的是审批，那问题就来了，人工审批工作流复杂无比，譬如说会签、联签、发散、汇聚、选择下一节点、选择下一节点处理人等等，这都不是一个符合wfmc或bpel标准的工作流就能做出来的，包括最初的普元，几年前来我们公司做技术交流和产品介绍的时候，我们就这些技术难点提出疑问，EOS完全无法满足电信行业需求，于是其回去闭门苦练，一年后再来介绍时，工作流已经基本上能满足99%的审批要求，而WPS刚刚进入中国市场在中国做审批工作流连一个像样的大型成功案例都没有，就更无法满足需求了。<br />
&nbsp;&nbsp;&nbsp; 但介于公司内部系统的现状，使用WPS还是有一些benefit的,公司建设内部管理系统使用了Websphere portal，Domino，Tivoli，MQ，MB等软件，在集成展现上使用portal，内部oa使用lotus，统一认证，统一用户管理使用了TAM，TIM，EAI使用了MB，这样如果工作流使用wps的话，至少做一些展现、SSO、UM等都不存在问题，再加上IBM几个销售卖力的忽悠，领导被骗进，公司吃药，使用了wps，秉承技术人员认证负责的态度，用就用了，把它用到最好，是我的责任，于是我进行了一系列的探索，前期使用wps建设时候，由于其无法满足&#8220;选择下一节点处理人&#8221;的需求，我自己封装了一大堆的代码，补充wps的流程预知功能，等项目结束后，我惊讶的发现，我自己写的那部分代码，居然已经构成了一个小型工作流引擎，汗颜的同时，我也在思考，既然这样，我不然干脆就做一个轻量级的工作流引擎来取代wps的HumanTask组件进行人工审批，让wps发挥其ESB的功能，当系统之间窜接的过程中遇到个别简单的审批，则采用wps本身的人工任务，但如若需要进行复杂的人工审批流程，则进入我自己的轻量级工作流引擎进行审批，我为自己的这个想法感到兴奋、跃跃欲试，接下来的工作就是选型了，目前市面上的工作流引擎很多，普元的，西安协同的，这些都需要购买license，不考虑，开源框架里有jbpm，osworkflow,shark等，经过考虑再三，jbpm和shark过于封闭，不利于改造成适应行业需求的流程引擎，于是采用osworkflow(以下简称os)，自己在os上扩展了一层，我把它叫做ExtOSWorkflow，从取英文首字母来命名简称，变成了EOS，我狂晕，于是不偷懒，我把它叫做ExtOS，在ExtOS中，我扩展改造了很多功能，差不多改掉了除核心以外的一半的源码，完成功能其中包括：完整的待办任务列表、在办任务列表、已办任务列表、流程历史、流程会签、流程回退、流程委派、子流程、流程时限监控，流程版本控制等，其中会签与版本控制功能尚在继续开发，其余的已经实现，总结之余发表篇文章到blog、圈子、论坛，也想借机引起正在做同类产品的同行的讨论，抛砖引玉吧，关于osworkflow的封装，请听下回分解 
<img src ="http://www.blogjava.net/tsylo/aggbug/225733.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tsylo/" target="_blank">江上一叶舟</a> 2008-08-30 13:48 <a href="http://www.blogjava.net/tsylo/archive/2008/08/30/225733.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>给奎鼠也落个户口！</title><link>http://www.blogjava.net/tsylo/archive/2007/04/04/108548.html</link><dc:creator>江上一叶舟</dc:creator><author>江上一叶舟</author><pubDate>Wed, 04 Apr 2007 15:04:00 GMT</pubDate><guid>http://www.blogjava.net/tsylo/archive/2007/04/04/108548.html</guid><wfw:comment>http://www.blogjava.net/tsylo/comments/108548.html</wfw:comment><comments>http://www.blogjava.net/tsylo/archive/2007/04/04/108548.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tsylo/comments/commentRss/108548.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tsylo/services/trackbacks/108548.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;今天女友买了两只奎鼠，两个小家伙一回来就开打，从6点开干，一直到8点的时候终于双双入睡。。。。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;其实我更喜欢小狗，小狗长得可爱，水汪汪的眼睛。当你大呼：坐下，小狗似乎能听懂你的话立刻坐下，此时你的成就感不亚于完成一套系统~~。不过据说现在养狗要给狗上户口，真是奇谈，我女友都没有上海户口，买来的一条狗却轻易的得到了上海户口，不知道户籍制定者是怎么想的。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;我讨厌户籍制度，户籍制度本来就是国情所迫，而不得不出台的一个本质上是反人类反人权反文明的规定，这只是权衡之计，哪天废除，说明这个国家哪天真正强大了。但看见那么多人沉溺在这权衡之计里，我也不得不大呼："让那些制定户籍制度的人也因户籍的不便而多花些钱，抓起来判刑，就要搞臭他们，让他们不能翻身，定在耻辱柱上"。呵呵，恶毒了点。
<img src ="http://www.blogjava.net/tsylo/aggbug/108548.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tsylo/" target="_blank">江上一叶舟</a> 2007-04-04 23:04 <a href="http://www.blogjava.net/tsylo/archive/2007/04/04/108548.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>感冒了~</title><link>http://www.blogjava.net/tsylo/archive/2007/04/04/108543.html</link><dc:creator>江上一叶舟</dc:creator><author>江上一叶舟</author><pubDate>Wed, 04 Apr 2007 14:24:00 GMT</pubDate><guid>http://www.blogjava.net/tsylo/archive/2007/04/04/108543.html</guid><wfw:comment>http://www.blogjava.net/tsylo/comments/108543.html</wfw:comment><comments>http://www.blogjava.net/tsylo/archive/2007/04/04/108543.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tsylo/comments/commentRss/108543.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tsylo/services/trackbacks/108543.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 这两天温度低，天气有些阴沉，前些日子的好天气没能持续。<br><br>身上的衣服没注意及时配合气候，得瑟感冒了，今天本来想六点来钟起床写写早想写的代码，可一觉醒来已经八点了，哎<br><br>鼻涕开始肆虐，小伙，该锻炼身体了！&nbsp;&nbsp;<a href='http://www.blogjava.net/tsylo/archive/2007/04/04/108543.html'>阅读全文</a><img src ="http://www.blogjava.net/tsylo/aggbug/108543.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tsylo/" target="_blank">江上一叶舟</a> 2007-04-04 22:24 <a href="http://www.blogjava.net/tsylo/archive/2007/04/04/108543.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SOA的组件实现---EJB+Spring+Hibernate</title><link>http://www.blogjava.net/tsylo/archive/2007/01/30/96811.html</link><dc:creator>江上一叶舟</dc:creator><author>江上一叶舟</author><pubDate>Tue, 30 Jan 2007 15:29:00 GMT</pubDate><guid>http://www.blogjava.net/tsylo/archive/2007/01/30/96811.html</guid><wfw:comment>http://www.blogjava.net/tsylo/comments/96811.html</wfw:comment><comments>http://www.blogjava.net/tsylo/archive/2007/01/30/96811.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/tsylo/comments/commentRss/96811.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tsylo/services/trackbacks/96811.html</trackback:ping><description><![CDATA[
		<p>      最近项目很变态，硬是要把Domino的东西往J2EE上搬，说什么文档型数据库无法跨越系统，我觉得如果照目前电信的系统结构来说，就算把Domino上的所有东西，包括process都搬到J2EE上，也无法解决各个系统之间很好协作的问题，Portal和统一认证已经在某种程度上帮了大忙，如果实在很想各个应用系统之间进行数据交互，开发webservice接口就ok了，甚至在系统开始规划的时候就不应该出现Domino这种东西，现在想起关系型数据库的好来了，未免累死了开发人员，所以我还是秉持我自己的原则：我们无限制的追求软件程序的完美，并不是为了那帮傻逼客户，而是为了让我们之后的程序员能够以更少的精力来更轻松的拿这份工资！<br />      牢骚完毕来说说目前的J2EE做法。既然涉及到流程，那不免就那两种，WFMC和BPEL，我们选择BPEL，原因是IBM支持BPEL，不要问我两种东西那种更优秀，我会告诉你：你搞清楚了也没意义，用户只相信IBM。<br />      既然用BPEL，IBM的Websphere Process Server首当其冲，项目组买了几百万的软件和服务就开始开发了，说实话，WPS真的是一个很好的SOA解决方案，但我个人认为绝对不适合中国政府、国企的流程开发，因为他无法很好的解决人工节点的问题，哪怕是引入了human task，于是我们又自己封装了一层小的流程引擎，当然我所要说的重点不是这个，而是我们在wps中所需要的JCA方式绑定的组件的实现方式：EJB+Spring+Hibernate，做好的EJB包可以以EJB Bind的Java component形式打入wps的assembly里，在bpel process中reference进来就可以了。下面我们主要说说EJB的实现。<br />      由于wps有个特点就是在流程实例结束后删除其自带数据库中的所有实例数据，所以我们必须在流程的最后一部将数据记录在我们自己的业务库中来，我们开发的EJB就实现了这个功能。<br />首先是业务逻辑，业务逻辑分成三个包，ejb、face、pojo，其中ejb是组件的本地接口，face是组件的功能性接口，pojo是具体实现类。<br />      具体逻辑代码不贴了，贴一个我写的例子：<br />      face中的功能接口：</p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<span style="COLOR: #008080">1</span>
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #0000ff">package</span>
				<span style="COLOR: #000000"> com.ideal.core.biz.face;<br /></span>
				<span style="COLOR: #008080">2</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						<br />
				</span>
				<span style="COLOR: #008080">3</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">import</span>
				<span style="COLOR: #000000"> java.rmi.RemoteException;<br /></span>
				<span style="COLOR: #008080">4</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						<br />
				</span>
				<span style="COLOR: #008080">5</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">interface</span>
				<span style="COLOR: #000000"> SimpleService <br /></span>
				<span style="COLOR: #008080">6</span>
				<span style="COLOR: #000000">
						<img id="Codehighlighter1_100_144_Open_Image" onclick="this.style.display='none'; Codehighlighter1_100_144_Open_Text.style.display='none'; Codehighlighter1_100_144_Closed_Image.style.display='inline'; Codehighlighter1_100_144_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
						<img id="Codehighlighter1_100_144_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_100_144_Closed_Text.style.display='none'; Codehighlighter1_100_144_Open_Image.style.display='inline'; Codehighlighter1_100_144_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />
				</span>
				<span id="Codehighlighter1_100_144_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.blogjava.net/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_100_144_Open_Text">
						<span style="COLOR: #000000">{<br /></span>
						<span style="COLOR: #008080">7</span>
						<span style="COLOR: #000000">
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  </span>
						<span style="COLOR: #0000ff">public</span>
						<span style="COLOR: #000000"> String sayHello(String message)throws Exception;<br /></span>
						<span style="COLOR: #008080">8</span>
						<span style="COLOR: #000000">
								<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<span style="COLOR: #008080">9</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
		</div>
		<br />   ejb中本地接口：<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080"> 1</span><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">package</span><span style="COLOR: #000000"> com.ideal.core.biz.ejb;<br /></span><span style="COLOR: #008080"> 2</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /></span><span style="COLOR: #008080"> 3</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> javax.ejb.EJBLocalObject;<br /></span><span style="COLOR: #008080"> 4</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> com.ideal.core.biz.face.SimpleService;<br /></span><span style="COLOR: #008080"> 5</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /></span><span style="COLOR: #008080"> 6</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">interface</span><span style="COLOR: #000000"> SimpleLocal<br /></span><span style="COLOR: #008080"> 7</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">extends</span><span style="COLOR: #000000"> EJBLocalObject, SimpleService<br /></span><span style="COLOR: #008080"> 8</span><span style="COLOR: #000000"><img id="Codehighlighter1_184_230_Open_Image" onclick="this.style.display='none'; Codehighlighter1_184_230_Open_Text.style.display='none'; Codehighlighter1_184_230_Closed_Image.style.display='inline'; Codehighlighter1_184_230_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_184_230_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_184_230_Closed_Text.style.display='none'; Codehighlighter1_184_230_Open_Image.style.display='inline'; Codehighlighter1_184_230_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_184_230_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_184_230_Open_Text"><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080"> 9</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> String sayHello(String message) throws Exception;<br /></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div>  ejb的home接口不贴了，直接贴bean类，我们这里用Stateless的<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080"> 1</span><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">package</span><span style="COLOR: #000000"> com.ideal.core.biz.ejb;<br /></span><span style="COLOR: #008080"> 2</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /></span><span style="COLOR: #008080"> 3</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> javax.ejb.SessionBean;<br /></span><span style="COLOR: #008080"> 4</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> javax.ejb.SessionContext;<br /></span><span style="COLOR: #008080"> 5</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> javax.ejb.CreateException;<br /></span><span style="COLOR: #008080"> 6</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> com.ideal.core.biz.face.SimpleService;<br /></span><span style="COLOR: #008080"> 7</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> org.springframework.ejb.support.AbstractStatelessSessionBean;<br /></span><span style="COLOR: #008080"> 8</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> java.rmi.RemoteException;<br /></span><span style="COLOR: #008080"> 9</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> SimpleBean<br /></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">extends</span><span style="COLOR: #000000"> AbstractStatelessSessionBean<br /></span><span style="COLOR: #008080">12</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">implements</span><span style="COLOR: #000000"> SimpleService<br /></span><span style="COLOR: #008080">13</span><span style="COLOR: #000000"><img id="Codehighlighter1_373_713_Open_Image" onclick="this.style.display='none'; Codehighlighter1_373_713_Open_Text.style.display='none'; Codehighlighter1_373_713_Closed_Image.style.display='inline'; Codehighlighter1_373_713_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_373_713_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_373_713_Closed_Text.style.display='none'; Codehighlighter1_373_713_Open_Image.style.display='inline'; Codehighlighter1_373_713_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_373_713_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_373_713_Open_Text"><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080">14</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    SessionContext sessionContext;<br /></span><span style="COLOR: #008080">15</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> SimpleService m_simple_service;<br /></span><span style="COLOR: #008080">16</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /></span><span style="COLOR: #008080">17</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> onEjbCreate() </span><span style="COLOR: #0000ff">throws</span><span style="COLOR: #000000"> CreateException<br /></span><span style="COLOR: #008080">18</span><span style="COLOR: #000000"><img id="Codehighlighter1_512_604_Open_Image" onclick="this.style.display='none'; Codehighlighter1_512_604_Open_Text.style.display='none'; Codehighlighter1_512_604_Closed_Image.style.display='inline'; Codehighlighter1_512_604_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_512_604_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_512_604_Closed_Text.style.display='none'; Codehighlighter1_512_604_Open_Image.style.display='inline'; Codehighlighter1_512_604_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span id="Codehighlighter1_512_604_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_512_604_Open_Text"><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080">19</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        m_simple_service </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> (SimpleService) getBeanFactory().getBean(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">SimpleService</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /></span><span style="COLOR: #008080">20</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">21</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /></span><span style="COLOR: #008080">22</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> String sayHello(String message) throws Exception<br /></span><span style="COLOR: #008080">23</span><span style="COLOR: #000000"><img id="Codehighlighter1_654_711_Open_Image" onclick="this.style.display='none'; Codehighlighter1_654_711_Open_Text.style.display='none'; Codehighlighter1_654_711_Closed_Image.style.display='inline'; Codehighlighter1_654_711_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_654_711_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_654_711_Closed_Text.style.display='none'; Codehighlighter1_654_711_Open_Image.style.display='inline'; Codehighlighter1_654_711_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span id="Codehighlighter1_654_711_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_654_711_Open_Text"><span style="COLOR: #000000">{<br />                 String message = "";<br />                       try {<br />                message = m_simple_service.sayHello(message);<br /><br />        }<br />        catch (Exception ex)<br />        {<br />            this.sessionContext.setRollbackOnly();<br />            throw new EJBException();<br />        }<br /></span><span style="COLOR: #008080">24</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> message;<br /></span><span style="COLOR: #008080">25</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">26</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">27</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div>pojo：<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080"> 1</span><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">package</span><span style="COLOR: #000000"> com.ideal.core.biz.pojo;<br /></span><span style="COLOR: #008080"> 2</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /></span><span style="COLOR: #008080"> 3</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> com.ideal.core.biz.face.SimpleService;<br /></span><span style="COLOR: #008080"> 4</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /></span><span style="COLOR: #008080"> 5</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> SimpleServiceImpl </span><span style="COLOR: #0000ff">implements</span><span style="COLOR: #000000"> SimpleService<br /></span><span style="COLOR: #008080"> 6</span><span style="COLOR: #000000"><img id="Codehighlighter1_137_669_Open_Image" onclick="this.style.display='none'; Codehighlighter1_137_669_Open_Text.style.display='none'; Codehighlighter1_137_669_Closed_Image.style.display='inline'; Codehighlighter1_137_669_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_137_669_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_137_669_Closed_Text.style.display='none'; Codehighlighter1_137_669_Open_Image.style.display='inline'; Codehighlighter1_137_669_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_137_669_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_137_669_Open_Text"><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080"> 7</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    IUserInfoDAO user_dao;<br /></span><span style="COLOR: #008080"> 8</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> SimpleServiceImpl()<br /></span><span style="COLOR: #008080"> 9</span><span style="COLOR: #000000"><img id="Codehighlighter1_201_207_Open_Image" onclick="this.style.display='none'; Codehighlighter1_201_207_Open_Text.style.display='none'; Codehighlighter1_201_207_Closed_Image.style.display='inline'; Codehighlighter1_201_207_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_201_207_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_201_207_Closed_Text.style.display='none'; Codehighlighter1_201_207_Open_Image.style.display='inline'; Codehighlighter1_201_207_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span id="Codehighlighter1_201_207_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_201_207_Open_Text"><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> String sayHello(String message)  </span><span style="COLOR: #0000ff">throws</span><span style="COLOR: #000000"> Exception<br /></span><span style="COLOR: #008080">12</span><span style="COLOR: #000000"><img id="Codehighlighter1_274_667_Open_Image" onclick="this.style.display='none'; Codehighlighter1_274_667_Open_Text.style.display='none'; Codehighlighter1_274_667_Closed_Image.style.display='inline'; Codehighlighter1_274_667_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_274_667_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_274_667_Closed_Text.style.display='none'; Codehighlighter1_274_667_Open_Image.style.display='inline'; Codehighlighter1_274_667_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span id="Codehighlighter1_274_667_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_274_667_Open_Text"><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080">13</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            Userinfo user </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> Userinfo();<br /></span><span style="COLOR: #008080">14</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            user.setName(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /></span><span style="COLOR: #008080">15</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            user.setPassword(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /></span><span style="COLOR: #008080">16</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            user.setUserid(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /></span><span style="COLOR: #008080">17</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            user_dao.saveUser(user);<br /></span><span style="COLOR: #008080">18</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            user.setPassword(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">asddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /></span><span style="COLOR: #008080">19</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            user_dao.saveUser(user);<br /></span><span style="COLOR: #008080">20</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">hello,</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> message </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br /></span><span style="COLOR: #008080">21</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">22</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">23</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div>经过测试，容器事务可以正常回滚，前提是spring与hibernate的配置文件配对。<br />最终打包发布到Websphere上可以正常运行，做个web客户端简单测试一下就ok了。<br />放入wps上也运行正常。<br />最后说一句：不一定所有的国外产品都适用于我们的现状。<img src ="http://www.blogjava.net/tsylo/aggbug/96811.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tsylo/" target="_blank">江上一叶舟</a> 2007-01-30 23:29 <a href="http://www.blogjava.net/tsylo/archive/2007/01/30/96811.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>web开发中的权限设计拙见一二(3) ----资源配置与权限判断</title><link>http://www.blogjava.net/tsylo/archive/2007/01/03/91527.html</link><dc:creator>江上一叶舟</dc:creator><author>江上一叶舟</author><pubDate>Wed, 03 Jan 2007 05:56:00 GMT</pubDate><guid>http://www.blogjava.net/tsylo/archive/2007/01/03/91527.html</guid><wfw:comment>http://www.blogjava.net/tsylo/comments/91527.html</wfw:comment><comments>http://www.blogjava.net/tsylo/archive/2007/01/03/91527.html#Feedback</comments><slash:comments>15</slash:comments><wfw:commentRss>http://www.blogjava.net/tsylo/comments/commentRss/91527.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tsylo/services/trackbacks/91527.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在上文中我们提到了一个资源对应一个数据库表，在T_ResourceInfo表中我们也提到了有一个字段专门来记录表名，然后我书写一个资源配置文件，用来配置我的业务类与资源的对应关系，代码如下：1&lt;?xml version="1.0" encoding="GB2312"?&gt;2&lt;data&gt;3    &lt;mapping SysName="s"&gt;4        &lt;m...&nbsp;&nbsp;<a href='http://www.blogjava.net/tsylo/archive/2007/01/03/91527.html'>阅读全文</a><img src ="http://www.blogjava.net/tsylo/aggbug/91527.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tsylo/" target="_blank">江上一叶舟</a> 2007-01-03 13:56 <a href="http://www.blogjava.net/tsylo/archive/2007/01/03/91527.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>web开发中的权限设计拙见一二(2) ----数据库设计</title><link>http://www.blogjava.net/tsylo/archive/2007/01/02/91467.html</link><dc:creator>江上一叶舟</dc:creator><author>江上一叶舟</author><pubDate>Tue, 02 Jan 2007 15:41:00 GMT</pubDate><guid>http://www.blogjava.net/tsylo/archive/2007/01/02/91467.html</guid><wfw:comment>http://www.blogjava.net/tsylo/comments/91467.html</wfw:comment><comments>http://www.blogjava.net/tsylo/archive/2007/01/02/91467.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.blogjava.net/tsylo/comments/commentRss/91467.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tsylo/services/trackbacks/91467.html</trackback:ping><description><![CDATA[      首先上文权限设计拙见(1)中只是想记录下自己权限设计上的一点看法，以及将自己日常最常用的权限解决方案记录下来以供日后回顾，没想到有朋友关注此类的设计，那就只能先把代码拿出来献丑了，抛砖引玉，大家共同探讨学习<img height="19" src="http://www.blogjava.net/Emoticons/teeth_smile.gif" width="19" border="0" /><br />      接着上文来说，上文所讨论的权限设计是一条思路，但既然是web应用，少不了数据库的支持，本文我们来讨论一下数据库的设计。（以下想法及思路仅仅代表本人拙见）<br />      说到权限的数据库设计，必先理清权限中几种实体及其关系，此部分想必有过设计权限经验的同仁都知道怎么设计了，网上摆渡一下也是一裤衩子一裤衩子的，我们就在最平凡直观的数据库关系的基础上来建立权限。下面是我的几个表（所有的表都带有一个pk_id,作为表的自动生成的唯一主键）：<br />用户表(T_UserInfo)：<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080"> 1</span><img id="Codehighlighter1_0_65_Open_Image" onclick="this.style.display='none'; Codehighlighter1_0_65_Open_Text.style.display='none'; Codehighlighter1_0_65_Closed_Image.style.display='inline'; Codehighlighter1_0_65_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_0_65_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_0_65_Closed_Text.style.display='none'; Codehighlighter1_0_65_Open_Image.style.display='inline'; Codehighlighter1_0_65_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span id="Codehighlighter1_0_65_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span><span id="Codehighlighter1_0_65_Open_Text"><span style="COLOR: #008080">/*</span><span style="COLOR: #008080">==============================================================</span><span style="COLOR: #008080">*/</span></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 2</span><span style="COLOR: #000000"><img id="Codehighlighter1_67_132_Open_Image" onclick="this.style.display='none'; Codehighlighter1_67_132_Open_Text.style.display='none'; Codehighlighter1_67_132_Closed_Image.style.display='inline'; Codehighlighter1_67_132_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_67_132_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_67_132_Closed_Text.style.display='none'; Codehighlighter1_67_132_Open_Image.style.display='inline'; Codehighlighter1_67_132_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_67_132_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span><span id="Codehighlighter1_67_132_Open_Text"><span style="COLOR: #008080">/*</span><span style="COLOR: #008080"> Table: T_UserInfo                                            </span><span style="COLOR: #008080">*/</span></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 3</span><span style="COLOR: #000000"><img id="Codehighlighter1_134_199_Open_Image" onclick="this.style.display='none'; Codehighlighter1_134_199_Open_Text.style.display='none'; Codehighlighter1_134_199_Closed_Image.style.display='inline'; Codehighlighter1_134_199_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_134_199_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_134_199_Closed_Text.style.display='none'; Codehighlighter1_134_199_Open_Image.style.display='inline'; Codehighlighter1_134_199_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_134_199_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span><span id="Codehighlighter1_134_199_Open_Text"><span style="COLOR: #008080">/*</span><span style="COLOR: #008080">==============================================================</span><span style="COLOR: #008080">*/</span></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 4</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">create</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">table</span><span style="COLOR: #000000"> T_UserInfo <br /></span><span style="COLOR: #008080"> 5</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />(<br /></span><span style="COLOR: #008080"> 6</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    pk_id                </span><span style="FONT-WEIGHT: bold; COLOR: #000000">NUMBER</span><span style="COLOR: #000000">                         </span><span style="COLOR: #808080">not</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">,<br /></span><span style="COLOR: #008080"> 7</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    name                 </span><span style="FONT-WEIGHT: bold; COLOR: #000000">VARCHAR2</span><span style="COLOR: #000000">(</span><span style="FONT-WEIGHT: bold; COLOR: #800000">20</span><span style="COLOR: #000000">),<br /></span><span style="COLOR: #008080"> 8</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    sex                  BOOLEAN,<br /></span><span style="COLOR: #008080"> 9</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    age                  </span><span style="FONT-WEIGHT: bold; COLOR: #000000">int</span><span style="COLOR: #000000">,<br /></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    emp_num              </span><span style="FONT-WEIGHT: bold; COLOR: #000000">NUMBER</span><span style="COLOR: #000000">,<br /></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    polity               </span><span style="FONT-WEIGHT: bold; COLOR: #000000">int</span><span style="COLOR: #000000">,<br /></span><span style="COLOR: #008080">12</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    unit                 </span><span style="FONT-WEIGHT: bold; COLOR: #000000">VARCHAR2</span><span style="COLOR: #000000">(</span><span style="FONT-WEIGHT: bold; COLOR: #800000">50</span><span style="COLOR: #000000">),<br /></span><span style="COLOR: #008080">13</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    department           </span><span style="FONT-WEIGHT: bold; COLOR: #000000">VARCHAR2</span><span style="COLOR: #000000">(</span><span style="FONT-WEIGHT: bold; COLOR: #800000">20</span><span style="COLOR: #000000">),<br /></span><span style="COLOR: #008080">14</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    specialty            </span><span style="FONT-WEIGHT: bold; COLOR: #000000">int</span><span style="COLOR: #000000">,<br /></span><span style="COLOR: #008080">15</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    position             </span><span style="FONT-WEIGHT: bold; COLOR: #000000">VARCHAR2</span><span style="COLOR: #000000">(</span><span style="FONT-WEIGHT: bold; COLOR: #800000">10</span><span style="COLOR: #000000">),<br /></span><span style="COLOR: #008080">16</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    offtel               </span><span style="FONT-WEIGHT: bold; COLOR: #000000">VARCHAR2</span><span style="COLOR: #000000">(</span><span style="FONT-WEIGHT: bold; COLOR: #800000">20</span><span style="COLOR: #000000">),<br /></span><span style="COLOR: #008080">17</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    famtel               </span><span style="FONT-WEIGHT: bold; COLOR: #000000">VARCHAR2</span><span style="COLOR: #000000">(</span><span style="FONT-WEIGHT: bold; COLOR: #800000">20</span><span style="COLOR: #000000">),<br /></span><span style="COLOR: #008080">18</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    post_state           </span><span style="FONT-WEIGHT: bold; COLOR: #000000">VARCHAR2</span><span style="COLOR: #000000">(</span><span style="FONT-WEIGHT: bold; COLOR: #800000">10</span><span style="COLOR: #000000">),<br /></span><span style="COLOR: #008080">19</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    remark               </span><span style="FONT-WEIGHT: bold; COLOR: #000000">VARCHAR2</span><span style="COLOR: #000000">(</span><span style="FONT-WEIGHT: bold; COLOR: #800000">100</span><span style="COLOR: #000000">),<br /></span><span style="COLOR: #008080">20</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">constraint</span><span style="COLOR: #000000"> PK_T_USERINFO </span><span style="COLOR: #0000ff">primary</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">key</span><span style="COLOR: #000000"> (pk_id)<br /></span><span style="COLOR: #008080">21</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />);</span></div>用户表就不多说了，都是一些常用字段，年龄、电话、职位等，建议大家建立一个通用一些，字段多一些的一个用户表，便于以后扩展，以后如果有特殊需求，不用扩这个基本表，可以通过主外键关系来新建一个表，用于扩充字段<br />角色表(T_RoleInfo)：<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080"> 1</span><img id="Codehighlighter1_0_65_Open_Image" onclick="this.style.display='none'; Codehighlighter1_0_65_Open_Text.style.display='none'; Codehighlighter1_0_65_Closed_Image.style.display='inline'; Codehighlighter1_0_65_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_0_65_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_0_65_Closed_Text.style.display='none'; Codehighlighter1_0_65_Open_Image.style.display='inline'; Codehighlighter1_0_65_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span id="Codehighlighter1_0_65_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span><span id="Codehighlighter1_0_65_Open_Text"><span style="COLOR: #008080">/*</span><span style="COLOR: #008080">==============================================================</span><span style="COLOR: #008080">*/</span></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 2</span><span style="COLOR: #000000"><img id="Codehighlighter1_67_132_Open_Image" onclick="this.style.display='none'; Codehighlighter1_67_132_Open_Text.style.display='none'; Codehighlighter1_67_132_Closed_Image.style.display='inline'; Codehighlighter1_67_132_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_67_132_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_67_132_Closed_Text.style.display='none'; Codehighlighter1_67_132_Open_Image.style.display='inline'; Codehighlighter1_67_132_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_67_132_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span><span id="Codehighlighter1_67_132_Open_Text"><span style="COLOR: #008080">/*</span><span style="COLOR: #008080"> Table: T_RoleInfo                                            </span><span style="COLOR: #008080">*/</span></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 3</span><span style="COLOR: #000000"><img id="Codehighlighter1_134_199_Open_Image" onclick="this.style.display='none'; Codehighlighter1_134_199_Open_Text.style.display='none'; Codehighlighter1_134_199_Closed_Image.style.display='inline'; Codehighlighter1_134_199_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_134_199_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_134_199_Closed_Text.style.display='none'; Codehighlighter1_134_199_Open_Image.style.display='inline'; Codehighlighter1_134_199_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_134_199_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span><span id="Codehighlighter1_134_199_Open_Text"><span style="COLOR: #008080">/*</span><span style="COLOR: #008080">==============================================================</span><span style="COLOR: #008080">*/</span></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 4</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">create</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">table</span><span style="COLOR: #000000"> T_RoleInfo <br /></span><span style="COLOR: #008080"> 5</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />(<br /></span><span style="COLOR: #008080"> 6</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    pk_id                </span><span style="FONT-WEIGHT: bold; COLOR: #000000">number</span><span style="COLOR: #000000">                         </span><span style="COLOR: #808080">not</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">,<br /></span><span style="COLOR: #008080"> 7</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    role_name            </span><span style="FONT-WEIGHT: bold; COLOR: #000000">VARCHAR2</span><span style="COLOR: #000000">(</span><span style="FONT-WEIGHT: bold; COLOR: #800000">20</span><span style="COLOR: #000000">),<br /></span><span style="COLOR: #008080"> 8</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    role_desc            </span><span style="FONT-WEIGHT: bold; COLOR: #000000">VARCHAR2</span><span style="COLOR: #000000">(</span><span style="FONT-WEIGHT: bold; COLOR: #800000">100</span><span style="COLOR: #000000">),<br /></span><span style="COLOR: #008080"> 9</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    parent_role_id       </span><span style="FONT-WEIGHT: bold; COLOR: #000000">NUMBER</span><span style="COLOR: #000000">,<br /></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">constraint</span><span style="COLOR: #000000"> PK_T_ROLEINFO </span><span style="COLOR: #0000ff">primary</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">key</span><span style="COLOR: #000000"> (pk_id)<br /></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />);</span></div>角色表中需要说明的就一个parent_role_id父角色id，此字段用来扩展角色的继承关系。<br />资源表(T_ResourceInfo)：<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080"> 1</span><img id="Codehighlighter1_0_65_Open_Image" onclick="this.style.display='none'; Codehighlighter1_0_65_Open_Text.style.display='none'; Codehighlighter1_0_65_Closed_Image.style.display='inline'; Codehighlighter1_0_65_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_0_65_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_0_65_Closed_Text.style.display='none'; Codehighlighter1_0_65_Open_Image.style.display='inline'; Codehighlighter1_0_65_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span id="Codehighlighter1_0_65_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span><span id="Codehighlighter1_0_65_Open_Text"><span style="COLOR: #008080">/*</span><span style="COLOR: #008080">==============================================================</span><span style="COLOR: #008080">*/</span></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 2</span><span style="COLOR: #000000"><img id="Codehighlighter1_67_132_Open_Image" onclick="this.style.display='none'; Codehighlighter1_67_132_Open_Text.style.display='none'; Codehighlighter1_67_132_Closed_Image.style.display='inline'; Codehighlighter1_67_132_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_67_132_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_67_132_Closed_Text.style.display='none'; Codehighlighter1_67_132_Open_Image.style.display='inline'; Codehighlighter1_67_132_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_67_132_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span><span id="Codehighlighter1_67_132_Open_Text"><span style="COLOR: #008080">/*</span><span style="COLOR: #008080"> Table: T_ResourceInfo                                        </span><span style="COLOR: #008080">*/</span></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 3</span><span style="COLOR: #000000"><img id="Codehighlighter1_134_199_Open_Image" onclick="this.style.display='none'; Codehighlighter1_134_199_Open_Text.style.display='none'; Codehighlighter1_134_199_Closed_Image.style.display='inline'; Codehighlighter1_134_199_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_134_199_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_134_199_Closed_Text.style.display='none'; Codehighlighter1_134_199_Open_Image.style.display='inline'; Codehighlighter1_134_199_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_134_199_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span><span id="Codehighlighter1_134_199_Open_Text"><span style="COLOR: #008080">/*</span><span style="COLOR: #008080">==============================================================</span><span style="COLOR: #008080">*/</span></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 4</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">create</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">table</span><span style="COLOR: #000000"> T_ResourceInfo <br /></span><span style="COLOR: #008080"> 5</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />(<br /></span><span style="COLOR: #008080"> 6</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    pk_id                </span><span style="FONT-WEIGHT: bold; COLOR: #000000">NUMBER</span><span style="COLOR: #000000">                         </span><span style="COLOR: #808080">not</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">,<br /></span><span style="COLOR: #008080"> 7</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #000000">module_name          </span><span style="FONT-WEIGHT: bold; COLOR: #000000">VARCHAR2</span><span style="COLOR: #000000">(</span><span style="FONT-WEIGHT: bold; COLOR: #800000">20</span><span style="COLOR: #000000">),<br /></span><span style="COLOR: #008080"> 8</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    module_code          </span><span style="FONT-WEIGHT: bold; COLOR: #000000">VARCHAR2</span><span style="COLOR: #000000">(</span><span style="FONT-WEIGHT: bold; COLOR: #800000">10</span><span style="COLOR: #000000">),<br /></span><span style="COLOR: #008080"> 9</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    module_desc          </span><span style="FONT-WEIGHT: bold; COLOR: #000000">VARCHAR2</span><span style="COLOR: #000000">(</span><span style="FONT-WEIGHT: bold; COLOR: #800000">100</span><span style="COLOR: #000000">),<br /></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    privilege_name       </span><span style="FONT-WEIGHT: bold; COLOR: #000000">VARCHAR2</span><span style="COLOR: #000000">(</span><span style="FONT-WEIGHT: bold; COLOR: #800000">10</span><span style="COLOR: #000000">),<br /></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    privilege_code       </span><span style="FONT-WEIGHT: bold; COLOR: #000000">CHAR</span><span style="COLOR: #000000">,<br /></span><span style="COLOR: #008080">12</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    privilege_desc       </span><span style="FONT-WEIGHT: bold; COLOR: #000000">VARCHAR2</span><span style="COLOR: #000000">(</span><span style="FONT-WEIGHT: bold; COLOR: #800000">100</span><span style="COLOR: #000000">),<br /></span><span style="COLOR: #008080">13</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">constraint</span><span style="COLOR: #000000"> PK_T_RESOURCEINFO </span><span style="COLOR: #0000ff">primary</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">key</span><span style="COLOR: #000000"> (pk_id)<br /></span><span style="COLOR: #008080">14</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />);<br /></span><span style="COLOR: #008080">15</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div>这个表需要说明的就比较多了，首先该表用来记录资源与资源权限，我这边所谓的资源就是实体，就是数据库表，角色需要对应到资源，有些角色对该资源有权限，有些角色则对该资源无权限，角色可对此资源操作的权限也不同。说白了，就是不同的角色对不同的数据库表的操作权限不同。因此我们这里的资源就是数据库表。<br />module_name：资源名；module_code：资源代码（存放数据库表名）；<br />privilege_name：权限名；privilege_code：权限代码（代表权限的code,也就是我们上文所说的权值）<br />例如角色a对数据库表T_UserInfo有添加与删除的权限则该表应该按照如下配置：<br />module_name：人员信息；<br />module_code：T_UserInfo<br />privilege_name：添加与删除<br />privilege_code：6<br />这里我们假设的是2的0次方为添加权限，2的1次方为添加权限，2的2次方为删除权限，2的3次方为更新权限，则拥有添加与删除权限就应该为2的1次方+2的2次方=6，其实2的几次方代表什么含义我们可以另外开个数据库表来配置（或者xml文件）此处我们忽略这些步骤。当然如果你的权限较多，譬如你还希望a这个角色对人员信息表有上传得权限，我们可以将将上传权限定义为2的4次方，16，16的16进制数为10，记录在数据库里的形式应该为0x10如果a角色拥有添加、删除、更新、上传权限，则a的权值应该为2的1次方+2的2次方+2的3次方+2的4次方=30,用16进制来表示就应该为0x1E，记录16进制数据，你不用担心位数不够。<br />剩余的就是几张关系表了：<br />人员角色关系表(T_R_User_Role)：<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080"> 1</span><img id="Codehighlighter1_0_65_Open_Image" onclick="this.style.display='none'; Codehighlighter1_0_65_Open_Text.style.display='none'; Codehighlighter1_0_65_Closed_Image.style.display='inline'; Codehighlighter1_0_65_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_0_65_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_0_65_Closed_Text.style.display='none'; Codehighlighter1_0_65_Open_Image.style.display='inline'; Codehighlighter1_0_65_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span id="Codehighlighter1_0_65_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span><span id="Codehighlighter1_0_65_Open_Text"><span style="COLOR: #008080">/*</span><span style="COLOR: #008080">==============================================================</span><span style="COLOR: #008080">*/</span></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 2</span><span style="COLOR: #000000"><img id="Codehighlighter1_67_132_Open_Image" onclick="this.style.display='none'; Codehighlighter1_67_132_Open_Text.style.display='none'; Codehighlighter1_67_132_Closed_Image.style.display='inline'; Codehighlighter1_67_132_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_67_132_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_67_132_Closed_Text.style.display='none'; Codehighlighter1_67_132_Open_Image.style.display='inline'; Codehighlighter1_67_132_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_67_132_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span><span id="Codehighlighter1_67_132_Open_Text"><span style="COLOR: #008080">/*</span><span style="COLOR: #008080"> Table: T_R_user_role                                         </span><span style="COLOR: #008080">*/</span></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 3</span><span style="COLOR: #000000"><img id="Codehighlighter1_134_199_Open_Image" onclick="this.style.display='none'; Codehighlighter1_134_199_Open_Text.style.display='none'; Codehighlighter1_134_199_Closed_Image.style.display='inline'; Codehighlighter1_134_199_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_134_199_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_134_199_Closed_Text.style.display='none'; Codehighlighter1_134_199_Open_Image.style.display='inline'; Codehighlighter1_134_199_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_134_199_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span><span id="Codehighlighter1_134_199_Open_Text"><span style="COLOR: #008080">/*</span><span style="COLOR: #008080">==============================================================</span><span style="COLOR: #008080">*/</span></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 4</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">create</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">table</span><span style="COLOR: #000000"> T_R_user_role <br /></span><span style="COLOR: #008080"> 5</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />(<br /></span><span style="COLOR: #008080"> 6</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    pk_id                </span><span style="FONT-WEIGHT: bold; COLOR: #000000">NUMBER</span><span style="COLOR: #000000">                         </span><span style="COLOR: #808080">not</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">,<br /></span><span style="COLOR: #008080"> 7</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #ff00ff">user_id</span><span style="COLOR: #000000">              </span><span style="FONT-WEIGHT: bold; COLOR: #000000">NUMBER</span><span style="COLOR: #000000">,<br /></span><span style="COLOR: #008080"> 8</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    role_id              </span><span style="FONT-WEIGHT: bold; COLOR: #000000">NUMBER</span><span style="COLOR: #000000">,<br /></span><span style="COLOR: #008080"> 9</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">constraint</span><span style="COLOR: #000000"> PK_T_R_USER_ROLE </span><span style="COLOR: #0000ff">primary</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">key</span><span style="COLOR: #000000"> (pk_id)<br /></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />);<br /></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div>角色资源关系表(T_R_Role_Resource)<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080"> 1</span><img id="Codehighlighter1_0_65_Open_Image" onclick="this.style.display='none'; Codehighlighter1_0_65_Open_Text.style.display='none'; Codehighlighter1_0_65_Closed_Image.style.display='inline'; Codehighlighter1_0_65_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_0_65_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_0_65_Closed_Text.style.display='none'; Codehighlighter1_0_65_Open_Image.style.display='inline'; Codehighlighter1_0_65_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span id="Codehighlighter1_0_65_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span><span id="Codehighlighter1_0_65_Open_Text"><span style="COLOR: #008080">/*</span><span style="COLOR: #008080">==============================================================</span><span style="COLOR: #008080">*/</span></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 2</span><span style="COLOR: #000000"><img id="Codehighlighter1_67_132_Open_Image" onclick="this.style.display='none'; Codehighlighter1_67_132_Open_Text.style.display='none'; Codehighlighter1_67_132_Closed_Image.style.display='inline'; Codehighlighter1_67_132_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_67_132_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_67_132_Closed_Text.style.display='none'; Codehighlighter1_67_132_Open_Image.style.display='inline'; Codehighlighter1_67_132_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_67_132_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span><span id="Codehighlighter1_67_132_Open_Text"><span style="COLOR: #008080">/*</span><span style="COLOR: #008080"> Table: T_R_role_resource                                     </span><span style="COLOR: #008080">*/</span></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 3</span><span style="COLOR: #000000"><img id="Codehighlighter1_134_199_Open_Image" onclick="this.style.display='none'; Codehighlighter1_134_199_Open_Text.style.display='none'; Codehighlighter1_134_199_Closed_Image.style.display='inline'; Codehighlighter1_134_199_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_134_199_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_134_199_Closed_Text.style.display='none'; Codehighlighter1_134_199_Open_Image.style.display='inline'; Codehighlighter1_134_199_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_134_199_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span><span id="Codehighlighter1_134_199_Open_Text"><span style="COLOR: #008080">/*</span><span style="COLOR: #008080">==============================================================</span><span style="COLOR: #008080">*/</span></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 4</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">create</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">table</span><span style="COLOR: #000000"> T_R_role_resource <br /></span><span style="COLOR: #008080"> 5</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />(<br /></span><span style="COLOR: #008080"> 6</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    pk_id                </span><span style="FONT-WEIGHT: bold; COLOR: #000000">NUMBER</span><span style="COLOR: #000000">                         </span><span style="COLOR: #808080">not</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">,<br /></span><span style="COLOR: #008080"> 7</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    role_id              </span><span style="FONT-WEIGHT: bold; COLOR: #000000">NUMBER</span><span style="COLOR: #000000">,<br /></span><span style="COLOR: #008080"> 8</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    res_id               </span><span style="FONT-WEIGHT: bold; COLOR: #000000">NUMBER</span><span style="COLOR: #000000">,<br /></span><span style="COLOR: #008080"> 9</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">constraint</span><span style="COLOR: #000000"> PK_T_R_ROLE_RESOURCE </span><span style="COLOR: #0000ff">primary</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">key</span><span style="COLOR: #000000"> (pk_id)<br /></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />);<br /></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div>当然如果你不怕麻烦，可以添加进去组(group)、系统(system)、组织(organization)，建立起一套属于你自己的完整的权限解决方案，作为系统无关的模块去套用到每个你所架构的应用中去，那是一件极爽的事情。<br />连续剧开始了，暂时搁笔~~<img src ="http://www.blogjava.net/tsylo/aggbug/91467.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tsylo/" target="_blank">江上一叶舟</a> 2007-01-02 23:41 <a href="http://www.blogjava.net/tsylo/archive/2007/01/02/91467.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>web开发中的权限设计拙见一二(1)----设计思路</title><link>http://www.blogjava.net/tsylo/archive/2007/01/02/91353.html</link><dc:creator>江上一叶舟</dc:creator><author>江上一叶舟</author><pubDate>Tue, 02 Jan 2007 04:11:00 GMT</pubDate><guid>http://www.blogjava.net/tsylo/archive/2007/01/02/91353.html</guid><wfw:comment>http://www.blogjava.net/tsylo/comments/91353.html</wfw:comment><comments>http://www.blogjava.net/tsylo/archive/2007/01/02/91353.html#Feedback</comments><slash:comments>21</slash:comments><wfw:commentRss>http://www.blogjava.net/tsylo/comments/commentRss/91353.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tsylo/services/trackbacks/91353.html</trackback:ping><description><![CDATA[
		<p>最近项目的项目很奇怪，一个大项目(系统)里包含了很多小的子系统，而这些子系统中都有权限控制的部分，这件事情挺让我头痛的，记得一年前在沈阳，我曾经有一段时间也因因这个问题而疲于奔命，为什么说疲于奔命呢？由于当时项目进度不允许，导致最终系统权限模块草草了事，每个模块都是由读权限字符串来控制用户ACL，当用户无法访问时，提示权限不够。这么做对用户是很不负责任的，既然让用户看到了操作的方式和界面，为什么又告诉用户没有权限呢？我开始怀疑我们是否应该在底层就封杀用户的访问权限。 </p>
		<p>现在项目开展起来了，虽然目前我已经有了对权限控制的一套方案，并且实施成了我的可重用框架代码，虽然目前的权限也是基于众星捧月的AOP思想，但我至今对权限设计仍有两个疑惑： </p>
		<p>疑惑一：很多同行提出方案，想要在底层就截取用户权限，控制用户对方法或者类的访问。这样做的好处在于可以将系统功能与业务逻辑松散耦合，并且实现简单，结构清晰，三两个advisor、filter，或者acegi就能搞定，但在web程序中体现出了他的劣势，当我们将用户的访问拒绝在业务逻辑之外的时候，我们此时是否应该抛出异常提示用户？一旦提示用户没有相应的权限，我认为对于用户来说，这就不是一个perfect practice。由此得出，我们根本就不应该让用户做此次操作，而控制用户操作的源头就是界面，也就是说，在界面上我们就应该对用户的权限元素(如添加按钮、功能菜单等)进行控制。此时，一对矛盾出现了，要控制界面上形形色色的元素只有两种办法，一，将权限与你的界面结合起来设计，这将违背AOP的思想，也使得系统控制模块的重用性大大下降，二，我们借鉴primeton的想法，将权限控制的理念抽取出来，单独做成一套权限系统，解决你所有的需要权限控制的系统需求，这样也有令人头痛的问题，你的所有想用它来控制权限的系统，必须界面上统一风格。或许这样的方式对商业web系统是合适的，毕竟需要你大刀阔斧个性化的地方不多，但我们却很难保证在未来几年内商业web系统的风格不改变。再者，开发这么一个系统也不是一蹴而就的事，在这个问题上一直让我困惑不已。</p>
		<p>
				<br />疑惑二：大多应用的权限判定是基于权限字符串的，但存储在数据库中的权限字符串能够判定的权限并不多，在我们这次项目中，我引用了基于二进制的8421权限判定法则，我深深的感觉到权限字符串的弱势，这使我想起了中国古老一套数学理论-“盈不足术”，超递增序列的魅力在我眼前滑过， </p>
		<p>首先我来解释一下盈余不足理论：有十只盒子，第一个盒子里放一个盘子，第二个盒子里放两只，第三个盒子里放四只，第四个盒子里放八只……第九个盒子里放256只，第十个盒子放512只，即第N只箱子里放2^(N-1)只盘子，一共1023只。那么命题如下：在1023这个数字之内，任何一个数目都可以由这十只盒子里的几只组合相加而成。那么1、2、4、8、16、32、64、128、256、512这个序列为什么有这么个魔力？这个数列的特点：1、每项是后一项的二倍，2、每项都比前面所有项的和大，而且大1。这个1就是关键，就因为这个1，它才可以按1递增，拼出总和之内任意一个整数。这个序列叫做超递增序列，它是解决背包问题的基础。3、拼出总和之内任意一个整数可以由这个序列中的一些数构成，且构成方法唯一，据说是密码学中的NP定理。譬如说这个数列总合中20这个数，只能由16+4一种方法构成，由此延伸出来，如果综合中这个数据代表一个权值，我们可以解出它的所有构成参数（操作），如20这个数据，我们可以挨个和序列中每一项按位与，得出来如果不等于0，就说明他是由这个数构成的。 </p>
		<p>保存权值到int还是varchar对于我们来说是个问题，当然，保存字符串的好处是运算压力小。我们可能听过一个故事，就是把这个超递增序列延伸到第64项，就是那个术士和皇帝在国际象棋棋盘上要米粒的传说。64项的和是一个天文数字！但计算机本身就是一个只认识二进制的机器！很多程序员整天只关心架构，甚至不知道或者不关心位操作是什么玩意，当然我们有朋友担心数据库的int不够长，那么既然可以保存一个只有0、1组成的varchar字符串，为什么不能保存一个十六进制的字符串，有人规定varchar只能保存01吗？十六进制串的长度正好是二进制的四分之一。 </p>
		<p>由此我们可以无限制的扩展权值操作。 </p>
		<p>在最近的项目里，我对权限的控制分成两个部分，第一就是用户体验上，我设置了一个权限标签，从数据库中抽取权限信息，然后做到标签里，也凑或算成是界面AOP了，第二就是底层的拦截，用了Spring 的AOP，为的是防止权限冲突，双管齐下。暂时解决权限所需，另外在算法上我用了16进制的权限判别代码，虽然配置较麻烦，写完代码还要写文档说明，不过也解决了权限繁杂又多的问题，暂时就这样了，嘿嘿，以后有空再研究。 <br /></p>
<img src ="http://www.blogjava.net/tsylo/aggbug/91353.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tsylo/" target="_blank">江上一叶舟</a> 2007-01-02 12:11 <a href="http://www.blogjava.net/tsylo/archive/2007/01/02/91353.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>