今天用所学的知识做了一个公司的结构管理,并采用pager-taglib做了一个分页。
点击总公司,下面会有好多分公司,分公司下面还有好多部门。
下面说一下具体的实现过程:
1.数据库设计。在数据库设计中有parent_id这样一个字段。主要标志它的父级机构的id。总公司的parent_id为空,分公司的parent_id为总公司的id,这样就可以用一个表实现公司结构的分机管理。
2.使用Hibernate中的关联对象,自己关联自己,来是实现这个功能。
具体在Org实体类总书写了关联属性,如下:
private Org parent;//关联对象
private Set<Org> children;
在映射文件总书写关联映射:
<many-to-one name="parent" column="parent_id" class="Org"/>
<set name="children" order-by="total">
<key column="parent_id"/>
<one-to-many class="Org"/>
</set>
3.实现类。采用hql语句分别查询在各种情况下的具体数据和数量(一级菜单下的具体数据和数量、二级....)。
最后把查询的结果返回给分页组件。主要代码如下:
if(pid==null){
hql="from Org where parent.id is null";
countHql="select count(*) from Org where parent.id is null";
query=session.createQuery(hql);
countQuery=session.createQuery(countHql);
}else{
hql="from Org where parent.id=?";
countHql="select count(*) from Org where parent.id=?";
query=session.createQuery(hql).setParameter(0, pid);
countQuery=session.createQuery(countHql).setParameter(0, pid);
}
List<Org> rows=query.setFirstResult(offset).setMaxResults(pageSize).list();
int total=Integer.parseInt(countQuery.uniqueResult().toString());
pager.setRows(rows);
pager.setTotal(total);
return pager;
if里面的主要是查询一级菜单,第一句hql查询具体数据,第二条查询数量,else里面查询子菜单,hql语句和上面类似。最后根据具体结果给分页组件传递参数,完成分页。
4.分页。主要采用pager-taglib组件完成。具体代码如下:
<pg:pager url="listOrg" items="${pager.total }" maxPageItems="${pager.pageSize }" export="curr=pageNumber">
<pg:param name="id" value="${param.id}"/>
<pg:first>
<a href="${pageUrl}">首页</a>
</pg:first>
<pg:prev>
<a href="${pageUrl }">上一页</a>
</pg:prev>
<pg:pages>
<c:choose>
<c:when test="${curr==pageNumber}">
<span style='color:red'>${pageNumber }</span>
</c:when>
<c:otherwise>
<a href="${pageUrl }">${pageNumber }</a>
</c:otherwise>
</c:choose>
</pg:pages>
<pg:next>
<a href="${pageUrl }">下一页</a>
</pg:next>
<pg:last>
<a href="${pageUrl }">尾页</a>
</pg:last>
</pg:pager>
在添加好jar包的情况下注解使用上面的代码,修改相关参数就能完成分页。