今天用所学的知识做了一个公司的结构管理,并采用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包的情况下注解使用上面的代码,修改相关参数就能完成分页。