1,查询出角色数据
2,查询出角色对应的模块数据
3,通过关联查询,返回的数据是冗余的,会多于角色本身的数据。
--就按照关联来查询,然后使用java代码将其进行合并
--分步骤查询,先查询出角色,再遍历角色,根据每一个角色查询它对应的权限
DAO:
Action:
struts.xml
Jsp:
2,查询出角色对应的模块数据
3,通过关联查询,返回的数据是冗余的,会多于角色本身的数据。
--就按照关联来查询,然后使用java代码将其进行合并
--分步骤查询,先查询出角色,再遍历角色,根据每一个角色查询它对应的权限
Util:
/**
* 解析privileges.xml工具类
*/
public class PrivilegeReader {
// 用于存储privileges.xml的权限操作信息
private static List<Privilege> privileges = new ArrayList<Privilege>();
static {
InputStream xml = PrivilegeReader.class.getClassLoader()
.getResourceAsStream("privileges.xml");
privileges = toModuleList(xml);
}
/**
* 返回XML中所有权限数据
*
* @return
*/
public static List<Privilege> getPrivileges() {
return privileges;
}
/**
* 根据权限ID查询模块名称
*
* @param id
* @return
*/
public static String getPrivilegeNameById(Integer id) {
List<Privilege> privileges = getPrivileges();
for (Privilege privilege : privileges) {
if (privilege.getId().equals(id)) {
return privilege.getName();
}
}
return null;
}
/**
* 解析privileges.xml文件
*
* @param xml
* @return
*/
@SuppressWarnings("unchecked")
protected static List<Privilege> toModuleList(InputStream xml) {
List<Privilege> modules = new ArrayList<Privilege>();
try {
SAXReader reader = new SAXReader();
Document doc = reader.read(xml);
Element root = doc.getRootElement();
List<Element> moduleElements = root.elements("privilege");
for (Element moduleElement : moduleElements) {
Privilege module = new Privilege();
module.setId(Integer.valueOf(moduleElement.attributeValue("id")));
module.setName(moduleElement.elementText("name"));
Element urlElement = moduleElement.element("urls");
List<Element> urlElements = urlElement.elements();
List<String> urls = new ArrayList<String>();
for (Element element : urlElements) {
urls.add(element.getText());
}
module.setUrls(urls);
modules.add(module);
}
return modules;
} catch (DocumentException e) {
e.printStackTrace();
throw new RuntimeException("解析权限文件失败!", e);
}
}
}
DAO:
public List<RoleVO> findByPage(Integer page, Integer pageSize)
throws DAOException {
String sql = "select * from ("+
"select r.*, rownum n from role_info r )"+
" where n>? and n<?";
Connection con = DBUtil.getConnection();
List<RoleVO> list = new ArrayList<RoleVO>();
try {
PreparedStatement ps = con.prepareStatement(sql);
ps.setObject(1, pageSize*(page-1));
ps.setObject(2, pageSize*page+1);
ResultSet rs = ps.executeQuery();
while(rs.next()){
RoleVO vo = new RoleVO();
vo.setId(rs.getInt("id"));
vo.setName(rs.getString("name"));
String sql2 = "select privilege_id " +
"from role_privilege "+
" where role_id = ?";
PreparedStatement ps2 = con.prepareStatement(sql2);
ps2.setObject(1, vo.getId());
ResultSet rs2 = ps2.executeQuery();
String name = "";//将权限名拼成字符串,拼名称时中间用逗号隔开
while(rs2.next()){
int privilegeId = rs2.getInt(1);
//根据权限id获取权限名称
String pname = PrivilegeReader.getPrivilegeNameById(privilegeId);
name += "," +pname;
}
//第一个逗号多余将其去掉
if(name.length()>0){
name = name.replaceFirst(",", "");
}
vo.setPrivilegesNames(name);
list.add(vo);
}
} catch (SQLException e) {
e.printStackTrace();
throw new DAOException("查询角色失败", e);
} finally{
DBUtil.close();
}
return list;
}
public Integer findTotalPage(Integer pageSize) throws DAOException {
String sql = "select count(*) from role_info";
Connection con = DBUtil.getConnection();
try {
PreparedStatement ps = con.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
if(rs.next()){
int rows = rs.getInt(1);
if(rows%pageSize==0){
return rows/pageSize;
}else{
return rows/pageSize + 1;
}
}
} catch (SQLException e) {
e.printStackTrace();
throw new DAOException("查询角色总页数失败", e);
} finally{
DBUtil.close();
}
return 0;
}
Action:
public class FindRoleAction {
public String execute(){
IRoleDAO dao = DAOFactory.getRoleDAO();
try {
roleVOs = dao.findByPage(page, pageSize);
totalPage = dao.findTotalPage(pageSize);
} catch (DAOException e) {
e.printStackTrace();
return "error";
}
return "success";
}
//input
private Integer page=1;
private Integer pageSize;
//output
private List<RoleVO> roleVOs;
private Integer totalPage;
public Integer getPage() {
return page;
}
public void setPage(Integer page) {
this.page = page;
}
public Integer getPageSize() {
return pageSize;
}
public void setPageSize(Integer pageSize) {
this.pageSize = pageSize;
}
public List<RoleVO> getRoleVOs() {
return roleVOs;
}
public void setRoleVOs(List<RoleVO> roleVOs) {
this.roleVOs = roleVOs;
}
public Integer getTotalPage() {
return totalPage;
}
public void setTotalPage(Integer totalPage) {
this.totalPage = totalPage;
}
}
struts.xml
<!-- 角色管理模块配置 -->
<package name="role" extends="netctoss" namespace="/role">
<action name="findRole" class="netctoss.action.role.FindRoleAction">
<param name="pageSize">3</param>
<result name="success">
/WEB-INF/role/findRole.jsp
</result>
</action>
</package>
Jsp:
<div id="data">
<table id="datalist">
<tr>
<th>角色 ID</th>
<th>角色名称</th>
<th class="width600">拥有的权限</th>
<th class="td_modi"></th>
</tr>
<s:iterator value="roleVOs">
<tr>
<td><s:property value="id"/></td>
<td><s:property value="name"/></td>
<td><s:property value="privilegesNames"/></td>
<td>
<input type="button" value="修改" class="btn_modify" οnclick="location.href='role_modi.html';"/>
<input type="button" value="删除" class="btn_delete" οnclick="deleteRole();" />
</td>
</tr>
</s:iterator>
</table>
</div>
<!--分页-->
<div id="pages">
<s:hidden name="page" id="page"/>
<a href="javascript:toPage(1);">首页</a>
<s:if test="page==1">
<a href="#">上一页</a>
</s:if>
<s:else>
<a href="javascript:toPage(<s:property value="page-1"/>)">上一页</a>
</s:else>
<s:iterator begin="1" end="totalPage" var="p">
<s:if test="page==#p">
<a href="javascript:toPage(<s:property value="#p"/>)" class="current_page">
<s:property value="#p"/>
</a>
</s:if>
<s:else>
<a href="javascript:toPage(<s:property value="#p"/>)">
<s:property value="#p"/>
</a>
</s:else>
</s:iterator>
<s:if test="page==totalPage">
<a href="#">下一页</a>
</s:if>
<s:else>
<a href="javascript:toPage(<s:property value="page+1"/>)">下一页</a>
</s:else>
<a href="javascript:toPage(<s:property value="totalPage"/>);">末页</a>
</div>