版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
TOC\o"1-5"\h\z、搭建开发环境 6新建数据库 6添力口struts2框架环境 6添加架包: 6添加配置文件 6测试struts2 7添力口hibernate框架环境 .7添加架包: .7添加配置文件 .7添力口spring框架环境 8添加架包(5个) 8添加配置文件applicationContext.xm1(注解方式) 9测试spring 9整合struts2与spring(目的:把action交给spring统一管理) 10在web.xml中配置spring的监听器 10力口一个jar包:struts2-spring-plugin.jar 10Struts2和spring整合后struts.xml中配置action使用bean的名称。 .10整合hibernate与spring 10目的: 10首先就是在spring配置文件中配置sessionFactory 10(3)声明式事务管理配置 117.添加日志工具(slf4j) 12二、 设计Dao 131.重点: 13java反射机制 13三、 设计实体 14正向工程:设计实体==》映射文件==》建表 14设计实体 14有几个实体(一般一组增删改查为一个实体) 14实体之间有什么联系 14每个实体中都有什么属性 14实体映射 14写注释 14填空 15添加映射文件到hibernate.cfg.xml中 16四、 实现增删改查一组功能 161.做Action相关准备 16分析增删改查功能 16分析action类,提取公共功能,创建action的基类BaseAction实现ModelDriver 17根据分析结果创建action并且继承BaseAction 18创建所用到的jsp页面(暂时还没有内容) 18(5)配置Action并且简单测试: 18做Service相关的准备 19创建接口MyServiceextendsBaseDao 19创建实现类MyServicelmplextendsBaseDaoImpl 19配置:在MyServiceImpl上写注解:@Service与@Transactional 19声明:在BaseAction中声明:@ResourceprotectedMyServicemyService; 19填空 19Action方法。 19新增的Service方法。 19JSP页面的内容: 19期间遇到的问题 19Jsp页面中的EL表达式和OGNL表达式的应用 19事务声明 19懒加载异常 19将Listvrole>类型转换成 Set<role> 类型 20Jsp中的struts2标签涉及的部分属性 21初始化密码(使用MD5进行加密处理) 21级联删除 22注意:在所有的action中的修改数据的方法(切勿偷懒而直接使用model) 22五、权限模块 23权限的分析 23与权限相关的功能 23初始化数据 23分配权限 23使用权限 23设计实体 24实体分析 24实现实体和映射实体以及添加相应属性 24初始化超级管理员和权限数据 24实现分配权限的基本功能 28在roleaction中新添加两个方法 28添加相应的service接口和实现类(四个步骤) 28添加相应的jsp页面 28实现登录和注销功能 28分析功能及每个功能几个请求 28编写action中相关的方法(无内容) 29编写相应的页面 29配置action中相应的方法在struts.xml中 29编写action中方法的具体内容 29实现主页面 29(1)分析功能及每个功能有几个请求 29(2)编写左页面(根据用户所有的角色显示用户所拥有的权TOC\o"1-5"\h\z卩限) 30显示树状结构 32在jsp中有两种复选框可以使用 32最终解决方案: 33树状结构的依赖关系(选中和取消) 34选择一个列表项,也会选中其祖先(父亲,爷爷)的列表项 34取消一个列表项,也会同时取消其子孙的列表项34显示有权限的链接 34第一种方法:(在每个链接前判断是否用户有这个权限) 34第二种方法:(通过自定义标签) 34拦截验证每个请求的权限(使用拦截器) 36创建拦截器继承Abstractinterceptor 36配置拦截器并加入到默认拦截器中 36权限分类 36\o"CurrentDocument"解决重启tomcat还是登录 37解决登录页面嵌套问题 37遇到的问题 37(1)使用$(this).attr(“checked”)会出现undefined的; 37六、结论 38ognl表达式不能用在html标签中 38struts的标签可以用在html元素内。 383.Checkbox的选中事件先于checkbox的onclick事件执行38一、搭建开发环境新建数据库mysql>createdatabasepmsdefanItcharactersetntf8;QueryOK,1rowaffected<0.02sec>mysql>s}iovjcreatedatabasepms;!Database1CreateDatabase!pms :CREATEDATABASE'pins'/*?40100DEFAULTCHARACTERSETutf8*/1rowinset<0.00sec>2.添加struts2框架环境(1)添加架包:xwork-core.jarstruts2-core.jarognl.jarjavassist.jarfreemarker.jarcommons-io.jarcommons-fileupload.jarcommons-logging.jar⑵添加配置文件web.xml添加struts2核心过滤器<!--添加struts?^心过滤器--》er><fiIter-name>struts2</fiIter-name〉<fiIter-class>org.apache・struts2・dispatcher・ng・filter・StroutsPrepareAndExecuteFiIter</filter-class></filter><filter-mapping><filter-name>ss2</filter・name><url・pattern>/:*</ur'].・pattern></filter-mapping》</web-app>创建struts.xml文件配置业务逻辑控制器(action)
<struts><!--配置为幵发者模式〔改变struts.xml时,不用重启服务器,就可以.自动更新)<constantname="struts.devMode"valuG="true>I--配faction扩展名^.action(九i后期过滤做准备)<constantname="struts.action.extension"value="action"/>I--配羞主題^simple(struts标签直接与html标签表示相同)-<constantname="struts.ui.theme"value="simpLe"/>!--酉faction-<packagename="defauLt"extends="struts-defauLt"><actionname=J,testJ,class=ircfi,sise.oa,TestAction"><resultname="success">/test,jsp</result》</action></package></s丈ruts》default.xm1保存所有默认属性。perties保存属性值(org.apache.struts2)⑶测试struts2新建测试action类新建测试jsp文件在struts.xml中配置action部署工程到服务器并测试3.添加hibernate框架环境(1)添加架包:核心包:hibernate.jar依赖的必须要的包:required文件夹jpa包数据库用到的:驱动包,c3p0包。⑵添加配置文件添力口hibernate.cfg.xml,perties和*.hbm.xml
框架文件中的project文件夹下的etc存放有配置文件模板,或者直接在project目录下搜索.分类配置文件<hibernateYonfiguration><sessian-factGry》<!--1*数据库基本信息〔驱动,url,用户名,密码和方言)vpropertyname=Connection,drivercLassjdbc.mysql.Driverv/property》vpropertyname="connection,urt,r>jdbc:mysql:///pms</property》vpropertyname="connection.username"》root</property》vpropertyname="connection,passwore/,r>admin</property》vpropertyname=,,c/ialect,,>org.hibernate*diRlect*MySQL5lnrioDBDiRlectv/property》<!--2.其他配置<!--2*丄显示sql语句-vpropertyname="showsqL"》truev/property》<!--2*2自动更新表'vpropertyname="hbm2ddL.auto,r>update</property》<!--3*导入映射文件<mappingresource=""/></session-factory》</hibernateYonfiguration>方言:数据库名+*+dialect(使用ctrl+shift+t)4.添加spring框架环境(1)添加架包(5个)核心包:spring.jar依赖的包:面向切面:aop(aspectj)+cglib日志:commons-logging.jar
⑵添加配置文件applicationContextxml(注解方式)123456789L0L1123456789L0L112.BL4L5<beansxmlnWhttp://www・springframework・org/schema/beans11xmlns:xsi=,'http;//wiviv・/2001/XMLSchema-instance"xmlns:aop="http://vjwvj・springframe^ork・org/schema/aop"xmlns:context二"http:〃www・springframework・org/schema/context"xmlns:tx="http://www・springframework・org/schema/tx"xsi:schemaLocation="http://www・springframework・org/schema/beanshttp://俪w・springframework・org/schema/beans/sprhttp://www・springframework・org/schema/aophttp://www・springframework・org/schema/oop/sp厂inghttp://www・springframe^ork・OTg/schema/coiTtexthttp://M^w・springframework・OFg/schEma/congx^http://www・springframework・org/schema/txhttp://i\n^・springframework・org/schema/tx/spring-t><!-自动扫描和装配bean〈context:comporient—seanbase-packmge="c7?・sise・oqM></context:comporient—sean></beans>⑶测试spring新建测试类,并编写test方法测试。publicclassTestSp^ing{//获得配置文件的配置privateApplicationcontextcontext=nwwClassPathXmlApplicationContext("applicationContext.xml");@TestpublicvoidtestSpring()throwsException{〃获得testActionTestActiontestAction=(TestAction)context・getBean("testAction");System・out・println(testAction);}'}2.将action声明到配置文件中^Controller@Scope("prototype")//作用域,每次请求都新建—个actionpublicclassTestActionextendsActionSupportf■ AAAAAAAAAAAAAAAAAAAAAAAAA. II H_类似的声明:Component(“beanName”)ServiceControllerRepository注入bean:@Resource3.测试整合struts2与spring(目的:把action交给spring统一管理)(1)在web.xml中配置spring的监听器查看spring包里网页文档spring-framework\docs\reference\html_single15.I门门gwithothm「frmrriEworksIErcidiJctici门Cornrno门uo门figuration进入15.2查看通用配置Web.xml中配置rI<!-配置spring的用于初始化对象的监听器-->)<listmriEr》<listener-class>org・springeramework.web・context・ContextLoaderListenerc/listener-class〉-</listener><context-param>J <param-name>contextConfigLocation</param-name〉I <param-value>classpath:applicationContext*|<xml</param-value></context-param>i<!--添加struts2核心过滤器一><fiPter>(2)加一个jar包:struts2-spring-plugin.jar⑶Struts2和spring整合后struts.xml中配置action使用bean的名称。整合hibernate与spring(1)目的:管理SessionFactory实例(只需要一个)声明式事务管理⑵首先就是在spring配置文件中配置sessionFactory两步:指定sessionFactory使用的配置文件指定C3P0数据库连接池<!--酉£SsessionFactory--><beannan\e="sessionFactory"class="org・springframework・orvw・hibernate3・LocaLSessionFactoryBeann><I--指定hibernateSSS文件的位置<propertynan\e=nconfigLocation"value="cLasspath:hibernate・cfg・xmL"x/property><!--配Sc3p0t9g库连接池一》<propertyname="dataSource"><beanclass二"corw.mchange・i/2・c3p0・ComboPooLedDataSource"〉<!--数据库连接信息--><propertynan\e="jdbcUrL"value="${jdbcUrL}"x/property><propertyna^e=r,driverCLass"value=l,${driverCLass}"x/property><property113巾2="/150厂"\/alue=n${user}*'x/property>^propertyname="password/"value="${password}"></property>|<!--其他配置<直接从模板复制,可以查看网页文档>--><!一初始化时获取三个连接,取值应在minPoolSize与maxPoolSize之间。Default:3--><propertynar(\e="initiaLPooLSizenvalue=,f3/fx/property》!--连接池中1呆笛的最小连接数口Default:3-->cpropertyname="minPooLSize"value=*'3,fx/property><!—连接池中保留的最大连接数©Default;15-~y<propertyn3me="/waxPooLSizg"value=*'5,f></property><!■■当连接池中的连接耗尽的时候c3p0—次同时获取的连接数。Default:3f<propertynan\e=,,acquirelncrement,'value=*'3,rx/property>!--控制数据源内加载的PreparedStatwments数量。如MmaxStatements-^maxStatementsPerConnectio<propertyname="maxStatements"value=,'8,,x/property><!・・maxSt3temerrtsPe「Connection定义了连接池内单个连接所拥有的最大缓存statements数。Default:0-<propertyname="maxstatementsPerConnection"value=*'5,,x/property><!--最大空闲时间,1800秒内未使用则连接披丢弃。若为0则永不丢Default:0--><propertyname="maxIdLeTime"value=,'1800/,x/property>将需要改动的配置文件另外放到一个属性文件pertiesa,applicationContext.xml凉旦hibernate.cfg.xml園perties凉jdbcUrl=jdbc:mysql:///gmsdriverCIbss=com*jdbc.mysql.Driveruser = root4password但是需要导入到需要用到本配置的文件中<!--导人properties文件- <context:property-placeholder测试sessionFactory//测试sessionFactory@TestpublicvoidtestSessionFactory()throwsException{SessionFactorysessionFactory=(SessionFactory)context・getBean("sessionFactory");System・oat.println(sessionFactory);)-'⑶声明式事务管理配置1.在spring配置文件中配置事务管理器<!-配蛊声明式事务管理器(采用注解的方式}--><beanname="tK/vtor7ager'"class=norg・springframework・om・hibernate3•Hiber'ncrteTrcmsactionMcmager"〉<propertyname="sessionFactory"ref="sessionFactoryM></property></bean><tx:annotation-driventransaction-ma门3£2「="右创(7门(7§0厂"/>测试事务^ServicepublicclassTestService{^ResourceprivateSessionFactorysessionFactory;@Transac丈了。门日1publicvoidsaveTwoUser(){Sessionsession=sessionFactory.getCurrentSession();session.save(newUser());// inti=1/0;|session.save(newUser());}TestSpring.java力测试事务@TestpublicvoidtestTransaction()throwsException{TestServiceservice=(TestService)context迢电协电日叽壮已毗血“让电");service.saveT[AfoUseir();}■-7.添加日志工具(sf4j)添加jar包:slf4j-log4jl2.jarslf4j-api.jar修改配置文件pertiesdebug调试信息info 一般信息warn警告error错误fatal严重错误
二、设计Dao重点:⑴java反射机制privateClass<T>clazz;@ResourueprivateSessionFactorysessionFactory;publicBaseDaoImpl(){super();//通过反射机制茯得T的真实类型//返回本类的父类,包含泛型参数信息ParameteriwedTypept=(Parameteriz:edType)getClass().getGenericSupercl日ss(};//返回沒型参数列表中的第一个参数 “ ' 'this.clazz=(Class<T>)pt.getActualTypeArguments()[0];三、设计实体正向工程:设计实体==》映射文件==》建表设计实体(1)有几个实体(一般一组增删改査为一个实体)⑵实体之间有什么联系一般是页面引用了其他实体,就表明与这个实体有关联关系。(3)每个实体中都有什么属性主键(实体唯一标识)普通属性分析所有有关的页面,找出表单中要填写的或是在显示页面中要显示的信息等。关联关系属性在类图中,关联关系是一条线,有两端,每一端表达与该关联关系有关的属性;有几条线指向本类,本类中就有几个关联关系属性。特殊属性为解决某问题而设计的属性。比如要显示年龄,但不会设计一个intage字段,而是一个Datebirthday字段,年龄是在显示时实时计算出来的。3.实体映射(1)写注释格式:?属性,表示本类与?类的?的关联关系例:users属性,表示本类与Department类的多对一的关联关系
多对一<many-to-onename=“”class=“”column=“'7>一对多<setname="">(Set)<keycolumn=""x/key><one-to-manyclass=""/></set>多对多<setname=""table="">(Set)<keycolumn=""x/key><many-to-manyclass=""column=""/></set>⑵填空name属性:属性名(注释中的第一个问号)class属性:关联的实体类型(注释中的第二个问号)column属性:<many-to-onename=“”class=“”column=“'7>:一般可以写成属性名加Id后缀,如属性为department,则column值写成departments。一对多的<keycolumn=""></key>从关联的对方(对方是多对一)映射中把column值拷贝过来。多对多的<keycolumn=""></key>:一般可以写成本对象的名加Id后缀,如本对象名为User,则写为userid。多对多中的<many-to-manycolumn=“..”>:
一般可以与为关联对象的名称加Id后缀。<!--department属性,表示本类与Dgpmrtment类的多对一的关联关系<many-to-onename="department"class="Department"column=,,c/epartfflef7tIc/,,></many-to-one)<!--roles属性,表示本类与Rale类的多对多的关联关系-<setname=J,roles,r><keycolumn="userld"></key><many-to-manyclass=,r/?oie,'column=''roLelt/^x/many-to-many></set><!--usersJltt,表明本类与Use「类的一对务的关联关系<setname=nus£rsJ,><keycolurrn=f,c/epartfflentlc/ir></key><one-to-manyclass=IRMserJ7></set>⑶添加映射文件到hibernate.cfg.xml中四、实现增删改查一组功能1.做Action相关准备(1)分析增删改查功能滋加岗位管理列表修改岗位管理列表修改刪除添加、修改、删除成功后要重定向到列表功能,这样在刷新页面时才不会出现“又做一次增、删、改”的操作。列表和删除各为一个请求添加和修改各为两个请求作用方法名返回值对应的页面添加页面addUI()addUIaddUI.jsp添加add()toList修改页面updateUI()updateUIupdateUI.jsp修改update。toList删除delete。toList列表list()listlist.jsptoList的配置为:type="redirectAction"actionName-'^xxActionJist”⑵分析action类,提取公共功能,创建 action的基类BaseAction实现ModelDriverpublicclassBaseAction<T>implementsModelDriven<T>{privateTmodel;publicBaseAction(){//l*获得本类的父类的泛型信息ParameterizedTypept=(ParameterizedType)this.getClass().getGenericSuperclass();//2*获得泛型类" 一 一Class<T>clazz=(Class<T>)pt.getActualTypeArguments()[0];创建泛型实例 '*try{model=clazz.newlnstance();}catch(Exceptione){e.printSizackTrace();⑶根据分析结果创建action并且继承BaseAction/**列克*/publicStringlist()throwsException{returnIRli31,r;}/**刪除*/publicStringdelete(JthrowsException{returnIrtcListIr;}/**滋加页面*/publicStringaddUI()throwsException{return^saveUI1';}/**滋加*/publicStringadd(JthrowsException{return"tcListIr;}/**修改页面*/publicStringeditUI(JthrowsException{returnir3aveUIIr;}/**修改*/publicStringedit()throwsException{returnIFtcListIr;}(4)创建所用到的jsp页面(暂时还没有内容)⑸配置Action并且简单测试:1,在MyAction上写注解@Controller与@Scope("prototype").3^Controller}@Scope("prototype")3publicclassUserActionextendsBaseAction<User>{L在strtus.xml中配置这个Action与所用到的result.<!--配蚤用户管理oction class="userAction"method"{1}"><resultname=Jrlist,r>/WEB-INF/jsp/userAction/list,jsp</result><resultname=I,o(7(7yiJ,>/WEB-INF/jsp/userActiori/addLJI.jsp</result><resultname=J,up(7otei7Ijr>/WEB-INF/jsp/userActiori/updateUI*jsp</result>vresult口3111电="亡0/_丫0十"type="redirectAction">us^rjlistv/result》</action》做Service相关的准备创建接口MyServiceextendsBaseDao.创建实现类MyServiceImplextendsBaseDaoImpl.⑶配置:在MyServiceImpl上写注解:@Service与@Transactional声明:在BaseAction中声明:@ResourceprotectedMyServicemyService;填空(1)Action方法。⑵新增的Service方法。⑶JSP页面的内容:拷贝静态页面中的源代码到JSP中。包含进来公共的资源:<%@includefile=“../public/commons.jspf"%>把../替换为${pageContext.request.contextPath}/修改页面内容(使用自定义标签)期间遇到的问题Jsp页面中的EL表达式和OGNL表达式的应用详情请看(JSP的表达式语言(EL).doc)事务声明声明事务的类的子类会继承它的事务声明,而其父类则不能。懒加载异常初步解决:在相应配置文件中将懒加载关闭。<!--roles属性,表示本类与RoIe类的梦对多的关联关系<setnarre="roles11lazy="faLse"><keycolumn^userid11<many-to-manyclass=ir/?oleircolunnn=,,roLeIc/fr></many-to-many></set>最终解决方案:在web.xml配置文件中添加过滤器:目的:让session在jsp页面加载完成后,再关闭;<!--配Sspring的用于解决懒加载问题的过滤器--><filtevfilter-name>OpenSessionlnViewFilter〈/filter-name〉ilter-class>org・springframework・o「m・hibernate3・support.OpenSessionlnViewFilter</filter-class></filter><filter-mapping><filter-name>OpenSessionlnViewFililter-name〉<url-pattern》*・action</url-pattern></filter-mapping>程序分析:Filter°£lntercep七*可以■使用恣廳賤忌总层急曲庶瑟屍曲心磁(4)将Listvrole>类型转换成Set<role>类型以Listvrole>的对象为参数创建Setvrole>对象。ListvRole》roles=roleService*findAllf);//2.将部门信息和岗位信息写入usergetModelf).setDepartwEnt(clEp3「tmEnt);getModelf).setRolesfnewHashSet<Role>(roles));
Ids为空时,返回空集合,不然会报错。publicList<T>findByIds(Long[]ids){if(ids==null||ids.length==0)returnCollections.returnCollections.EMPTY丄巧帀⑸Jsp中的struts2标签涉及的部分属性1.让一个下拉框多选的权限(multiple=”true”)<tdxs:selectnairi*1'厂oLe工亦"list=,,#roLes1'size=J,5listKey=iridirlistValue=f,r)(7ffle"muItiple=''true"让s:select单个数据回显(value与listKey内容等价)dxs:selectnsin\e=1,departmentldirlist=It^departmentslistKey=J,ic/IRlistValue=f,r)affle" "department.id"八让s:select多个数据回显在action的方法中就准备好rolelds,到了jsp页面就会自动回显»J亠J*1IIJ*JT■I J+廿JJJ*1" *匕JV亠'KJJIjIIT■、丿I■»严Jfl—■■\rK.//5•准备回显的岗位if(user*getRoles()!=null){rolelds=nmwLong[user.getRolesf)*sizeQ];intindex=0;far(Rolerole:user*getRoles()){rolelds[index+4-]=rale*getld;}}■ ・・ ・■■・Action中的方法的rolelds与select元素的name要相同。<tdxs:select“证二”广皿丘工亦"list二"#厂oLeH妣"silistKey=J,irfIP1istValue="name"muItiple="trueTj(6)初始化密码(使用MD5进行加密处理)需要添口一个jar:commons-codec.jarpublicStringinitPassword()〔//丄■从数据库中取出需要修改的用户Useruser=userService*findById(getModel()*getld());//2.初始化用户的密码Stringpassword=DigEstUtils川亦;user*setPassword(password);//3■更新到数据库userService*update(user);return"toList";>1级联删除<I--childrenJltt,表明本类与DEpmrtiiiEnt类的一对多的关联关系<setname="chiLdren11cascade="deLetefr><keycolumn="parentldr,x/key><one-to-manyclmss二口厂tmE打</set>注意:在所有的action中的修改数据的方法(切勿偷懒而直接使用model)第一步是从数据库中获得需要修改的对象第二步是修改表单中出现的需要修改的属性第三步是将对象保存到数据库中五、权限模块权限的分析权限模型用户权限厂滋加用户.刪除用户£'\查看用户角色用户权限厂滋加用户.刪除用户£'\查看用户角色•用户的权限就是用户的所有角色的权限的合隼。・一个功能是否能械某用户使用,是判断用户权.限中是否有这个功能的使用许可。与权限相关的功能(1)初始化数据权限数据超级管理员⑵分配权限给角色分配权限用户的权限就是用户所有角色的权限⑶使用权限1, 登录,注销,主界面。2, 左侧的菜单是根据权限显示的。3, 右侧页面中的链接是根据权限显示的。4, 拦截每一个action请求,验证用户是否有权限访问。
3-设计实体(1)实体分析⑵实现实体和映射实体以及添加相应属性⑶初始化超级管理员和权限数据@ComponentpublicclassInstaller{@ResourceprivateSessionFactorysessionFactory;@Transactionalpublicvoidinstall(){Sessionsession=sessionFactory.getCurrentSession();
//初始化超级管理员Useruser=newUser();user.setName("超级管理员");user.setUsername("admin");user.setPassword(Digestutils・md5Hex("admin"));session.save(user);//初始化权限数据Privilegemenu,menu1,menu2,menu3;menu=newPrivilege("系统管理",null,null);menul=newPrivilege("用户管理","/user_list",menu);menu2=newPrivilege("部门管理,"/department_list",menu);menu3=newPrivilege("岗位管理","/role_list",menu);session.save(menu);session.save(menu1);session.save(menu2);session.save(menu3);session.save(newPrivilege。'用户添力口,"/user_add",menu1));session.save(newPrivilege("用户删除,"/user_delete",menu1));session.save(newPrivilege。'用户修改,"/user_update",menu1));session.save(newPrivilege。'用户列表,"/user_list",menu1));session.save(newPrivilege。'初始化密码,"/user_initPassword",menu1));session.save(newPrivilege。'部门添力口,"/department_add",menu2));session.save(newPrivilege。'部门删除,"/department_delete',menu2));session.save(newPrivilege。'部门修改,'/department_update',menu2));session.save(newPrivilege。'部门列表,'/department_list',menu2));session.save(newPrivilege。'岗位添力口,'/role_add',menu3));session.save(newPrivilege。'岗位删除,'/role_delete',menu3));session.save(newPrivilege。'岗位修改",‘'/role_update",menu3));session.save(newPrivilege。'岗位列表","/role_list",menu3));}publicstaticvoidmain(String[]args){ApplicationContextac=newClassPathXmlApplicationContext("applicationContext.xml");Installerinstaller=(Installer)ac.getBean("installer");installer・install();}实现分配权限的基本功能(1)在roleaction中新添加两个方法puoiicerringserpriviJLegeu丄\丿丨//丄.准备回显数据(所有的权限列表和该岗位拥有的权限列表)List<Privilege>privilegeList=privilegeServ让e*find也11();Rolerole=roleService.findByld(model.getld());if(role*getPrivileges()!=null){__intindex=O;privilegelds=newLong[role.getPrivileges()*size()];for(Privilegepriv:role.getPrivilegesf)){
privilegelds[index+4-]=priv.ge七工(1(};}''_}//2*将数据加入值栈的对象栈中ActionContext*getContextQ.getValueStack().push(privilegelds);ActionContext*getContext()+put("privilegeList",privilegeList);return"setPrivilegeUI";}严**更新权限*/publicStringsetPrivilege(){//14S据id从数据库中茯得对象Rolerole=roleService.findByld(model.getld());List<Privilege>privilegeList=privilegeSerwice+findBylcIsBMvllegelds};//2*设蛊对象的属性 'rale.setPrivilegesfnewHashSet<Privilege>(privilegeList));將对象直接保存到数据库中 ' _roleSerwidupdate(rale);return"toList";|}⑵添加相应的service接口和实现类(四个步骤)添加接口添加实现类注册到spring中和添加事务在action中声明并注入⑶添加相应的jsp页面实现登录和注销功能⑴分析功能及每个功能几个请求登录:两个请求注销:一个请求⑵编写action中相关的方法(无内容)⑶编写相应的页面(4)配置action中相应的方法在struts.xml中⑸编写action中方法的具体内容验证用户的有效性无效的用户:(显示错误消)Action:addFiledError(“name”,”有错误”);(添加错误)Jsp:<s:filedErrorfiledName=”name'7>;(显示错误)将有效的用户添加到session中注销时,删掉session的用户6.实现主页面(1)分析功能及每个功能有几个请求1.主界面分为上左右。top1链接1right分别为加载top,left,right页面的三个功能,每个功能一个请求。
设计action(四个步骤)(1) 创建action类并编写相应请求的方法(2) 创建对应的jsp页面(3) 配置action(4) 编写action具体的方法⑵编写左页面(根据用户所有的角色显示用户所拥有的权限)1.显示所有权限(1)在jsp页面中通过遍历显示权限<ul><!--—级菜单<s:iteratarvalue="#topList"><li><ahref=,,#,r>${name}</a><ul><!--二级菜单<s:iteratarvalue="chiLdren"><li>kahref= name="$-{pageContext*request*contextPath}${url}.actionJ</li></s:iteratar》</ul></li> =</s:iteratar》</ul>(2)准备jsp页面中需要显示的数据(由于数据不会改变,所以直接在web应用启动时就可以一次加载数据,然后以后就直接使用)通过监听器在创建context时就加载数据。在这过程中,需要获得privilegeService对象,但是servletcontextlistener监听器是tomcat服务器创建的,而不是spring容器创建的,所以不能使用注入的方式获得privilegeService。解决的办法就是:在servletcontextlistener的方法里,获得spring容器对象,进而获得spring容器的privilegeService对象。
在这过程中遇到的问题(懒加载异常)18:49:04^328ERRORLazylnitializationExcQDtion:42・failedtolmzilyinitializeacollectionofrole:cn.sise・ob.domain.Privio厂g.hibernate.LazylnitializationException:failedtolazilyinitializeacollectionofrole:cn.sise・oa.domain・Privilege・chil解决办法:可以关闭权限的懒加载,因为一加载顶级权限,就会用到子权限举一反三:将用户加入到session中后,以后用到用户时,会用到用户的岗位信息,岗位的权限信息,所以响相应的都需要关闭懒加载。过滤用户没有的权限在jsp页面中通过ognl表达式判断用户是否拥有此权限;Ognl表达式可以调用user对象的方法,将权限的名字传进去判断。所以需要在user类中添加判断方法。<s:iteratorvalue="#appLication,topPriuiLegeList"><s:iftest="^session.user.hasPrivzLegeByName^nam^"><li><ahref=u#H>${name}</a><ul><!--二纸菜单<s:ite「日torvalue="chiLdren1^<li><ahref=fr#,rname=*'${pageContext*request.contextpath</li> '</s:iterator></ul></li></s:if></s:iterator>严 J—■亠严 ttjz・”・》"«■乂•■tj」- *判断用户是否拥有此权限! */publicbooleanhasPirivilegeByName(Stringname){L //超级管理员拥有所有权限f if(isAdmin()){returntrue;TOC\o"1-5"\h\z, }: //普通用户需要判断for(Rolerole:roles){for(Privilegeprivilege:role.getPrivileges()){if(name.equals(privilege.getName())){returntrue;\o"CurrentDocument"L }・}>}returnfalse;!}I. *判断本用户是否是超级管理员! */privatebooleanisAdminf){L return"admin".equals(username);・}显示树状结构(1)在jsp中有两种复选框可以使用<s:checkboxlist>:这个复选框可以回显。(struts自带标签)<inputtype=“checkbox”>:这个复选框可以修改每个复选项的格式。(html自带)但是现在需要上面两种复选框的功能。解决办法:如果选择第二种复选框的话,需要解决回显问题。将回显这个大问题分解成一个个小问题(1)怎样让<inputtype“checkbox"〉选中(有checked或者checked=“checked")(2)怎么实现上面的功能,用struts标签(可以嵌入到html元素中)<inputtype="checkbox"门3怔="戸厂匚吭丄旳丘£亦"value="%{zd}"<s:propertyvalue^"%{idinprivzLegelds?Checked1:1'}"/>(3)点中文字也能选中岗莅管亟(label)<s:iteratervaluerr'#prtvtLegeLtst"><inputtype="checkbox"name="priviLegeIds"value=,J${id}wid=wcb_${id}<s:property\falue="%{idinprivzLegelds?'checked':'/>/><labelfor=Vi)_${id}J,>${name}</label><br/></s:iterator>⑵最终解决方案:使用treeview插件(1) 导入js和css文件(jquery.treeview.js,jquery.treeview.css)<scripttype="text/javascript"src=M${pageContext・request・contextPath}/script/jquery-1・9・7・js"x/script><scripttype=''text/^auascr'ipt"src="${pageContext・request・contextPath}/sc厂 右厂eeuigw/yquery•右厂eeuiww・ script><linktype="text/css"rel="styLesheet"href=M${pageContext・request.contextPathl/scr'ipt/jquer'y—tr'eeuiew/jquer'y•右厂m/iww・css"/>(2) 使用ul展示数据<ulid="rootn><s:iterator\faluQ=''#cippLocation・topPMuiLegeList"〉<li> "<i叩uttype="checkbox"name="priviLcgelds".value=,,${id},rid-"cb_${id}"<s:propertyvalue=,,^fidinpriviLegelds?'checked':1'}"/>/><labelfor=*'cb_${id},r>${name}</labelxbr/><ul><s:itermtorvalue="chiLdrcn"><li><inputtype="checkbox"name="pri\fiLegeIds".value=M${id},rid="cb_${id}"<s:property\zalue=n%{idinpriviLegelds?'checked1:''}"/>/>_<labelfor=*rcfc^${id},r>${name}</label><br/><ul><s:iter日toryalue="chiLdren"><li><inputtype=ncheckbox"name="priviLegeIds"♦value=/'${id},rid="cb_${id}n<s:propertyvalue=,r^fidinpriviLpgpIds?1checkedf:r'}"/>/>’」<labelfor=,,cb_${id}/'>${name}</labelxbr/></li> -</s:iterator></ul></li></s:iterator〉</ul>(3) 显示为树状结构<scripttype=Iptext/jc?rascriptir>$("#root,f),treeview()j</script>8■树状结构的依赖关系(选中和取消)选择一个列表项,也会选中其祖先(父亲,爷爷・・・・・)的列表项取消一个列表项,也会同时取消其子孙的列表项/k"j•1/t.-mIimjrp-4-xi.•i•-i*-*in/$("[name='privilegelds']").click(function(){/*选中*/if($(this).is(":checked")){$(this).parents("ul").siblings("input").prop("checked"true);}/*取消选中*/else{$(this)*siblings("ul"),find("li"),children("input"),prop("checked"jfalse);}});显示有权限的链接(1)第一种方法:(在每个链接前判断是否用户有这个权限)根据权限的名称判断<s:iteratorvalue="^appLocation,topPriuiLegeList"><s:iftest="^session・user.hasPriviLegeByName("><li><ahref=,,#,r>${name}</a><ul><!--二纯菜单<s:iteratorvalue=I,chiLdren"><li><ahref=1'#1'name=IR${pageContext*request.contextpath</li> '</s:iterator></ul></li></s:if></s:iterator>⑵第二种方法:(通过自定义标签)根据权限的url判断可以自己自定义标签,或者修改struts的自定义标签。最终方案:修改struts的自定义标签⑴找到struts自定义标签(<s:a/>)的类⑵在src文件中新建一个与找到的类一样的类,并重写相应的标签方法第一步:publicintdoStartTag()throwsJspException{//当前登录的用户Useruser=null;//当前的忠丄Stringurl=null;if(user,hasPrivileeeByUrl(url5){』 % Jfjfreturnsuper*doStBri:T3g();//生成和显示标签链接,并且继续执行后面的代码}else{returnEVALPAGE;//不生成和显示标签琏接,只是继续执行后面的代码}}第二步:publicintdoStartTag()throwsJspException{//当前登录的用户Useruser=null;//当前的呃Stringurl=action;//»i掉参数intpos=url*indexOf("?");if(pos>-1){url=url,substring(Ojpos);}if(url.endsWith("UIM)){url=url*substring(0jurl*leng}if(user^h
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年度年福建省高校教师资格证之高等教育心理学考前练习题及答案
- 2024年度山西省高校教师资格证之高等教育法规典型题汇编及答案
- 一年级数学计算题专项练习集锦
- 戒毒康复人员常规医疗服务工作总结
- 2024年保安人员劳务服务协议
- 自然保护区建设与管理结课论文
- 2024年回迁房屋购买协议格式
- 2024年合作伙伴合资经营协议
- 2024年学生暑假工聘任协议示例
- 物联网L1题库测试与答案2020第23部分
- 行贿受贿检讨书
- 人教版《劳动教育》六上 劳动项目二《晾晒被子》教学设计
- (正式版)QC∕T 1208-2024 燃料电池发动机用氢气循环泵
- 中外合作办学规划方案
- 医学美容技术专业《中医美容技术》课程标准
- CJJ207-2013 城镇供水管网运行、维护及安全技术规程
- 六年级道德与法治期末测试卷加答案(易错题)
- 三位数除以两位数300题-整除-有标准答案
- 办公室装修工程施工方案讲义
- 医院护理人文关怀实践规范专家共识
- 中国农业银行贷后管理办法
评论
0/150
提交评论