﻿<?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/category/18900.html</link><description>日月累积</description><language>zh-cn</language><lastBuildDate>Fri, 02 Mar 2007 06:29:34 GMT</lastBuildDate><pubDate>Fri, 02 Mar 2007 06:29:34 GMT</pubDate><ttl>60</ttl><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>0</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>11</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>4</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>17</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>