OA项目11:部门列表树状显示功能及其他代码优化

首注:本学习教程为传智播客汤阳光讲师所公布的免费OA项目视频我的文字版实践笔记,本人用此来加强巩固自己开发知识,如有网友转载,请注明。谢谢。

一 使用递归使部门列表树状显示:

  1.写一个工具类,实现通过顶级部门查询所有,具体如下:  

  

 1 package cn.clear.oa.util;
 2
 3 import java.util.ArrayList;
 4 import java.util.Collection;
 5 import java.util.List;
 6
 7 import cn.clear.oa.domain.Department;
 8
 9 public class DepartmentUtil {
10     //遍历部门树,把所有部门遍历出来以树状显示
11     public static List<Department> getAllDepartments(List<Department> topList) {
12         List<Department> departments = new ArrayList<Department>();
13         walkDepartmentTreeList(topList,"┣ ",departments);
14         return departments;
15     }
16
17     private static void walkDepartmentTreeList(Collection<Department> topList,String prefix, List<Department> departments){
18
19         for (Department top : topList) {
20             Department copy = new Department();//创建副本,不要使用在Session的原对象
21             //遍历顶点
22             copy.setId(top.getId());
23             copy.setName(prefix + top.getName());
24             departments.add(copy);
25             //遍历子树
26             walkDepartmentTreeList(top.getChildren()," "+prefix,departments);
27         }
28     }
29 }

DepartmentUtil.java

  2.因为部门列表在新建页面和修改页面存在,所有修改新建页面和修改页面的action,如下:

  

1 public String addUI() throws Exception {
2         // 准备departmentList数据
3         List<Department> topList = departmentService.findTopList();
4         List<Department> departmentList = DepartmentUtil
5                 .getAllDepartments(topList);
6         // 放在值栈中的map中
7         ActionContext.getContext().put("departmentList", departmentList);
8         return "saveUI";
9     }

addUI()

  

 1 public String editUI() throws Exception {
 2         // 准备departmentList数据
 3         List<Department> topList = departmentService.findTopList();
 4         List<Department> departmentList = DepartmentUtil
 5                 .getAllDepartments(topList);
 6         // 放在值栈中的map中
 7         ActionContext.getContext().put("departmentList", departmentList);
 8
 9         Department department = departmentService.findById(model.getId());
10         // 将对象放在栈顶
11         ActionContext.getContext().getValueStack().push(department);
12         // 回显上级部门
13         if (department.getParent() != null) {
14             parentId = department.getParent().getId();
15         }
16         return "saveUI";
17     }

editUI()

  3.发现树形列表的顺序混乱(即刷新会改变顺序),这是因为在hibernate映射文件中使用了set集合,是无序的,要使得按顺序排列,那么修改映射文件,在查询子部门列表集合时增加一个order-by="id ASC"标签,这个标签的值应该是sql的排序语句,具体如下:

  查询子列表(Department.hbm.xml)

二 对所有jsp页面进行优化:

  将所有公共的jsp导入代码抽取到一个新的页面,之后只要引用该新页面即可,不用再在每个页面进行多次导入操作了。

  新页面commons.jspf:

  

1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
2 <%@ taglib prefix="s" uri="/struts-tags"%>
3     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
4     <script language="javascript" src="${pageContext.request.contextPath}/script/jquery.js"></script>
5     <script language="javascript" src="${pageContext.request.contextPath}/script/pageCommon.js" charset="utf-8"></script>
6     <script language="javascript" src="${pageContext.request.contextPath}/script/PageUtils.js" charset="utf-8"></script>
7     <link type="text/css" rel="stylesheet" href="${pageContext.request.contextPath}/style/blue/pageCommon.css" />
8     <script type="text/javascript">
9     </script>

commons.jspf

  其他页面的和commons.jspf代码相同的全部删除,然后在页面中设置一个包含标签,将commons页面引入即可:

  <%@ include file="/WEB-INF/jsp/public/commons.jspf" %>

三 抽取后台action的相同代码,放到BaseAction.java中,在使用时只要继承该类即可:

  1.建立BaseAction.java:

  

 1 package cn.clear.oa.base;
 2
 3 import java.lang.reflect.ParameterizedType;
 4
 5 import javax.annotation.Resource;
 6
 7 import cn.clear.oa.service.DepartmentService;
 8 import cn.clear.oa.service.RoleService;
 9
10 import com.opensymphony.xwork2.ActionSupport;
11 import com.opensymphony.xwork2.ModelDriven;
12
13 @SuppressWarnings("unchecked")
14 public abstract class BaseAction<T> extends ActionSupport implements
15 ModelDriven<T> {
16
17     /**
18      *
19      */
20     private static final long serialVersionUID = 1L;
21     //=======================ModelDriven的支持==========================
22     protected T model;
23
24     public BaseAction(){
25
26         try {
27         //通过反射获取model的真实类型
28         ParameterizedType pt = (ParameterizedType) this.getClass().getGenericSuperclass();
29
30         Class<T> clazz = (Class<T>) pt.getActualTypeArguments()[0];
31         //通过反射创建model的实例
32             model = clazz.newInstance();
33         } catch (Exception e) {
34             // TODO Auto-generated catch block
35             throw new RuntimeException(e);
36         }
37     }
38
39     public T getModel() {
40         // TODO Auto-generated method stub
41         return model;
42     }
43
44
45     //=========================Service的声明============================
46     @Resource
47     protected RoleService roleService;
48     @Resource
49     protected DepartmentService departmentService;
50 }

BaseAction.java

  2.在具体action中将与BaseAction.java相同的代码去除,指定具体action只继承BaseAction即可,这样在action就可以专注自己的代码了。

四 将Dao层和Service层代码结合在Service层,减少两层间的重用代码:

  1.将Dao层所有代码(包括实现类)全部删除;

  2.此时因为Dao层已经消亡,所以将BaseDao.java及BaseDaoImpl.java名字改为DaoSupport.java及DaoSupportImpl.java,以告知这是Dao数据库操作支持;

  3.将Service层的接口类直接实现DaoSupport.java,将Service层的实现类继承DaoSupportImpl.java,并将所有重复的业务代码删除即可。

  以下就是修改后的整体结构图:

  

五 修改以上后测试发现无法修改和删除实体,究其原因是因为Service的实现类开启事务方法是使用@Transactional注解,但是Service的实现类继承自DaoSupportImpl.java,而该类是无法使用子类的事务,所以解决的方法是在DaoSupportImpl.java中也使用该注解开启事务,此注解可以继承,即子类可以字节使用父类开启的事务,所以在Service的实现类中可以将该注解移除。修改完之后开启服务器测试,Ok。

时间: 2024-10-11 12:19:32

OA项目11:部门列表树状显示功能及其他代码优化的相关文章

OA项目之部门管理的功能实现

1.部门管理和岗位管理的功能实现是差不多的,首先看下都有哪些功能如图:(这里需要注意的比如如何显示上级部门?在添加的时候如何以树的结构来显示?等等需要非常注意的,本人在这其中遇到很多很多的错误,修改找错大改半天的时间,真的是看起来容易,动起手来都是错!!) 2.分析完功能,首先要做的就是几个请求?需要几个页面?需要几个方法?知道了以后先写DepartmentAction 解释:其中list方法是显示数据库中的相关数据,包括上级部门,上级部门是通过parent.name属性获取的,等下在jsp页面

OA项目9:部门管理的上下级部门的功能实现

首注:本学习教程为传智播客汤阳光讲师所公布的免费OA项目视频我的文字版实践笔记,本人用此来加强巩固自己开发知识,如有网友转载,请注明.谢谢. 一 功能分析: 1,列表页面只显示一层的(同级的)部门数据,默认显示最顶级的部门列表. 2,点击部门名称,可以查看此部门相应的下级部门列表. 3,删除部门时,同时删除此部门的所有下级部门. 4,上级部门的列表是有层次结构的(树形). 5,如果是修改:上级部门列表中不能显示当前修改的部门及其子孙部门.因为不能选择自已或自已的子部门作为上级部门. 二 首先,将

OA项目10:部门管理的三个细节的实现

部门管理遗留三个细节问题,及其处理方法: 1.当选择了子部门列表,希望增加返回上一级按钮,点击可以回到上一级的部门列表: 1)在list页面添加返回上一级按钮(在新建按钮后面),如下: <s:a action="department_list?parentId=%{#parent.parent.id}"><img src="${pageContext.request.contextPath}/style/blue/images/button/ReturnTo

部门下拉框的树状结构展示小功能的实现

在OA项目中部门管理模块中,添部门需要选择上级部门,此时如果直接将所有的部门从数据库中查询出来,让用户选择是可以的,但是显示出来的效果,不是很友好,这样会导致用户体验不好,因此在这里,我们可以一个小技巧来实现一个好的显示效果,那就是简单的树状结构,如图: 改进前: 改进后: 这是页面的显示效果,因此很有可能大家会从jsp页面下手,但是仔细想想这样会较为麻烦,比较标签的操作不是web后台程序员擅长,同时在jsp中实现该功能并不容易,因此可以考虑在给jsp发送数据之前就将其排序完成,此时就涉及到遍历

12天OA项目

OA(Office Automation):办公自动化--辅助管理,提高办公效率的系统. OA的功能: 文字处理,申请审批,办公用品管理,公文管理,会议管理,资料管理,知识管理,电子邮件等... 根据用户实际需求确定实际项目的功能. BBS--论坛 CRM--客户关系管理系统 CMS--内容管理系统 1.软件开发的简单步骤: <1.需求分析 <2.分析设计 <3.编码实现 <4.测试验证(修改) <5.部署与后期维护 2.每个步骤具体要做什么,谁来做? 3.我们要做什么? 设

HDU 5869 Different GCD Subarray Query (GCD种类预处理+树状数组维护)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5869 问你l~r之间的连续序列的gcd种类. 首先固定右端点,预处理gcd不同尽量靠右的位置(此时gcd种类不超过loga[i]种). 预处理gcd如下代码,感觉真的有点巧妙... 1 for(int i = 1; i <= n; ++i) { 2 int x = a[i], y = i; 3 for(int j = 0; j < ans[i - 1].size(); ++j) { 4 int g

PHP+jquery 树状菜单

本项目开发过程中涉及树状菜单,于是做如下分享菜单实现 不足之处请大牛指点并见谅(如图) 1:数据表涉及字段 `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '系统菜单ID', `pid` int(10) DEFAULT NULL COMMENT '父级ID', `name` varchar(200) DEFAULT NULL COMMENT '菜单名称', `params` varchar(200) DEFAULT NULL COMME

【BZOJ】2434: [Noi2011]阿狸的打字机 AC自动机+树状数组+DFS序

[题意]阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机.打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P'两个字母. 经阿狸研究发现,这个打字机是这样工作的: l 输入小写字母,打字机的一个凹槽中会加入这个字母(这个字母加在凹槽的最后). l 按一下印有'B'的按键,打字机凹槽中最后一个字母会消失. l 按一下印有'P'的按键,打字机会在纸上打印出凹槽中现有的所有字母并换行,但凹槽中的字母不会消失. 我们把纸上打印出来的字符串从1开始顺序编号,一直到n.打字机有一个非

系统管理模块_部门管理_设计(映射)本模块中的所有实体并总结设计实体的技巧_懒加载异常问题_树状结构

系统管理模块_部门管理_设计本模块中的所有实体并总结设计实体的技巧 设计实体流程 1,有几个实体? 一般是一组增删改查对应一个实体. 2,实体之间有什么关系? 一般是页面引用了其他的实体时,就表示与这个实体有关联关系. 3,每个实体中都有什么属性? 1,主键.推荐使用代理主键 2,关联关系属性.在类图中,关联关系是一条线,有两端,每一端对应一个表达此关联关系的属性.有几个端指向本类,本类中就有几个关联关系属性. 3,一般属性.分析所有有关的页面,找出表单中要填写的或是在显示页面中要显示的信息等.