版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、叭 挨 罢 盎 OA系系百统项目开发 HYPERLINK /zhouqianhua/archive/2010/10/20/.html 隘UML小结以及隘基于于领域模型的搬系统设计初步胺UML不是OO颁A/D 也不是艾方法,它仅仅是是傲一种图形表示法法碍。其目的就是让让芭人能看懂你的东东暗西。奥1。叭每一种图,都相昂当于于一种角度。挨不同的图就是从从绊不同角度来观察察阿系统。翱6。百比如交通图和行埃政区区划图,从不百同角度观察中国国案。 邦必要性是画图的坝原则则,虽然有这绊种关系,但不一一鞍定要画出来,如如搬果非要画出来,扒扒则应考虑不要影影癌响图形的美观。拜拜o。 活动图昂活动图表示的是佰一种
2、种流程。例子:顺序图跋顺序图的目的是矮为对对象分配职责靶,而不是步骤的的隘罗列。芭上图中,Act暗ionServ敖敖let是没有必必颁要画出来的,它它办是一个很稳定,伴伴也不是我们自己己袄提供的,没有必必伴要来说明它的对对颁象职责。插在这这霸里显然多余.瓣s。袄如下图这样就可挨以了了:用例和用例图俺用例的定义:文笆本形形式的情节描办述。 稗用例用于需求的啊发现现和记录,它办会影响后续的O挨挨OA/D工作 把用例不是用例图柏。用用例图不重要哎,用例描述很重重哎要。 奥用例尽量不要用笆名词词命名,尽量叭以动词开头,比比哎如:管理商品。癌用例一般是用于八功能能性的需求而奥非性能性需求。拜编写用例时,
3、在蔼基本本路径(即主盎成功路径)中,翱翱只书写主要的成成坝功事件,而可能能罢出现的其他情况况癌(如找不到用户户翱)应该写在扩展展扮点中。斑9。 白用例粒度:比如拔:是是把管理用户艾当做用例还是把把敖添加用户和删除除俺用户分别当做两两拜个用例。拌m。版确定用例的粒度八时,应应该考虑描熬述这个用例的基基跋本路径需要几个个安步骤。十步以内内胺,七八步比较合合吧适。捌l。按一个典型的用例办描述述一个典型用例图罢其中销售经理和艾收银银员之关系是扳泛化关系,即经经澳理拥有收银员所所八拥有的一切用例例傲。另外还有其独独拌有的用例。颁t。类图扮类图允许我们标耙记静静态内容及类罢之间的关系,它它靶是UML中最重
4、重颁要的图形,可以以般在任何时候尝试试啊使用类图。碍K。捌不要使用类图描案述所所有的细节,碍保持类图的简单单阿。扳UML中主要有瓣三种种类:边界类伴、控制类和实体体暗类巴边界类位于系统背与外外界的交界处白,例如窗体、报报哀表、以及表示通通半讯协议的类、直直芭接与外部设备交交俺互的类、直接与与百外部系统交互的的奥类等。通过用例例笆图可以确定需要要袄的边界类,每个个百Actor/U按按se Case颁颁对至少要一个边边八界类,但并非每每氨个Actor/扮Use Cas暗暗e对要唯一的边边拌界类。办e。跋实体类可以通过熬事件件流和交互图凹发现。通常每个个柏实体类在数据库库靶中有相应的表,耙耙实体类中
5、的属性性伴对应数据库表中中把的字段。般r。暗控制类是控制其拔他类类工作的类。疤控制类可以被多多跋个用例共用。其其拔他类并不向控制制邦类发送很多消息息半,而是由控制类类背发出很多消息。扒扒q。 坝类图中,要画出捌类之之间的关系氨UML中继承、矮实现现、依赖、关把联、聚合、组合合碍的联系与区别隘继承安 矮(也叫泛化化)傲指的是一个类(按称为为子类、子接霸口)继承另外的的扒一个类(称为父父鞍类、父接口)的的吧功能,并可以增增肮加它自己的新功功坝能的能力,继承承背是类与类或者接接凹口与接口之间最最背常见的关系;在在熬Java中此类类瓣关系通过关键字字巴extends袄袄明确标识,在设设敖计时一般没有争
6、争柏议性;斑x。实现翱指的是一个cl扒ass类类实现i百nterfac捌捌e接口(可以是是俺多个)的功能;傲实现是类与接口口敖之间最常见的关关俺系;在Java扳扳中此类关系通过过熬关键字 imp伴伴lements霸霸明确标识,在设设艾计时一般没有争争澳议性;跋3。依赖班可以简单的理解拌,就就是一个类A绊使用到了另一个个爸类B,而这种使使澳用关系是具有偶偶绊然性的、临时性性办的、非常弱的,半半但是B类的变化化疤会影响到A;比比暗如某人要过河,跋跋需要借用一条船船把,此时人与船之之啊间的关系就是依依懊赖;表现在代码码哀层面,为类B作作俺为参数被类A在在爸某个metho巴巴d方法中使用;笆w。关联傲
7、他体现的是两个拔类、或者类与接般口之间语义级别别拔的一种强依赖关关绊系,比如我和我我艾的朋友;这种关关奥系比依赖更强、搬不存在依赖关系系耙的偶然性、关系系邦也不是临时性的的伴,一般是长期性性艾的,而且双方的的胺关系一般是平等等板的、关联可以是是拜单向、双向的;绊表现在代码层面面拔,为被关联类B盎盎以类属性的形式式拔出现在关联类A邦邦中,也可能是关关斑联类A引用了一一艾个类型为被关联联埃类B的全局变量量拜;巴W。聚合岸聚合是关联关系翱的一一种特例,他搬体现的是整体与与霸部分、拥有的关关澳系,即has-皑a的关系,此时时笆整体与部分之间间暗是可分离的,他他扮们可以具有各自自奥的生命周期,部部叭分可
8、以属于多个个耙整体对象,也可可瓣以为多个整体对对拌象共享;比如计计拔算机与CPU、岸公司与员工的关关摆系等;表现在代代伴码层面,和关联联岸关系是一致的,版版只能从语义级别别懊来 区分;熬r。组合俺组合也是关联关翱系的的一种特例,肮他体现的是一种种叭contain按按s-a的关系,罢罢这种关系比聚合合唉更强,也称为强强白聚合;他同样体体巴现整体与部分间间奥的关系,但此时时佰整体与部分是不不芭可分的,整体的的瓣生命周期结束也也邦就意味着部分的的般生命周期结束;败比如你和你的大大疤脑;表现在代码码板层面,和关联关关扳系是一致的,只只邦能从语义级别来来埃区 分;斑N。总结:案继承、实现体现颁的是是类与
9、类、或坝者类与接口间的的皑纵向关系,不易易阿混淆;其他的四四败者关系则体现的的鞍是类与类、或者者矮类与接口间的引引板用、横向关系,坝坝这几种关系都是是隘语义级别的,所所瓣以从代码层面并并安不能完全区分开开扒来;案O。埃例如在关心汽车扳的领领域里,轮胎柏是一定要组合在在捌汽车类中的,因因爸为它离开了汽车车埃就没有意义了。柏柏但是在卖轮胎的的半店铺业务里,就就唉算轮胎离开了汽汽搬车,它也是有意意摆义的,这就可以以颁用聚合了。哀A。巴总的来说,后几扮种关关系所表现的哀强弱程度依次为为昂:组合聚合傲关联依赖斑Z。示例一耙关联之特殊示例叭,下下图表示一种佰树形结构类图,熬可以用如下代码半实现现颁Publ
10、ic 绊Class N蔼ode昂 摆 Public百百 佰 ID;翱 拔 Privat斑斑e Node 般 伴parent;八 芭 Privat靶靶e Set 肮 ch扒扒ildren;稗t。示例二:癌已经在关联中表哀明了了 Docu氨ment 具有有半一个User类类懊型的字段 Cr稗稗eator,故故敖不必在Docu般般ment中再写写班出Creato扒扒r了。芭v。示例三:盎由于User是办另一一个复杂的概哀念,所以要建立立癌关联,而不是把把柏User也作为为敖一个简单的属性性伴(如name那那捌样)斑E。稗不要把复杂的领艾域概概念建模为属办性。 示例四:办Student吧 与与 cla
11、s矮s 之间是双向向昂关联关系,当然然扮也可以说成是s叭叭tudent依依哀赖class,挨挨因为没有cla矮矮ss,stud胺胺ent是不能编编靶译通过的。但画画靶图并不是所有存存八在的东西都要画画阿出来,这里表示示安成关联关系更为为暗贴切些。背Q。氨另外,关联指的稗是关关心对方的结懊构,如果对象A捌捌只是用一用对象象皑B的某个方法,背背比如Colle摆摆ctions.般般sort(),癌癌 这显然是依赖赖稗而非关联。胺X。坝基于领域模型的氨系统统设计初步跋设计时重要原则矮:班 柏 低低耦合,高内肮聚.袄 败 绊 尽量降低对对班不稳定对象的依依把赖。对于非常稳稳凹定的东西,比如如扮JDK的核
12、心类类败库,尽可以随便便矮依赖它。跋1。半 挨 不不要依赖于正隘向工程和逆向工工挨程,如果你要让让啊其从图形生成代代跋码,则你不得不不绊在图形中注意各各袄种细节,那不如如捌你自己写代码。懊懊I。傲 搬 图图形是为了抽癌象出逻辑主干,巴巴方便人理解,它它蔼不能替代详细完完岸整的文字描述。胺胺M。系统的核心价值斑领域模型的价值氨不在在于它的设计阿优美(它只是一一盎些对象八败最重要的也就是是岸对象之间的关系系傲)哀坝而在于它体现了了耙系统的核心价值值俺。什么是系统的的袄核心价值呢?我我办想我们的图书馆馆挨系统和华尔街的的百一个商业系统本本按质的区别不在于于败系统用了什么语语埃言、用了什么数数吧据库、
13、用的是O懊懊O还是过程,而而翱在于系统能为使使氨用者提供什么服服熬务,以及提供的的疤质量。这些通过过吧系统的运行方式式鞍鞍系统的运行过程程吧拌系统的业务逻辑辑吧来体现。唉5。用例的价值安系统分析员在接奥手一一个系统后版胺首先要做到的事事按情就是得出系统统扮的服务和服务场场般景。也就是我们们捌经常所讲的用例例佰(use ca安安se)八6。皑很多人不清楚清扳晰的的用例的价值板,只是因为看别别芭人有漂亮的图形形隘,所以自己也画画懊一个,其实自己己艾都不去看它。这这吧样的用例分析只只奥能糊弄一下老板板阿,给别人sho笆笆w一下Demo伴伴八而不会对系统开开佰发什么实质作用用罢。班G。傲用例表示的是使
14、班用系系统的一个场吧景白搬其本质在于详细细搬描述了系统用户户傲(actor)案与系统是如何交交肮互的肮拌以及交互的后果果靶是什么啊敖详细而完善的用用俺例将指导您进行行绊系统开发的全过过懊程瓣U。 低耦合的设计颁系统对象除了与肮领域域模型、用户斑打交道以外阿靶它还会与系统的的胺其它模块交互。埃埃如持久化系统、皑日志系统、信息息坝通知系统(您不不白能因为用户要求求靶由邮件通知改为为昂短信通知就修改改阿领域模型吧),般般当然还有UI,摆摆这些属于系统核核罢心(领域模型)懊以外的东西。般a。哎这些模块不该参斑杂进进业务逻辑中颁。应该在边界与与氨这些模块进行接接拌触。 例子:耙Public 按void
15、借阅般()挨借阅处理者 处翱理者者 = ne伴w 借阅处理者者捌(当前书籍柏靶当前登录人姓名名把);按R。班 绊 Bool s昂uccessf败败ul = 处理理拌者.借阅() 办 跋 /這這安個方法主要就是是懊上面的那2行代代傲碼埃B。翱 白 If(suc阿cessful岸岸)扳持久化系统.a吧dd(当前书籍阿);叭日志系统.ad扳d日日志(当前当熬籍,挨”巴借阅靶”把)啊邮件系统.发送柏邮件件(当前书籍稗.当前借书人姓姓俺名)碍 邦 氨/这个例子的拔关键键在于,你本按可以在借阅(疤)方法中先实实靶现借阅的逻辑,邦邦然后顺势进行持持挨久化、日志、邮邮皑件操作。可是这这扒里却多弄了个皑处理者对
16、象来来肮专门进行借阅操操半作,其目的就是是岸为了将皑“熬借阅耙”拔逻辑独立出来,俺俺与其他模块耦合合罢更松。鞍z。 例子二:叭Void 持久稗化系系统.add昂(书籍 当前书书霸籍)把借阅关系 Bb埃b = new邦 借阅关系安 鞍 Bbb.id熬熬 = 产生ID摆摆()把 班 Bbb.图图书盎ID = 当前前败书籍.id;罢 拜 Bbb.借借阅蔼人 = 当前书书班籍.借阅记录.把把借阅人姓名芭 肮 Bbb.借借阅罢时间 = 当前前巴书籍.借阅记录录奥.借阅时间斑 岸 Bbb.Sa拔拔ve(); 班在现实系统中熬懊我我在if(su案案ccessfu艾艾l)这里作了一一敖些纯软件设计哀拜如利用C
17、#具有有扮Event特性性翱败将借阅方法后公公跋开出一个事件跋摆这样我在再要添添版加什么外围模声声版时笆斑只要响应事件就就懊可以了捌俺不需要再来动这这耙个方法 。吧M。 捌其它模块处理过懊程类类似。罢业务过程是系统哀的核核心,其他模斑块都依赖于它而而拌存在。昂一个系统要变更佰业务务逻辑办败我们只要针对领领安域模型作变化即即扳可拜奥再也不需要抱怨怨挨变化了捌X。 HYPERLINK /yyg_juke/article/details/ 唉OA_6_利用摆Rose创创建各佰种组织机构的u案案ml图形疤d。 OA6: 癌利用安Rose扮创建建各种组织机爸构的埃uml伴图形(隘.mdl八)。 扳 艾
18、熬 邦根据需求建立模模懊型 俺 澳 啊职能型组织机构构八包括背树形和直线型(班班集权型) 搬抽象出隘Party白白,可以复用一些些傲公共的属性霸将树形结构白关联转移移到啊Party靶,可以同时支持持埃Person敖和搬Orgniza艾艾tion隘的树形结构瓣e。 背 案 扮 佰混合型组织机构构 拜矩阵型组织机构傲(网网状组织机构败)瓣在需求分析中这岸几种种关系最重要斑OA项目属于职邦能型型艾 瓣 哎( 一)组织机机捌构管理笆 般(struts八八) Actio斑斑n 与页面要注注佰意的细节邦页面所需要的信扳息,参参数,必须哀要在板Acion里面面哀定义好,否则页页笆面取不出数据,板板Actio
19、n主主邦要负责页面数据据熬的搜集熬OrgActi翱翱on.java昂昂K。艾public芭 埃class暗 OrgAct八八ion 柏extends伴伴 Action哀哀Support叭叭爸T。/* * */敖盎private隘 碍碍static唉 暗final把 罢long俺 癌serialV捌捌ersionU埃埃ID鞍 = 1L;拜j。袄爸private扮 OrgMan扮扮ager 啊orgMana瓣瓣ger八;拔斑private搬 List 碍orgs颁;败笆private盎 隘隘int耙 隘parentI哎哎d搬;胺/向下导航处处暗所有的子机构,埃埃需要传递参数,按按在页面上不般L。岸
20、去出来,不必注懊入reques肮肮t域袄佰public隘 吧int搬 getPar拜拜entId()扳 拌败斑return艾 熬parentI八八d稗;凹斑public背 拔void奥 setPar翱翱entId(疤int爸 parent安安Id) 埃W。跋矮叭this把.敖parentI佰佰d碍 = pare癌癌ntId;背袄public阿 List g矮etOrgs(暗) 摆岸颁return癌 袄orgs案;颁癌public矮 摆void奥 setOrg胺胺s(List 爸orgs) 伴k。捌邦般this白.啊orgs伴 = orgs安安;巴俺public埃 OrgMan隘隘ager ge
21、埃埃tOrgMan背背ager() 阿袄7。艾袄俺return霸 版orgMana耙耙ger八;叭俺public阿 佰void般 setOrg爸爸Manager板板(OrgMan岸岸ager or肮肮gManage拔拔r) 胺3。八奥鞍this澳.暗orgMana罢罢ger瓣 = orgM坝坝anager;般斑public佰 癌static白 白long皑 getSer搬搬ialVers癌癌ionUID(翱) 扮m。拔袄懊return霸 哎serialV捌捌ersionU扮扮ID叭;巴斑Overri癌de隘案public扮 String案案 execut傲傲e() 爸throws搬 Excep
22、t邦邦ion 胺m。柏按柏/转到索引页癌巴隘System.跋out安.printl拜拜n(碍parentI稗稗d叭);佰肮把List or哎gs = 搬orgMana啊啊ger版.search隘隘Orgs(靶parentI摆摆d隘);半A。奥 背 /页面要取矮属性必须放入r皑皑equest里里凹面去叭胺绊ActionC氨ontext.暗暗getCont矮矮ext耙().put(澳orgs安, orgs)傲;案J。澳按瓣return背 鞍鞍index爸; 俺哀public哀 String班班 addIn盎盎put()绊瓣皑return蔼 扒add_in版版put奥;拜埃public爸 Strin
23、g艾艾 add()埃盎爸return凹 稗add_su案案ccess斑;笆靶public氨 String傲傲 del()捌稗拌吧return熬 把del_su版版ccess艾;叭要注意当查询顶办级机机构下的,数凹据存的的邦pid=nul唉唉l; 必须进行行凹下面的控制,否否伴则会查不出来盎e。稗String 扮hql = 艾select百百 o from袄袄 Organa拌拌zation 芭o where靶靶 o.pare扳扳nt.id=按+parent盎盎Id ;挨V。阿爸把if稗(parent背背Id=0)班俺澳颁hql=百select拌拌 o from暗暗 Organa捌捌zation
24、巴o where叭叭 o.pare按按nt.id i盎盎s null熬 ;搬z。哎Action里啊面的的最核心的方翱法,这要一转到到隘Action就就艾会调用此方法,背背此方法里面的参参扳数parent百百Id也会改变啊O。巴public稗 String蔼蔼 execut把把e() 俺throws扮 Except扒扒ion 按d。挨爸肮/转到索引页白拔稗System.拜out疤.printl岸岸n(坝parentI绊绊d隘);坝吧捌List or稗gs = 碍orgMana唉唉ger版.search敖敖Orgs(叭parentI办办d挨);败C。靶 拜 /页面要取哀属性必须放入r肮肮eques
25、t里里搬面去唉埃耙ActionC隘ontext.稗稗getCont巴巴ext碍().put(矮orgs蔼, orgs)颁;凹7。昂班傲return翱 澳澳index拔;傲 页面八向下下导航显示父鞍机构下的所有的的昂子机构把只需要在页面要哎导航航的地方加超佰链接,跟上要传传板的参数靶 背稗y。邦叭 扳 癌哀 盎 八熬 岸扮p。芭 扒 芭 巴 巴稗a 安href埃=翱搬org.act半半ion?败parentI胺胺d=霸哎拌办叭 唉K。癌ERROR 板LazyIni氨氨tializa岸岸tionExc佰佰eption捌坝 蔼懒加载异常扳 笆q。安出现错误的地方敖页面面叭吧 无法显示阿0。靶
26、 坝由于傲hiberna芭芭te中Sess懊懊ionFact蔼蔼ory是线程安安癌全的,而其创建建懊出来的sess耙耙ion非线程把D。斑安全胺 八,不能获取取线程敖安全的懒加载类类把 解决办法:搬web.xml哎配置置翱session啊啊过滤器癌哀案 唉矮 敖稗OpenSes爸爸sionInV跋跋iewFilt唉唉er胺邦k。白 癌耙 芭阿org.spr把把ingfram耙耙ework.o碍碍rm.hibe斑斑rnate3.矮矮support按按.OpenSe氨氨ssionIn耙耙ViewFil挨挨ter奥俺q。扳 伴哎 肮 版澳傲 隘哎 奥搬OpenSes板板sionInV瓣瓣iewFil
27、t白白er邦拜l。俺 叭挨 挨澳/*白颁 伴白版 埃注意配置的位置颁:哎配置的位置要先挨于鞍鞍Struts的的肮filter配配拜置文件,否则要要笆受到strut般般s过滤器的影响响疤,傲J。罢Session板的过过滤器则会无霸效胺页面的参数以及疤提交交问题背安a 敖href版=爸爸# 碍onclick邦邦=暗般openWin笆笆(org!a矮矮ddInput氨氨.action拔拔?parent熬熬Id=澳挨,addO靶靶rg,600板板,200);氨耙艾3。背傲4。百在Action鞍方法法中搜集不到埃参数坝parentI扮扮d澳,哪个方法的阿actiion笆笆传参数,Act爸爸ion中的对应
28、应唉的方法才能收到到白相应的参数,所所靶以在开发中要注注邦意哪些参数能在在碍方法中取得,要要靶注意表单提交要要搬完全成功,Ac罢罢tion里面才才把能搜集到数据皑O。爸页面出现乱码的白解决决埃在web.xm艾l配配置文件中配巴置不管用Spr八八ing过滤器不不盎管用 霸 熬办 盎肮哀Charact凹凹erEncod盎盎ingFilt坝坝er佰跋6。挨 按伴癌org.spr哀哀ingfram稗稗ework.w盎盎eb.filt昂昂er.Char疤疤acterEn班班codingF白白ilter澳挨I。昂 岸柏 吧办 瓣班稗安encodin阿阿g哎柏w。翱 捌肮笆绊GBK氨岸 耙罢柏 背 版 败埃
29、 皑 柏柏敖Charact百百erEncod哀哀ingFilt肮肮er癌笆X。班 笆 案案稗/*白扳 扳 爸只有配置Str俺uts的的字符过瓣滤器才管用隘版柏A。分页框架邦需要引入分页框跋架吧当点击页面跳转袄的时时候 ,地址百栏会自动传参数数笆http:/坝localho蔼蔼st:8080叭叭/oa_02/昂pagerte癌癌st.jsp?翱pager.o蔼蔼ffset=5艾艾0吧8。把此参数就是我们扒分页页的步调,但阿是Action百百中要定义与之一一瓣样的接收参数的的傲属性埃u。暗否则拿不到参数把offset邦PersonA盎ction。J叭叭ava隘public按 凹class霸 Per
30、son办办Action 办extends啊啊 Action斑斑Support吧吧 背u。/* * */耙岸private阿 伴伴static傲 熬final叭 挨long跋 挨serialV巴巴ersionU扒扒ID邦 = 1L;疤5。班罢private岸 Person翱翱Manager邦邦 柏personM颁颁anger奥;埃D。白蔼private柏 PageMo班班del 蔼pager傲;颁板private胺 Person挨挨 哎person1拔拔;拔阿public澳 Person捌捌 getPer俺俺son1() 办暗邦哎return伴 蔼person1败败;隘扮public拌 板voi
31、d熬 setPer办办son1(Pe皑皑rson pe八八rson1) 邦隘p。斑搬伴this扮.按person1澳澳 = pers哀哀on1;佰版Overri凹de吧搬public办 String暗暗 execut袄袄e() 鞍throws唉 Except拜拜ion 傲I。敖版八/转到索引页办傲爸/List 癌orgs = 捌orgMana艾艾ger.sea艾艾rchOrgs八八(parent巴巴Id);矮2。氨埃艾int稗 offset绊绊 = 0;般按隘if跋(凹pager半!=霸null矮)袄哎傲柏offset 百= 敖pager拌.getOff奥奥set();稗敖爸System.肮o
32、ut佰.printl肮肮n(offse敖敖t);哎熬挨pager肮 = 斑斑personM澳澳anger凹.seachP安安ersons(按offset,盎盎 10);爸B。摆拌隘System.肮out氨.printl拔拔n(碍pager扳);摆奥捌ActionC耙ontext.巴巴getCont敖敖ext胺().put(傲pm拜, 班pager暗);蔼R。凹啊胺return版 稗稗index笆; 把耙public袄 String拌拌 addIn绊绊put()艾扳扮return拔 霸add_in凹凹put昂;办傲public巴 String啊啊 add()扮邦瓣return扳 拔pub_ad版
33、版d_succe八八ss按;八坝public坝 String扳扳 del()隘盎背安return办 氨pub_de肮肮l_succe案案ss哎;拜奥public扒 String霸霸 select叭叭Flag()盎颁捌return捌 佰select捌捌Flag柏;瓣埃public笆 Person懊懊Manager傲傲 getPer凹凹sonMang八八er() 巴8。吧蔼百return白 稗personM芭芭anger吧;唉碍public袄 扮void败 setPer坝坝sonMang奥奥er(Pers敖敖onManag哎哎er pers办办onMange笆笆r) 靶9。半八绊this昂.稗pe
34、rsonM敖敖anger百 = pers艾艾onMange笆笆r;按C。扳唉public隘 PageMo懊懊del get拜拜Pager()拌 鞍霸百return班 板pager挨;芭斑public瓣 伴void吧 setPag奥奥er(Page吧吧Model p俺俺ager) 板K。败敖傲this斑.澳pager胺 = page啊啊r;专用的分页澳奥G。邦般 懊叭U。白 斑阿p。绊凹V。稗坝e。盎昂Insert 拌title h哀哀ere百白2。巴白p。背 肮跋 坝邦首页艾坝 伴捌 皑八 拌艾 吧挨3。啊 叭 班班般 $page邦邦Number巴 翱斑P。半 办爸 白捌 岸 捌捌矮$page
35、N半半umber 昂暗d。版 澳翱 熬澳 癌搬 蔼白 扒按上一页柏哀 鞍芭 鞍半 跋俺下一页拜办 啊暗 哎癌 叭昂尾页矮坝 叭把扳在ssh框架中坝的易易错把Action的啊初始始化,不能再拌applica伴伴tion_be白白ns.xml文文哀件中初始化,而而绊交给strut氨氨s。Xml文件件斑来初始化,否则则傲出行导航收集数数哀据是,导航的类类碍的的属性找不到到胺,会出targ哀哀et is 暗 null的不不安易察觉错误,所所阿以要注意皑W。芭分页功能的抽象澳,使使代码的重复芭量减少,透明度度敖更好Abstr埃埃actMana氨氨ger挨u。分页的逻辑图八package伴 org.pa跋
36、跋ssion.o捌捌a.utils耙耙;肮import 艾java.io稗稗.IOExce扒扒ption;啊import 蔼javax.s癌癌ervlet.安安Filter;柏import 搬javax.s疤疤ervlet.靶靶FilterC挨挨hain;巴T。案import 百javax.s班班ervlet.案案FilterC吧吧onfig;伴E。拔import 佰javax.s班班ervlet.懊懊Servlet拔拔Excepti碍碍on;笆p。版import 隘javax.s跋跋ervlet.班班Servlet芭芭Request班班;拜1。斑import 班javax.s扒扒ervlet
37、.斑斑Servlet扳扳Respons奥奥e;昂E。八import 败javax.s疤疤ervlet.叭叭http.Ht把把tpServl啊啊etReque挨挨st;背B。安import 盎javax.s啊啊ervlet.坝坝http.Ht板板tpServl爸爸etRespo盎盎nse;半X。癌public 安class P敖ageFilt疤疤er impl捌捌ements 吧Filter百1。 /*熬 * 啊线程程变量经过过按滤器过滤 */氨肮public 扳void do拔Filter(癌Servlet八八Request叭叭 servle拌拌tReques昂昂t, Serv吧吧letRes
38、p白白onse se吧吧rvletRe袄袄sponse,半半p。啊胺癌安FilterC邦hain fi板lterCha疤疤in) thr摆摆ows IOE矮矮xceptio矮矮n, Serv颁颁letExce按按ption 扳n。敖扳岸HttpSer埃vletReq敖敖uest re靶靶quest =蔼 (HttpS把把ervletR稗稗equest)半servlet稗稗Request懊懊;岸z。皑绊敖HttpSer蔼vletRes摆摆ponse r胺胺esponse氨氨 = (Htt扮扮pServle坝坝tRespon俺俺se)serv扒扒letResp矮矮onse;办e。唉霸昂System
39、L俺ocal.se拔拔tOffset肮肮(this.g傲傲etOffse唉唉t(reque扳扳st);胺w。斑肮靶SystemL安ocal.se捌捌tPagesi把把ze(this鞍鞍.getPag安安esize(r班班equest)碍);败9。try疤佰唉filterC安hain.do拔拔Filter(拜request袄袄, respo傲傲nse);稗t。爸绊懊finall肮y挨靶白佰/用过一次,半就是是放一次资源笆,不释放,系统统案大会造成内存泄泄盎露阿白般唉SystemL摆ocal.re哎哎moveOff昂昂set();懊吧肮爸SystemL拜ocal.re伴伴movwPag暗暗esiz
40、e()罢; 盎拜private皑 int ge拔tOffset艾艾(HttpSe敖敖rvletRe摆摆quest r霸霸equst)爸q。败柏拌/传requ扒est的的目的是笆为了拿到页面的的哀数据,也就是分分扮页框架的Pag版版er.offs蔼蔼et的参数鞍q。摆柏爸int off敖set = 0捌;try肮颁板扳/如果不用f翱ilter,那那肮页面上传来的数数爸据必须由Act袄袄ion里面的P案案ager接受,唉唉必须为Page哎哎r八8。跋蔼班offset 摆= Integ版er.pars傲傲eInt(re肮肮qust.ge安安tParame捌捌ter(pa芭芭ger.off盎盎set)
41、;啊7。挨巴绊catch(颁Runtime澳澳Excepti佰佰on e)扳啊办啊offset=唉0;翱班叭return 皑offset;暗跋private捌 int ge俺tPagesi按按ze(Http埃埃Servlet哎哎Request佰佰 reques版版t)霸C。岸哎暗return 胺10;斑稗public 扳void in凹it(Filt搬搬erConfi半半g filte巴巴rConfig叭叭) throw瓣瓣s Servl佰佰etExcep背背tion 搬l。敖吧public 背void de敖stroy()般 百_胺_绊_笆_凹_皑_佰_邦_背_败_伴_傲_邦I。矮packa
42、ge败 org.pa阿阿ssion.o斑斑a.utils胺胺;暗public啊 碍class哀 System啊啊Local 般肮private拌 唉唉static扒 Thread板板Local 傲offset按 = 案new伴 Thread疤疤Local()扳;懊M。拜邦private疤 耙耙static疤 Thread邦邦Local 挨pagesiz艾艾e般 = 啊new啊 Thread扳扳Local()吧;矮1。芭唉public澳 伴static叭 碍void邦 setOff鞍鞍set(奥int邦 _offse安安t)皑g。氨叭霸offset半.set(_o颁ffset);哀啊public
43、昂 按static扮 办int绊 getOff搬搬set()扒肮翱Integer瓣 _offse案t =(Int芭芭eger) 安offset颁.get();盎5。爸盎百if霸(_offse叭叭t=罢null肮)巴半翱跋return霸 0;敖扒袄return氨 _offse邦邦t;埃 办public蔼 板static凹 邦void拌 setPa颁颁gesize(版int埃 _pages拔拔ize)班k。啊 背 霸霸pagesiz翱翱e碍.set(_p白白agesize笆笆);坝 敖 笆public哎 瓣static霸 暗int胺 getPag霸霸esize()癌疤O。 笆 拜芭Integer把
44、把 _pgesi岸岸ze = (I班班nteger)蔼 半pagesiz绊绊e搬.get();霸j。 板 半把if摆摆(_pgesi氨氨ze=颁null昂)伴 柏班扒return傲 Intege巴巴r.靶MAX_VAL傲傲UE暗; 伴 绊氨return耙 _pgesi拜拜ze; 稗 扮public扮 袄static柏 唉void艾 remove捌捌Offset(吧)搬P。暗 按叭offset按.remove氨氨(); 扒 奥public皑 败static蔼 搬void唉 柏removwP霸霸agesize巴巴()芭C。暗 邦吧pagesiz版版e奥.remove矮矮(); 熬注意:扳pageF
45、il吧吧ter的配置位位熬置,配置在前面面捌起作用,配置在在暗后面一般不起作作八用,所以对于在在拔配置Filte摆摆r的时候,一定定凹要注意其所在的的叭位置,以免过滤滤靶器无效斑q。返回 顶级机构柏此返回用jav癌ascript扮扮只能返回到上一一叭级机构,而且比比邦较麻烦,这是我我氨们可以借助后台台捌强大的功能,也也澳就是拿到ppi巴巴d进行再一次的的背查询隘7。加上这段代码啊邦拔if靶(佰parentI翱翱d拜!=0)瓣把澳把Organaz芭ation p癌arent =邦 摆orgMana伴伴ger败.findOr扮扮g(澳parentI半半d班);袄2。败背肮傲if绊(parent拔拔
46、.getPar扒扒ent()!=按null摆)熬扒白半般ppid敖=parent拔拔.getPar斑斑ent().g叭叭etId();拌i。异常处理败首先定义好一个八异常常类,让其继搬承癌Runnabl摆摆eExcept奥奥ion,让后定定埃义好一个错页面面蔼Q。页面如下挨pub_exe版ception俺俺.jsp疤凹蔼W。艾扳x。按凹出错错页面半爸 盎哀错误信息 凹拔z。啊拌拌暗让后在扒struts里里澳面配置下面的一一奥段芭 皑熬 蔼耙common/蔼pub_exe胺胺ception摆摆.jsp疤拌Q。昂 盎哎班 癌盎碍 跋 矮矮 埃 百 蔼 笆肮5。扳 傲 稗稗啊Log4j巴 (二)授权
47、癌与认认证败认证授权的三元败组A3BC权限控制三元组艾Oa项目的的类爸图的的由来霸首先分析出用户挨 ,模模块,角色吧三者之间的关联联靶关系(领域模型型版)凹由于多对多关联芭不建建议采用,要斑将其转换成多对对俺一(领域模型)岸岸,而产生中间类类皑h。叭在上面的图中,俺中间间表又变多了摆,这有增大了开开鞍发量,所以讲R胺胺M和UM合并皑Y。敖对ACL的来的碍设计计扮A这种效率极低斑,当当加载ACL拜的时候,即使懒懒安加载,与之相关关白的类的都要加载载颁进来,澳W。凹所以此种设计显按然不不合理,而且按此种设计不易扩扩柏展,如果有所扩扩瓣展就要该相应的的伴累的设计碍r。哎B综合考虑效率瓣的问问题(注意
48、:哀role的使用用笆可以有可以无,癌癌只是为了授权方方按便)翱i。叭C由领域模型进傲入类类的设计(U芭ser 与Pe翱翱rson一般建建扮议用一对一外键键哎关联)佰0。案当创建完数据库俺表之之后,该分析傲接口,分析接口口跋一般用时序图(哎哎授权运用DWR扮扮框架,运用其高高皑灵敏度的特性)俺俺M。例图OA类图的来源哀User Ro案le User敖Role 三者者瓣的数据维护时。拜拜保存数据的时候候岸,后保存依赖的的败,先保存被依赖赖翱的,氨r。败删除的时候,先皑删依依赖的,其他俺跟着被删案Junit 测按试的的时候,一定奥要加上setC柏柏omplete耙耙()这一句,否否半则无法测试。拌
49、O。搬还要注意需要操半作的的方法名必须袄在applic翱翱ation_c肮肮ommon.x般般ml 配置文文斑件中,要有对应应班的实物柏w。般配置,否则在页霸面上上将出现不允霸许write操操挨作的错误扳Usr 是由 稗person构构摆成,用户管理的的挨时候管理Per哀哀son蔼n。 HYPERLINK 4。 HYPERLINK /new/ 袄J2EE学习心蔼得碍碍0。春夏秋冬碍2012-02班-08 17:拜21靶权限管理系统 霸权限限 角色 用敖户 组奥前言:叭权限往往是一一个八极其复杂的问题题癌,但也可简单表表敖述为这样的逻辑辑霸表达式:判断鞍“扒Who对案N。暗What(Wh拔ich
50、)进行H澳ow的操作按”疤的逻辑表达式是是背否为真翱。针对不同的应应版用,需要根据项项澳目的实际情疤r。摆况和具体架构,半在维维护性、灵活爸性、完整性等N邦邦多个方案之间比比埃较权衡,选择符符昂合的方案。碍目标:唉直观,因为系统统跋最终会由最终用用瓣户来维护,权限限扮分配的直观和容容拌易理解,显得比比搬较重要,系统不不坝i。肮辞劳苦的实现了啊组的的继承,除了颁功能的必须,更更盎主要的就是因为为罢它足够直观。斑x。半简单,包括概念盎数量量上的简单和鞍意义上的简单还还耙有功能上的简单单靶。想用一个权限限跋系统解决所有的的佰V。袄权限问题是不现稗实的的。设计中将阿常常变化的皑“跋定制熬”笆特点比较强
51、的部部般分判断为业务逻逻矮辑,而将常常相相斑1。板同的懊“芭通用俺”半半特点比较强的部部案分判断为权限逻逻哎辑就是基于这样样岸的思路。靶C。扩展,采用可继承在扩扩展上的困难。的的Group概念念在支持权限以组组方式定义的同时时有效避免了重定定义时现状:对于于在企业环境中的的访问控制方法,一一般有三种:1.自自主型访问控制方方法。目前在我国国的大多数的信息息系统中的访问控控制模块中基本是是借助于自主型访访问控制方法中的的访问控制列表(ACLs)。2.强强制型访问控制方方法。用于多层次次安全级别的军事事应用。3.基于于角色的访问控制制方法(RBAC)。是是目前公认的解决决大型企业的统一一资源访问控
52、制的的有效方法。其显显著的两大特征是是:1.减小授权权管理的复杂性,降降低管理开销。2.灵灵活地支持企业的的安全策略,并对对企业的变化有很很大的伸缩性。名名词:粗粒度:表表示类别级,即仅仅考虑对象的类别别(the type of object),不考虑对象的的某个特定实例。比比如,用户管理中中,创建、删除,对对所有的用户都一一视同仁,并不区区分操作的具体对对象实例。细粒度度:表示实例级,即即需要考虑具体对对象的实例(the instance of object),当然,细粒度度是在考虑粗粒度度的对象类别之后后才再考虑特定实实例。比如,合同同管理中,列表、删除,需要区分分该合同实例是否否为当前用
53、户所创创建。原则:权限逻辑配配合业务逻辑。即即权限系统以为业业务逻辑提供服务务为目标。相当多多细粒度的权限问问题因其极其独特特而不具通用意义义,它们也能被理理解为是“业务逻辑”的一部分。比如如,要求:“合同资源只能被被它的创建者删除除,与创建者同组组的用户可以修改改,所有的用户能能够浏览”。这既可以认为为是一个细粒度的的权限问题,也可可以认为是一个业业务逻辑问题。在在这里它是业务逻逻辑问题,在整个个权限系统的架构构设计之中不予过过多考虑。当然,权权限系统的架构也也必须要能支持这这样的控制判断。或或者说,系统提供供足够多但不是完完全的控制能力。即即,设计原则归结结为:“系统只提供粗粒粒度的权限,
54、细粒粒度的权限被认为为是业务逻辑的职职责”。需要再次强调的的是,这里表述的的权限系统仅是一一个“不完全”的权限系统,即即,它不提供所有有关于权限的问题题的解决方法。它它提供一个基础,并并解决那些具有“共性”的(或者说粗粒粒度的)部分。在在这个基础之上,根根据“业务逻辑”的独特权限需求求,编码实现剩余余部分(或者说细细粒度的)部分,才才算完整。回到权权限的问题公式,通通用的设计仅解决决了Who+What+How 的问题题,其他的权限问问题留给业务逻辑辑解决。概念:Who:权权限的拥用者或主主体(Principal、User、Group、Role、Actor等等等)What:权限针对的对象象或资源
55、(Resource、Class)。How:具体的权限(Privilege, 正向授权与负向授权)。Role:是角色,拥有一定数量的权限。Operator:操作。表明对What的How 操作。说明:User:与 Role 相关,用户仅仅是纯粹的用户,权限是被分离出去了的。User是不能与 Privilege直接相关的,User 要拥有对某种资源的权限,必须通过Role去关联。解决 Who 的问题。Resource:就是系统的资源,比如部门新闻,文档等各种可以被提供给用户访问的对象。资源可以反向包含自身,即树状结构,每一个资源节点可以与若干指定权限类别相关可定义是否将其权限应用于子节点。Privi
56、lege:是Resource Related的权限。就是指,这个权限是绑定在特定的资源实例上的。比如说部门新闻的发布权限,叫做部门新闻发布权限。这就表明,该 Privilege是一个发布权限,而且是针对部门新闻这种资源的一种发布权限。Privilege是由Creator在做开发时就确定的。权限,包括系统定义权限和用户自定义权限用户自定义权限之间可以指定排斥和包含关系(如:读取,修改,管理三个权限,管理 权限 包含前两种权限)。Privilege 如删除 是一个抽象的名词,当它不与任何具体的 Object 或 Resource 绑定在一起时是没有任何意义的。拿新闻发布来说,发布是一种权限,但是只
57、说发布它是毫无意义的。因为不知道发布可以操作的对象是什么。只有当发布与新闻结合在一起时,才会产生真正的 Privilege。这就是 Privilege Instance。权限系统根据需求的不同可以延伸生很多不同的版本。Role:是粗粒度和细粒度(业务逻辑)的接口,一个基于粗粒度控制的权限框架软件,对外的接口应该是Role,具体业务实现可以直接继承或拓展丰富Role的内容,Role不是如同User或Group的具体实体,它是接口概念,抽象的通称。Group:用户组,权限分配的单位与载体。权限不考虑分配给特定的用户。组可以包括组(以实现权限的继承)。组可以包含用户,组内用户继承组的权限。Group
58、要实现继承。即在创建时必须要指定该Group的Parent是什么Group。在粗粒度控制上,可以认为,只要某用户直接或者间接的属于某个Group那么它就具备这个Group的所有操作许可。细粒度控制上,在业务逻辑的判断中,User仅应关注其直接属于的Group,用来判断是否“同组” 。Group是可继承的,对于一个分级的权限实现,某个Group通过“继承”就已经直接获得了其父Group所拥有的所有“权限集合”,对这个 Group而言,需要与权限建立直接关联的,仅是它比起其父Group需要“扩展”的那部分权限。子组继承父组的所有权限,规则来得更简单,同时意味着管理更容易。为了更进一步实现权限的继承
59、,最直接的就是在Group上引入“父子关系”。User与Group是多对多的关系。即一个User可以属于多个Group之中,一个Group可以包括多个User。子Group与父Group是多对一的关系。Operator某种意义上类似于 Resource + Privilege概念,但这里的Resource仅包括Resource Type不表示Resource Instance。Group 可以直接映射组织结构,Role 可以直接映射组织结构中的业务角色,比较直观,而且也足够灵活。Role对系统的贡献实质上就是提供了一个比较粗颗粒的分配单位。Group与Operator是多对多的关系。各概念的关
60、系图示如下:解释:Operator 的定义包括了Resource Type和Method概念。即,What和How的概念。之所以将What和How绑定在一起作为一个Operator概念而不是分开建模再建立关联,这是因为很多的How对于某What才有意义。比如,发布操作对新闻对象才有意义,对用户对象则没有意义。How本身的意义也有所不同,具体来说,对于每一个What可以定义N种操作。比如,对于合同这类对象,可以定义创建操作、提交操作、检查冲突操作等。可以认为,How概念对应于每一个商业方法。其中,与具体用户身份相关的操作既可以定义在操作的业务逻辑之中,也可以定义在操作级别。比如,创建者的浏览视图
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 人工智能在保险合规监督中的作用
- 人工智能在监管合规评估中的应用研究
- 人力资源副经理年度工作述职报告
- 保险AI算力安全认证
- 彩绘施工方案及施工方案
- 钢琴兴趣班教学计划
- 2026年集团资产管理办法
- 海边施工桩基施工方案
- 人教版小学六年级科学生态系统教案
- AI在智能营销中的应用探索
- 灰岩地区长大隧道机械化快速施工技术
- 《勾股定理》整章综合测试(一)338345
- (完整)注册安全工程师考试题库(含答案)
- GB/T 17880.6-1999铆螺母技术条件
- YY 0899-2020医用微波设备附件的通用要求
- JJF 1915-2021倾角仪校准规范
- GB/T 325-2000包装容器钢桶
- 执行-如何完成任务的学问课件
- 临床实践中的循证医学(课件新修)
- 特种作业人员安全操作规程
- 抢救病人现场记录单
评论
0/150
提交评论