EJB项目:角色授权(三)

本文介绍了一种使用jQuery和Ajax实现的权限管理系统,通过前台与后台交互来为角色添加或删除权限。文章详细展示了如何利用jQuery发起get请求调用后台方法,并探讨了解决懒加载初始化异常的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

修改权限,包括给该角色添加权限和删除权限。

添加删除权限,此处使用jquery,调用后台Action中的方法。

初步功能性测试,代码如下:

//jquery添加删除权限(修改权限)
function permission(chk) {
	var roleId = <%=roleId%>;
	var menuId = chk.id;
	$.get("permissionAction!grantPermission?roleId=" + roleId + "&menuId=" + menuId + "¶m=" + chk.checked, function(data, status){
	});	
}
Action中的方法:

	/**
	 * 授权
	 */
	public void grantPermission() {
		int roleId = Integer.parseInt(request.getParameter("roleId"));
		int menuId = Integer.parseInt(request.getParameter("menuId"));
		boolean param = Boolean.parseBoolean(request.getParameter("param"));
		
		//角色
		LinkedHashMap<String, String> orderBy = new LinkedHashMap<String, String>();
		orderBy.put("roleId", "DESC");
		Role role = (Role)commonQueryBean.queryAllForList(Role.class, new String[] {"roleId"}, orderBy, roleId).get(0);
		
		Set<Menu> menuSet = role.getMenus();
		if (param == true) {
			//菜单
			LinkedHashMap<String, String> orderBy2 = new LinkedHashMap<String, String>();
			orderBy2.put("menuId", "DESC");
			Menu menu = (Menu)commonQueryBean.queryAllForList(Menu.class, new String[] {"menuId"}, orderBy2, menuId).get(0);
			
			menuSet.add(menu);
			role.setMenus(menuSet);
			commonModifyBean.modifyObject(role, roleId);
		} else {
			for (Iterator iterator = menuSet.iterator(); iterator.hasNext();) {
				Menu menu2 = (Menu) iterator.next();
				if (menu2.getMenuId() == menuId) {
					menuSet.remove(menu2);
				}
			}
			role.setMenus(menuSet);
			commonModifyBean.modifyObject(role, roleId);
		}
	}

(1)ajax & jquery

ajax 即“Asynchronous JavaScript and XML”(异步JavaScript和XML)是一种技术的称呼。

jquery 封装了javascript ,实现许多现成的方法供调用,方便了开发。更有利于服务器与用户的交流。是实现ajax的 精简利器。

同样的还有extjs高度封装,比较庞大,但是减少更多的工作量。

(2)jquery的get请求,调用后台method

(3)Action授权方法编码完成,测试出现bug,Set循环时报LazyInitializationException,懒加载初始化错误。

	/**
	 * 菜单集合
	 */
	@ManyToMany(cascade=CascadeType.PERSIST,fetch = FetchType.EAGER)
	@JoinTable(name="T_Role_Menu",joinColumns={@JoinColumn(name="roleid",referencedColumnName="roleid")},
				inverseJoinColumns={@JoinColumn(name="menuid",referencedColumnName="menuid")})
	private Set<Menu> menus;


FetchType.LAZY:懒加载,加载一个实体时,定义懒加载的属性不会马上从数据库中加载。

FetchType.EAGER:急加载,加载一个实体时,定义急加载的属性会立即从数据库中加载。

比方User类有两个属性,name跟address,登录后用户名是需要显示出来的,此属性用到的几率极大,要马上到数据库查,用急加载;而用户地址大多数情况下不需要显示出来,只有在查看用户资料是才需要显示,需要用了才查数据库,用懒加载就好了。所以,并不是一登录就把用户的所有资料都加载到对象中,于是有了这两种加载模式。

(4)完善性判断

添加子的同时添加父,删除父菜单的时候提示“存在子菜单,不能删除父菜单”。

后修改如下:

//jquery添加删除权限(修改权限)
function permission(chk) {
	var roleId = <%=roleId%>;
	var menuId = chk.id;
	if(chk.checked == true) {
		//子选父必选,添加子同时添加父
		addParent(chk.value);
		$.get("permissionAction!grantPermission?roleId=" + roleId + "&menuId=" + menuId + "¶m=true", function(data, status){
		});
	} else {
		//存在子菜单,不能删除父菜单
		if(!delSon(menuId)) {
			chk.checked = true;
		} else {
			$.get("permissionAction!grantPermission?roleId=" + roleId + "&menuId=" + menuId + "¶m=false", function(data, status){
			});
		}
	}
}

//判断是否可以删除菜单,存在子菜单则不能删除
function delSon(menuId) {
	var dd = document.getElementsByName("checkbox");
	for(i=0; i<dd.length; i++) {
		if(menuId == dd[i].value) {
			alert("请先删除子菜单!");
			return false;
		}
	}
	return true;
}

//递归,循环添加父
function addParent(chkValue) {
	var pNode = document.getElementById(chkValue);
	if(pNode!=null){
		pNode.checked = true;
		$.get("permissionAction!grantPermission?roleId=" + roleId + "&menuId=" + pNode.id + "¶m=true", function(data, status){
		});
		addParent(pNode.value);
	}
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值