- 浏览: 151276 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
hx0637:
楼主!小弟要面临面试了,能否指导下小弟?
面试 深圳一家公司的 -
kljismi:
你好,我现在正在开这项目的代码,但是我不明白@Privileg ...
权限管理模块分析 -
yzhw:
终于找到了
ImageSizer.java -
sunloveny:
国
struts国际化 -
jackotty:
谢谢楼主的分享
struts validator验证框架
初步实现授权管理的界面,重点在于:
1、理解DWR如何使用,理解DWR如何与spring集成
2、理解权限表格的初始化操作(initTable的原理)
dwr.xml
web.xml
index.jsp
1、理解DWR如何使用,理解DWR如何与spring集成
2、理解权限表格的初始化操作(initTable的原理)
引用
作为一个java open source library,DWR可以帮助开发人员完成应用AJAX技术的web程序。它可以让浏览器上的javascript方法调用运行在web服务器上java方法。
DWR主要由两部门组成。javascript与web服务器通信并更新web页;运行在web服务器的Servlet处理请求并把响应发回浏览器。
DWR采用新颖的方法实现了AJAX(本来也没有确切的定义),在java代码基础上动态的生成javascript代码。web开发者可以直接调用这些javascript代码,然而真正的代码是运行在web服务器上的java code。出与安全考虑,开发者必须配置哪些java class暴露给DWR.(dwr.xml)
这种从(java到javascript)调用机制给用户一种感觉,好象常规的RPC机制,或RMI or SOAP.但是它运行在web上,不需要任何浏览器插件。
DWR不认为浏览器和web服务器之间协议重要,把系统界面放在首位。最大挑战是java method call的同步特征与ajax异步特性之间的矛盾。在异步模型里,结果只有在方法结束后才有效。DWR解决了这个问题,把回调函数当成参数传给方法,处理完成后,自动调用回调方法。
这个图表显示了,通过javascript事件,DWR能改变select的内容,当然这些内容由java代码返回。 javascript函数Data.getOptions(populateList)由DWR动态生成,这个函数会调用java class Data类的方法。DWR处理如何远程调用,包括转换所有的参数和返回的结果(javascript\java)。java方法执行完后,执行回调方法populateList。在整个过程中我们就想在用本地的方法一样。
DWR主要由两部门组成。javascript与web服务器通信并更新web页;运行在web服务器的Servlet处理请求并把响应发回浏览器。
DWR采用新颖的方法实现了AJAX(本来也没有确切的定义),在java代码基础上动态的生成javascript代码。web开发者可以直接调用这些javascript代码,然而真正的代码是运行在web服务器上的java code。出与安全考虑,开发者必须配置哪些java class暴露给DWR.(dwr.xml)
这种从(java到javascript)调用机制给用户一种感觉,好象常规的RPC机制,或RMI or SOAP.但是它运行在web上,不需要任何浏览器插件。
DWR不认为浏览器和web服务器之间协议重要,把系统界面放在首位。最大挑战是java method call的同步特征与ajax异步特性之间的矛盾。在异步模型里,结果只有在方法结束后才有效。DWR解决了这个问题,把回调函数当成参数传给方法,处理完成后,自动调用回调方法。
这个图表显示了,通过javascript事件,DWR能改变select的内容,当然这些内容由java代码返回。 javascript函数Data.getOptions(populateList)由DWR动态生成,这个函数会调用java class Data类的方法。DWR处理如何远程调用,包括转换所有的参数和返回的结果(javascript\java)。java方法执行完后,执行回调方法populateList。在整个过程中我们就想在用本地的方法一样。
dwr.xml
引用
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN" "http://getahead.org/dwr/dwr20.dtd">
<dwr>
<allow>
<create creator="spring" javascript="aclManager">
<param name="beanName" value="aclManager"/>
</create>
</allow>
</dwr>
<!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN" "http://getahead.org/dwr/dwr20.dtd">
<dwr>
<allow>
<create creator="spring" javascript="aclManager">
<param name="beanName" value="aclManager"/>
</create>
</allow>
</dwr>
web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <!-- Standard Action Servlet Configuration (with debugging) --> <servlet> <servlet-name>action</servlet-name> <servlet-class>org.apache.struts.action.ActionServlet</servlet-class> <init-param> <param-name>config</param-name> <param-value>/WEB-INF/struts-config.xml</param-value> </init-param> <init-param> <param-name>debug</param-name> <param-value>2</param-value> </init-param> <init-param> <param-name>detail</param-name> <param-value>2</param-value> </init-param> <load-on-startup>2</load-on-startup> </servlet> <!-- Standard Action Servlet Mapping --> <servlet-mapping> <servlet-name>action</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/applicationContext-*.xml,classpath*:applicationContext-*.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <filter> <filter-name>Spring character encoding filter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>GBK</param-value> </init-param> </filter> <filter-mapping> <filter-name>Spring character encoding filter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter> <filter-name>hibernateFilter</filter-name> <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class> </filter> <filter-mapping> <filter-name>hibernateFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter> <filter-name>pagerFilter</filter-name> <filter-class>com.bjsxt.oa.web.PagerFilter</filter-class> </filter> <filter-mapping> <filter-name>pagerFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <servlet> <servlet-name>dwr-invoker</servlet-name> <servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class> <init-param> <param-name>debug</param-name> <param-value>true</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>dwr-invoker</servlet-name> <url-pattern>/dwr/*</url-pattern> </servlet-mapping> </web-app>
index.jsp
<%@ page language="java" contentType="text/html; charset=GB18030" pageEncoding="GB18030"%> <%@include file="/common/common.jsp" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=GB18030"> <link href="style/oa.css" rel="stylesheet" type="text/css"> <script language="javascript" src="script/public.js"></script> <script type="text/javascript" src="dwr/engine.js"></script> <script type="text/javascript" src="dwr/util.js"></script> <script type="text/javascript" src="dwr/interface/aclManager.js"></script> <script type="text/javascript"> function addOrUpdatePermission(field){ aclManager.addOrUpdatePermission( "${aclForm.principalType}", ${aclForm.principalId}, field.moduleId, field.permission, field.checked ); } function initTable(){ aclManager.searchAclRecord( "${aclForm.principalType}", ${aclForm.principalId}, function(data){ for(var i=0; i<data.length; i++){ var moduleId = data[i][0]; var cState = data[i][1]; var rState = data[i][2]; var uState = data[i][3]; var dState = data[i][4]; $(moduleId+"_C").checked = cState == 0 ? false : true; $(moduleId+"_R").checked = rState == 0 ? false : true; $(moduleId+"_U").checked = uState == 0 ? false : true; $(moduleId+"_D").checked = dState == 0 ? false : true; } } ); } </script> <c:choose> <c:when test="${aclForm.principalType eq 'User'}"> <c:set var="title" value="请给用户【${user.person.name}】授权"></c:set> </c:when> <c:otherwise> <c:set var="title" value="请给角色【${role.name}】授权"></c:set> </c:otherwise> </c:choose> <title>${title }</title> </head> <body onload="initTable()"> <center> <TABLE class="tableEdit" border="0" cellspacing="1" cellpadding="0" style="width:580px;"> <TBODY> <TR> <!-- 这里是添加、编辑界面的标题 --> <td align="center" class="tdEditTitle">${title}</TD> </TR> <TR> <td> <!-- 主输入域开始 --> <table class="tableEdit" style="width:580px;" cellspacing="0" border="0" cellpadding="0"> <tr> <td class="tdEditLabel" >顶级模块</td> <td class="tdEditLabel" >二级模块</td> <td class="tdEditLabel" >权限</td> <c:if test="${aclForm.principalType eq 'User'}"> <td class="tdEditLabel" >不继承</td> </c:if> <td class="tdEditLabel" >启用</td> </tr> <c:forEach items="${modules}" var="module"> <tr> <td>${module.name}</td> <td></td> <td> <input type="checkbox" id="${module.id }_C" moduleId="${module.id }" permission="0" onclick="addOrUpdatePermission(this)">C <input type="checkbox" id="${module.id }_R" moduleId="${module.id }" permission="1" onclick="addOrUpdatePermission(this)">R <input type="checkbox" id="${module.id }_U" moduleId="${module.id }" permission="2" onclick="addOrUpdatePermission(this)">U <input type="checkbox" id="${module.id }_D" moduleId="${module.id }" permission="3" onclick="addOrUpdatePermission(this)">D </td> <c:if test="${aclForm.principalType eq 'User'}"> <td> <input type="checkbox"> </td> </c:if> <td> <input type="checkbox"> </td> </tr> <c:forEach items="${module.children}" var="child"> <tr> <td></td> <td>${child.name}</td> <td> <input type="checkbox" id="${child.id }_C" moduleId="${child.id }" permission="0" onclick="addOrUpdatePermission(this)">C <input type="checkbox" id="${child.id }_R" moduleId="${child.id }" permission="1" onclick="addOrUpdatePermission(this)">R <input type="checkbox" id="${child.id }_U" moduleId="${child.id }" permission="2" onclick="addOrUpdatePermission(this)">U <input type="checkbox" id="${child.id }_D" moduleId="${child.id }" permission="3" onclick="addOrUpdatePermission(this)">D </td> <c:if test="${aclForm.principalType eq 'User'}"> <td> <input type="checkbox"> </td> </c:if> <td> <input type="checkbox"> </td> </tr> </c:forEach> </c:forEach> </table> <!-- 主输入域结束 --> </td> </TR> </TBODY> </TABLE> <TABLE> <TR align="center"> <TD colspan="3" bgcolor="#EFF3F7"> <input type="button" class="MyButton" value="关闭窗口" onclick="window.close()"> </TD> </TR> </TABLE> </center> </body> </html>
package com.bjsxt.oa.manager.impl; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import com.bjsxt.oa.manager.AclManager; import com.bjsxt.oa.manager.Permission; import com.bjsxt.oa.model.ACL; public class AclManagerImpl extends AbstractManager implements AclManager { public void addOrUpdatePermission(String principalType, int principalId, int moduleId, int permission, boolean yes) { //查找ACL对象 ACL acl = findACL(principalType, principalId, moduleId); if(acl != null){ //根据permission和yes,更新aclState的值 acl.setPermission(permission, yes); getHibernateTemplate().update(acl); return; } acl = new ACL(); acl.setPrincipalType(principalType); acl.setPrincipalId(principalId); acl.setModuleId(moduleId); //根据permission和yes,更新aclState的值 acl.setPermission(permission, yes); getHibernateTemplate().save(acl); } public void addOrUpdateUserExtends(int userId, int moduleId, boolean yes) { ACL acl = findACL(ACL.TYPE_USER, userId, moduleId); if(acl != null){ acl.setExtends(yes); getHibernateTemplate().update(acl); return; } acl = new ACL(); acl.setPrincipalType(ACL.TYPE_USER); acl.setPrincipalId(userId); acl.setModuleId(moduleId); acl.setExtends(yes); getHibernateTemplate().save(acl); } public void delPermission(String principalType, int principalId, int moduleId) { ACL acl = findACL(principalType, principalId, moduleId); if(acl != null){ getHibernateTemplate().delete(acl); } } public boolean hasPermission(int userId, int moduleId, int permission) { //根据用户标识和模块标识查找授权记录 ACL acl = findACL(ACL.TYPE_USER,userId,moduleId); //有授权记录 if(acl != null){ int yesOrNo = acl.getPermission(permission); //如果是确定的授权 if(yesOrNo != ACL.ACL_NEUTRAL){ return yesOrNo == ACL.ACL_YES ? true : false; } } //继续查找用户的角色的授权记录 String hql = "select r.id from UsersRoles ur join ur.role r join ur.user u " + "where u.id = ? order by ur.orderNo"; List roleIds = getHibernateTemplate().find(hql, userId); for (Iterator iterator = roleIds.iterator(); iterator.hasNext();) { Integer rid = (Integer) iterator.next(); acl = findACL(ACL.TYPE_ROLE, rid, moduleId); if(acl != null){ return acl.getPermission(permission) == ACL.ACL_YES ? true : false; } } return false; } public List searchModules(int userId) { //查询用户拥有的角色,并按优先级从低到高排序 String hql = "select r.id from UsersRoles ur join ur.role r join ur.user u " + "where u.id = ? order by ur.orderNo desc"; List roleIds = getHibernateTemplate().find(hql, userId); Map temp = new HashMap(); //依次查找角色的授权列表 for (Iterator iterator = roleIds.iterator(); iterator.hasNext();) { Integer rid = (Integer) iterator.next(); List acls = findRoleAcls(rid); for (Iterator iterator2 = acls.iterator(); iterator2.hasNext();) { ACL acl = (ACL) iterator2.next(); temp.put(acl.getModuleId(), acl); } } //针对用户查找有效的用户授权列表 List acls = findUserAcls(userId); for (Iterator iterator = acls.iterator(); iterator.hasNext();) { ACL acl = (ACL) iterator.next(); temp.put(acl.getModuleId(), acl); } //去除掉那些没有读取权限的授权记录 Set entries = temp.entrySet(); for (Iterator iterator = entries.iterator(); iterator.hasNext();) { Map.Entry entry = (Map.Entry) iterator.next(); ACL acl = (ACL)entry.getValue(); if(acl.getPermission(Permission.READ) != ACL.ACL_YES){ iterator.remove(); } } if(temp.isEmpty()){ return null; } String searchModules = "select m from Module m where m.id in (:ids) order by m.orderNo"; return getSession().createQuery(searchModules) .setParameterList("ids", temp.keySet()) .list(); } public List searchAclRecord(String principalType, int principalId) { String sql = "select moduleId,aclState&1,aclState&2,aclState&4,aclState&8 from t_acl " + "where principalType = '"+principalType+"' " + "and principalId = "+principalId; return getSession().createSQLQuery(sql).list(); } private ACL findACL(String principalType,int principalId,int moduleId){ String hql = "select a from ACL a where a.principalType = ? and a.principalId = ? and a.moduleId = ?"; ACL acl = (ACL)getSession().createQuery(hql) .setParameter(0, principalType) .setParameter(1, principalId) .setParameter(2, moduleId) .uniqueResult(); return acl; } private List findRoleAcls(int roleId){ return getHibernateTemplate().find( "select acl from ACL acl where acl.principalType = ? " + "and acl.principalId=?", new Object[]{ACL.TYPE_ROLE,roleId} ); } private List findUserAcls(int userId){ return getHibernateTemplate().find( "select acl from ACL acl where acl.principalType = ? " + "and acl.principalId=? and acl.aclTriState = ?", new Object[]{ACL.TYPE_USER,userId,ACL.ACL_TRI_STATE_UNEXTENDS} ); } }
发表评论
-
oa_22
2009-02-04 22:20 1816oa_22: 结合Freemarker,将动态表单显示在公文 ... -
oa_21
2009-02-04 22:18 1221oa_21: 添加动态表单呈现层代码 - 理解批量数据的 ... -
oa_20
2009-02-04 22:15 1293oa_20: 1、创建动态表单的领域模型 FieldInp ... -
oa_18
2009-02-04 22:07 863oa_18: 实现WorkflowManager接口,以及流 ... -
oa_17
2009-02-04 22:03 1229集成JBPM到OA系统,并实现JbpmFacade接口 - ... -
oa_16
2009-02-04 21:58 949oa_16: 根据用例分析的结果,创建WorkflowMan ... -
oa_15:
2009-02-04 21:55 887oa_15: 根据公文流转领域模型创建相关的实体类,并使用x ... -
oa_14
2009-02-04 21:51 1337利用JSTL函数实现即时认证 - SecurityFunc ... -
oa_13
2009-02-04 21:35 1392oa_13: 实现登录功能 - LoginAction ... -
oa_10
2009-01-18 12:54 1136提供初始化数据的代码 ... -
oa_09
2009-01-18 12:48 1780提供人员管理、模块管理、角色管理、用户管理相关的代码。 同时 ... -
oa_08
2009-01-18 12:08 1064创建AclManager接口,并实现 - 理解权限管理子系统 ... -
oa_07
2009-01-18 11:54 1290引入Ant和Xdoclet的支持, ... -
oa_06
2009-01-18 11:48 1059利用ThreadLocal实现分页参数的透明传输(通过使用Th ... -
oa_05
2009-01-18 11:41 988从现有的分页处理方案中,抽象出AbstractManager, ... -
oa_04
2009-01-18 11:30 1172利用Pager-Taglib实现机构 ... -
oa_03
2009-01-18 11:22 1190在做完机构管理的业务逻辑之后,下面考虑呈现层的实现。 1、 ... -
oa_02
2009-01-18 11:05 1024整合Spring和Hibernate之后,对于业务逻辑类的测试 ... -
oa_01+
2009-01-18 10:55 1242package com.bjsxt.oa.manager.im ... -
oa_01
2009-01-18 10:48 1280oa_01: 1、建立机构管理的实体类,并映射【重点理解多对 ...
相关推荐
OA_Automotive_Ethernet_ECU_TestSpecification_Layer_3-7_v3.0 本文档是OPEN Alliance Automotive Ethernet ECU Test Specification Layer 3-7的规范文档,版本号为v3.0。该规范文档是由OPEN Alliance TC8 Working...
"OA_OA源码_oa_"这个标题表明我们讨论的是一个关于OA系统的源代码,可能是为了学习、研究或者二次开发而提供的开放源码项目。 "界面好看的OA系统"描述暗示了这个OA系统在用户界面设计上注重用户体验,提供了美观、...
【标题】"oa.rar" 暗示这是一个关于OA(办公自动化)系统的压缩包,而“java oa_oa_oa java_spring3_struts2 oa”表明该系统是基于Java技术栈开发的,特别是采用了Spring3和Struts2框架。OA系统通常用于企业内部的...
此外,文档里提及的“Referenced TC11 Tests”和“RestictionLevel: OPENTechnicalMembersOnly”都指向了该文档属于OPEN Alliance的技术成员专有,普通公众无法获取该规范的最新版本。这种限制通常用于确保只有具备...
在“oa.rar_OA jsp_java oa_oa_oa java_办公 Java”这个标题中,我们可以推断这是一个使用Java和JSP技术开发的OA系统,主要面向办公自动化需求。 JSP(Java Server Pages)是Java的一种动态网页技术,允许开发者将...
标题中的"OA.rar_ ASP OA_OA asp_asp oa_商业源码_花钱"表明这是一个基于ASP技术的OA(Office Automation,办公自动化)系统的源码压缩包,且该源码具有商业价值,可能需要购买获取。这个系统可能是用ASP(Active ...
OA办公系统,全称为Office Automation System,是一种基于网络技术,以提高办公效率、实现无纸化办公为目标的软件系统。在“OA.rar_OA办公系统_PHP OA_oa_oa php_办公软件”的标题中,我们可以看出这个压缩包包含了...
"OA.rar_java oa_oa mysql_oa java_oa java mysql_办公OA" 这个标题揭示了我们讨论的主题是一个基于Java技术构建的办公自动化(OA)系统,它利用MySQL数据库进行数据存储。OA系统是现代企业信息化管理的重要工具,...
【OA.rar_asp oa_oa psd_oa 系统_办公OA_网络办公】这个压缩包文件包含的内容主要是关于ASP开发的办公自动化(OA)系统,以及相关的PSD设计文件,适合那些需要定制或修改OA系统界面的用户。下面将详细解释其中涉及的...
标题中的"oa.rar_OA文档_SSH JBMP_jbmp oa_oa_oa ssh"表明这是一个与OA(Office Automation,办公自动化)系统相关的压缩文件,其中包含了使用SSH(Spring、Struts、Hibernate)框架和JBMP(Java Business ...
本篇文章将围绕"OA.zip_java oa_oa_oa java_oa管理系统_oa系统"这一主题,深入探讨基于Java技术的OA系统的设计与实现。 1. **需求规格说明**:OA系统的需求规格说明是项目开发的起点,它详细列出了系统的功能需求、...
【OA.rar】是一个压缩包文件,其中包含了C#语言开发的OA(Office Automation,办公自动化)系统的源代码和相关资源。这个系统是基于ASP.NET框架构建的,这意味着它使用了微软的.NET Framework来运行和处理Web应用...
在本压缩包中,"oa.rar_java oa_oa_oa java" 暗示了这是一个基于Java技术开发的OA系统。 Java作为一门多平台、面向对象的编程语言,因其跨平台性、安全性以及强大的网络功能,被广泛应用于企业级应用开发,尤其是OA...
《.NET OA 系统与文档管理详解》 OA(Office Automation)系统是现代企业信息化建设中的重要组成部分,主要用于提升工作效率,实现办公自动化。本文将深入探讨基于C#.NET技术构建的OA系统及其核心功能——文档管理...
【标题】"J2EE oa.zip_j2ee oa_java oa_oa j2ee_oaj2ee下载" 提供的是一个基于J2EE平台的办公自动化(OA)系统的压缩包资源。OA系统通常用于企业内部,以提升工作效率,实现文档管理、工作流程自动化、任务分配等...
【OA.rar_OA 源码_asp.net oa_c/s oa_oa c】是一个关于C#编程语言开发的办公自动化(OA)系统的源代码压缩包。这个系统采用经典的客户端/服务器(C/S)架构,利用ASP.NET技术进行构建,旨在提供高效、便捷的办公流程...
在本项目中,我们关注的是一个基于Java技术的办公自动化(Office Automation,简称OA)系统。这个系统利用了Java编程语言、Tomcat应用服务器以及MySQL数据库来构建一个完整的OA解决方案。下面将详细介绍这三个核心...
**OA办公自动化系统详解** OA.zip_JSP OA_axjsp com_java oa_ssh mysql 是一个基于SSH框架的OA(Office Automation)办公自动化系统的压缩包文件。这个系统利用了Java、JSP、AxJSP以及MySQL数据库技术,旨在实现...
《ITCast OA系统详解——基于SSH框架的高效办公自动化实现》 ITCast OA是一款基于SSH(Struts2、Spring、Hibernate)技术栈开发的企业级办公自动化系统,它在2011年由ITCast团队推出的新版本,相较于之前的版本,...
【标题】"OA.rar" 是一个压缩包文件,其中包含了与Java OA(Office Automation)系统相关的源代码或文档。"java_oa_oa_oa.r"可能是项目名称或文件夹结构的一部分,暗示了这个压缩包内容是关于使用Java语言开发的企业...