• 页面左侧可收缩菜单案例


    思维导图:

    页面效果:

    思维导图的事项,有些可以并行有些要串行,视情况而定,做完一部分测试一部分,慢慢来。

    1.创建数据库:

     create database menudemo; 

    2.创建表:

    1 CREATE TABLE menu (
    2   id int(11) NOT NULL auto_increment,
    3   linkURL varchar(255) default NULL,
    4   menuName varchar(255) default NULL,
    5   parent_id int(11) default NULL,
    6   PRIMARY KEY  (id),
    7   KEY FK33155F9A1787B5 (parent_id),
    8   CONSTRAINT FK33155F9A1787B5 FOREIGN KEY (parent_id) REFERENCES menu (id)
    9 )

    好吧,其实这是hibernate自动生成的。id,linkURL,menuName,parent_id这些基本字段,再加上 parent_id 和 id的外键映射。

    测试数据后面自动生成。

    3.导入hibernate框架,本次用的是hiberante 3.3.2版本,具体过程:

      1)先加入hibernate3.jar、required 下面的jar包

      2) 再加入 annotation 下的包:hibernate-annotations.jar、ejb3-persistence.jar、hibernate-commons-annotations.jar

      3)为了看输出的SQL语句:加入log4j、slf4j-log4j12-1.5.8.jar、log4j.properties

      4)数据库驱动

      5)新建 hibernate.cfg.xml,从api中考进来,改改配置(connection,方言,show_sql,ddlhbm)

      6) 新建一个 pojo ,测试一下是否能生成表了,成功就可以了。

    4.编写Menu 类、配置树状映射:

    Menu:one-to-many FetchType 设为 EAGER,不然json数据生成由于懒加载会出问题

     1 package com.shawn.bean;
     2 
     3 import java.io.Serializable;
     4 import java.util.ArrayList;
     5 import java.util.List;
     6 
     7 import javax.persistence.CascadeType;
     8 import javax.persistence.Entity;
     9 import javax.persistence.FetchType;
    10 import javax.persistence.GeneratedValue;
    11 import javax.persistence.Id;
    12 import javax.persistence.JoinColumn;
    13 import javax.persistence.ManyToOne;
    14 import javax.persistence.OneToMany;
    15 import javax.persistence.Table;
    16 
    17 @Entity
    18 @Table(name="menu")
    19 public class Menu implements Serializable{
    20     
    21     private static final long serialVersionUID = -7798302038641404427L;
    22 
    23     private Integer id;
    24     
    25     //菜单名
    26     private String menuName;
    27     
    28     //链接URL
    29     private String linkURL;
    30     
    31     //子节点(Menu集合)
    32     private List<Menu> children = new ArrayList<Menu>();
    33     
    34     //父节点(Menu)
    35     private transient Menu parent;
    36 
    37     @Id
    38     @GeneratedValue
    39     public Integer getId() {
    40         return id;
    41     }
    42 
    43     public void setId(Integer id) {
    44         this.id = id;
    45     }
    46 
    47     public String getMenuName() {
    48         return menuName;
    49     }
    50 
    51     public void setMenuName(String menuName) {
    52         this.menuName = menuName;
    53     }
    54 
    55     @OneToMany(cascade=CascadeType.ALL,mappedBy="parent",fetch=FetchType.EAGER)
    56     public List<Menu> getChildren() {
    57         return children;
    58     }
    59 
    60     public void setChildren(List<Menu> children) {
    61         this.children = children;
    62     }
    63 
    64     @ManyToOne(fetch=FetchType.EAGER)
    65     @JoinColumn(name="parent_id")
    66     public Menu getParent() {
    67         return parent;
    68     }
    69 
    70     public void setParent(Menu parent) {
    71         this.parent = parent;
    72     }
    73 
    74     public String getLinkURL() {
    75         return linkURL;
    76     }
    77 
    78     public void setLinkURL(String linkURL) {
    79         this.linkURL = linkURL;
    80     }
    81     
    82 }

    5.造测试数据,测试bean

    测试类:

      1 package com.shawn.bean;
      2 
      3 import java.util.ArrayList;
      4 
      5 import org.hibernate.Query;
      6 import org.hibernate.Session;
      7 import org.hibernate.SessionFactory;
      8 import org.hibernate.cfg.AnnotationConfiguration;
      9 import org.hibernate.tool.hbm2ddl.SchemaExport;
     10 import org.junit.After;
     11 import org.junit.Before;
     12 import org.junit.Test;
     13 
     14 public class MenuTest {
     15     private static SessionFactory sf = null;
     16     
     17     @Before
     18     public void before(){
     19         sf = new AnnotationConfiguration().configure().buildSessionFactory();
     20     }
     21     
     22     @After
     23     public void after(){
     24         if(sf != null){
     25             sf.close();
     26         }
     27     }
     28     
     29     @Test
     30     public void testSchemaExport(){
     31         new SchemaExport(new AnnotationConfiguration().configure()).create(false, true);
     32     }
     33     
     34     @Test
     35     public void testMenuSave(){
     36         
     37         /*=========================日常管理=========================*/
     38         
     39         Menu richang = new Menu();//日常管理
     40         richang.setParent(null);
     41         richang.setMenuName("日常管理");
     42         richang.setLinkURL(null);
     43         
     44         Menu huiyi = new Menu();//会议管理
     45         huiyi.setParent(richang);
     46         huiyi.setMenuName("会议管理");
     47         huiyi.setLinkURL("pages/richang/metting_index.jsp");
     48         
     49         Menu gonggao = new Menu();//公告管理
     50         gonggao.setParent(richang);
     51         gonggao.setMenuName("公告管理");
     52         gonggao.setLinkURL("pages/richang/bbc_index.jsp");
     53         
     54         richang.getChildren().add(huiyi);
     55         richang.getChildren().add(gonggao);
     56         
     57         /*=========================考勤管理=========================*/
     58         
     59         Menu kaoqing = new Menu();//考勤管理
     60         kaoqing.setParent(null);
     61         kaoqing.setMenuName("考勤管理");
     62         kaoqing.setLinkURL(null);
     63         
     64         Menu waichu = new Menu();
     65         waichu.setParent(kaoqing);
     66         waichu.setMenuName("外出登记");
     67         waichu.setLinkURL("pages/kaoqing/waichu.jsp");
     68         
     69         Menu qingjia = new Menu();
     70         qingjia.setParent(kaoqing);
     71         qingjia.setMenuName("请假登记");
     72         qingjia.setLinkURL("pages/kaoqing/qingjia.jsp");
     73         
     74         Menu chuchai = new Menu();
     75         chuchai.setParent(kaoqing);
     76         chuchai.setMenuName("出差登记");
     77         chuchai.setLinkURL("pages/kaoqing/chuchai.jsp");
     78         
     79         Menu shangxiaban = new Menu();
     80         shangxiaban.setParent(kaoqing);
     81         shangxiaban.setMenuName("上下班登记");
     82         shangxiaban.setLinkURL("pages/kaoqing/shangxiaban.jsp");
     83         
     84         Menu shangban = new Menu();//上班登记
     85         shangban.setParent(shangxiaban);
     86         shangban.setMenuName("上班登记");
     87         shangban.setLinkURL("pages/kaoqing/shangban.jsp");
     88         
     89         Menu xiaban = new Menu();//下班登记
     90         xiaban.setParent(shangxiaban);
     91         xiaban.setMenuName("下班登记");
     92         xiaban.setLinkURL("pages/kaoqing/xiaban.jsp");
     93         
     94         shangxiaban.getChildren().add(shangban);
     95         shangxiaban.getChildren().add(xiaban);
     96         
     97         kaoqing.getChildren().add(waichu);
     98         kaoqing.getChildren().add(qingjia);
     99         kaoqing.getChildren().add(chuchai);
    100         kaoqing.getChildren().add(shangxiaban);
    101         /*=========================计划制定=========================*/
    102         
    103         Menu jihua = new Menu();//计划制定
    104         jihua.setParent(null);
    105         jihua.setMenuName("计划制定");
    106         jihua.setLinkURL(null);
    107         
    108         Menu qiyePlan = new Menu();
    109         qiyePlan.setParent(jihua);
    110         qiyePlan.setMenuName("企业计划");
    111         qiyePlan.setLinkURL("pages/jihua/qiyePlan.jsp");
    112         
    113         Menu bumenPlan = new Menu();
    114         bumenPlan.setParent(jihua);
    115         bumenPlan.setMenuName("部门计划");
    116         bumenPlan.setLinkURL("pages/jihua/bumenPlan.jsp");
    117         
    118         Menu gerenPlan = new Menu();
    119         gerenPlan.setParent(jihua);
    120         gerenPlan.setMenuName("个人计划");
    121         gerenPlan.setLinkURL("pages/jihua/gerenPlan.jsp");
    122         
    123         jihua.getChildren().add(qiyePlan);
    124         jihua.getChildren().add(bumenPlan);
    125         jihua.getChildren().add(gerenPlan);
    126         /*=========================审核管理=========================*/
    127         
    128         Menu shenhe = new Menu();//审核管理
    129         shenhe.setParent(null);
    130         shenhe.setMenuName("审核管理");
    131         shenhe.setLinkURL(null);
    132         
    133         Menu fbApply = new Menu();
    134         fbApply.setParent(shenhe);
    135         fbApply.setMenuName("发布申请");
    136         fbApply.setLinkURL("pages/shenhe/fbApply.jsp");
    137         
    138         Menu shenheApply = new Menu();
    139         shenheApply.setParent(shenhe);
    140         shenheApply.setMenuName("审核批示");
    141         shenheApply.setLinkURL("pages/shenhe/shenheApply.jsp");
    142         
    143         shenhe.getChildren().add(fbApply);
    144         shenhe.getChildren().add(shenheApply);
    145         
    146         /*=========================员工管理=========================*/
    147         
    148         Menu memManage = new Menu();//员工管理
    149         memManage.setParent(null);
    150         memManage.setMenuName("员工管理");
    151         memManage.setLinkURL(null);
    152         
    153         Menu memAdd = new Menu();
    154         memAdd.setParent(memManage);
    155         memAdd.setMenuName("员工添加");
    156         memAdd.setLinkURL("pages/yuangong/memAdd.jsp");
    157         
    158         Menu memUpdate = new Menu();
    159         memUpdate.setParent(memManage);
    160         memUpdate.setMenuName("员工维护");
    161         memUpdate.setLinkURL("pages/yuangong/memUpdate.jsp");
    162         
    163         memManage.getChildren().add(memAdd);
    164         memManage.getChildren().add(memUpdate);
    165         
    166         /*=========================通讯管理=========================*/
    167         
    168         Menu tongxun = new Menu();//通讯管理
    169         tongxun.setParent(null);
    170         tongxun.setMenuName("通讯管理");
    171         tongxun.setLinkURL(null);
    172         
    173         Menu tongxun_xianshi = new Menu();
    174         tongxun_xianshi.setParent(tongxun);
    175         tongxun_xianshi.setMenuName("显示通讯组");
    176         tongxun_xianshi.setLinkURL("pages/tongxun/tongxun_xianshi.jsp");
    177         
    178         Menu tongxun_tianjia = new Menu();
    179         tongxun_tianjia.setParent(tongxun);
    180         tongxun_tianjia.setMenuName("增加通讯详细信息");
    181         tongxun_tianjia.setLinkURL("pages/tongxun/tongxun_add.jsp");
    182         
    183         tongxun.getChildren().add(tongxun_xianshi);
    184         tongxun.getChildren().add(tongxun_tianjia);
    185         
    186         Session session = sf.getCurrentSession();
    187         session.beginTransaction();
    188         
    189         session.save(richang);
    190         session.save(kaoqing);
    191         session.save(jihua);
    192         session.save(shenhe);
    193         session.save(memManage);
    194         session.save(tongxun);
    195         
    196         session.getTransaction().commit();
    197     }
    198     
    199     @Test
    200     public void testLoad(){
    201         
    202         Session session = sf.getCurrentSession();
    203         session.beginTransaction();
    204         Query query = session.createQuery("from Menu t where t.parent.id is null");
    205         //递归输出所有节点
    206         ArrayList<Menu> list = (ArrayList<Menu>)query.list();
    207         for(Menu menu : list){
    208             System.out.println(menu.getMenuName());
    209             print(menu,0);
    210         }
    211         session.getTransaction().commit();
    212     }
    213     
    214     //输出方法
    215     private void print(Menu menu,int level) {
    216         String preStr = "";
    217         for(int i=0;i<level;i++){
    218             preStr += "----|";
    219         }
    220         
    221         System.out.println(preStr + menu.getMenuName());
    222         for(Menu m:menu.getChildren()){
    223             //如果有子节点,则继续往下递归
    224             print(m,level+1);
    225         }
    226     }
    227 }
    View Code

    造好数据,插入。

    6.编写DAO类,用HQL查询,返回List<Menu>,获取所有的一级菜单,由于是FetchType.EAGER,所以所有数据是连根拔起了。

    DAO类:

     1 package com.shawn.dao;
     2 
     3 import java.util.ArrayList;
     4 import java.util.List;
     5 
     6 import org.hibernate.Query;
     7 import org.hibernate.Session;
     8 
     9 import com.shawn.bean.Menu;
    10 
    11 public class MenuDAO {
    12     
    13     @SuppressWarnings("unchecked")
    14     public List<Menu> getAllMenu(Session session){
    15         List<Menu> list = null;
    16         Query query = session.createQuery("from Menu t where t.parent.id is null");
    17         list = (ArrayList<Menu>)query.list();
    18         return list;
    19     }
    20     
    21 }
    View Code

    7.Service 类:

     1 package com.shawn.service;
     2 
     3 import java.lang.reflect.Type;
     4 import java.util.List;
     5 
     6 import org.hibernate.Session;
     7 import org.hibernate.SessionFactory;
     8 
     9 import com.google.gson.Gson;
    10 import com.google.gson.GsonBuilder;
    11 import com.google.gson.reflect.TypeToken;
    12 import com.shawn.bean.Menu;
    13 import com.shawn.dao.MenuDAO;
    14 import com.shawn.util.HibernateUtil;
    15 
    16 public class GetMenuService {
    17     
    18     public List<Menu> getMenu(){
    19         List<Menu> menus = null;
    20         SessionFactory sf = HibernateUtil.getSessionFactory();
    21         Session session = sf.getCurrentSession();
    22         session.beginTransaction();
    23         
    24         MenuDAO dao = new MenuDAO();
    25         menus = dao.getAllMenu(session);
    26 //        Gson gson = new GsonBuilder().setPrettyPrinting().create();
    27 //        Type complexType = new TypeToken<List<Menu>>() {}.getType();
    28 //        String reljson = gson.toJson(menus,complexType);
    29 //        System.out.println(reljson);
    30         session.getTransaction().commit();
    31         return menus;
    32     }
    33     
    34 }
    View Code

    9.导入 Struts1,这里不再详述。

      Action 类:

     1 package com.shawn.action;
     2 
     3 import java.lang.reflect.Type;
     4 import java.util.List;
     5 
     6 import javax.servlet.http.HttpServletRequest;
     7 import javax.servlet.http.HttpServletResponse;
     8 
     9 import org.apache.struts.action.Action;
    10 import org.apache.struts.action.ActionForm;
    11 import org.apache.struts.action.ActionForward;
    12 import org.apache.struts.action.ActionMapping;
    13 
    14 import com.google.gson.Gson;
    15 import com.google.gson.GsonBuilder;
    16 import com.google.gson.reflect.TypeToken;
    17 import com.shawn.bean.Menu;
    18 import com.shawn.service.GetMenuService;
    19 
    20 public class IndexAction extends Action {
    21     
    22     @Override
    23     public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request,
    24             HttpServletResponse response) throws Exception {
    25         GetMenuService service = new GetMenuService();
    26         //获取菜单列表
    27         Gson gson = new GsonBuilder().setPrettyPrinting().create();
    28         Type complexType = new TypeToken<List<Menu>>() {}.getType();
    29         List<Menu> menus = service.getMenu();
    30         String reljson = gson.toJson(menus,complexType);
    31         System.out.println(reljson);
    32         request.getSession().setAttribute("menusJson", reljson);
    33         return mapping.findForward("main");
    34     }
    35     
    36 }
    View Code

      Struts-config.xml:

     1 <?xml version="1.0" encoding="UTF-8" ?>
     2 
     3 <!DOCTYPE struts-config PUBLIC
     4           "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN"
     5           "http://struts.apache.org/dtds/struts-config_1_3.dtd">
     6 
     7 <struts-config>
     8 
     9 
    10     <form-beans>
    11     </form-beans>
    12 
    13 <!-- =========================================== Global Forward Definitions -->
    14 
    15     <global-forwards>
    16         <!-- Default forward to "Welcome" action -->
    17         <!-- Demonstrates using index.jsp to forward -->
    18         <forward
    19             name="welcome"
    20             path="/Welcome.do"/>
    21     </global-forwards>
    22 
    23 
    24 <!-- =========================================== Action Mapping Definitions -->
    25 
    26     <action-mappings>
    27             <!-- Default "Welcome" action -->
    28             <!-- Forwards to Welcome.jsp -->
    29         <action
    30             path="/Welcome"
    31             forward="/pages/Welcome.jsp"/>
    32             
    33         <action path="/index" type="com.shawn.action.IndexAction">
    34             <forward name="main" path="/pages/default.jsp" redirect="false"/>
    35         </action>
    36 
    37     <!-- sample input and input submit actions
    38 
    39         <action
    40             path="/Input"
    41             type="org.apache.struts.actions.ForwardAction"
    42             parameter="/pages/Input.jsp"/>
    43 
    44         <action
    45             path="/InputSubmit"
    46             type="app.InputAction"
    47             name="inputForm"
    48             scope="request"
    49             validate="true"
    50             input="/pages/Input.jsp"/>
    51 
    52             <action
    53                 path="/edit*"
    54                 type="app.Edit{1}Action"
    55                 name="inputForm"
    56                 scope="request"
    57                 validate="true"
    58                 input="/pages/Edit{1}.jsp"/>
    59 
    60     end samples -->
    61     </action-mappings>
    62 
    63 </struts-config>
    View Code

    10.编写JSP页面(主页用frameset布局,这里贴出主要的left.jsp页面)

      left.jsp:

      1 <%@ page language="java" contentType="text/html; charset=UTF-8"
      2     pageEncoding="UTF-8"%>
      3 <%@ page import="java.util.List,java.util.ArrayList,com.shawn.bean.Menu" %>
      4 <%
      5     String path = request.getContextPath();
      6     String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
      7 %>
      8 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
      9 <html>
     10 <base href="<%=basePath %>"/>
     11 <head>
     12 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
     13 <title>首頁</title>
     14 <link style="text/css" href="css/common.css" rel="stylesheet"/>
     15 <style type="text/css">
     16 .menuTree{ margin-left:-30px;}
     17 .menuTree div{ padding-left:30px;}
     18 .menuTree div ul{ overflow:hidden; display:none; height:auto;}
     19 .menuTree span{ display:block; height:25px; line-height:25px; padding-left:5px; margin:1px 0; cursor:pointer; border-bottom:1px solid #CCC;}
     20 .menuTree span:hover{ background-color:#e6e6e6; color:#cf0404;}
     21 .menuTree a{ color:#333; text-decoration:none;}
     22 .menuTree a:hover{ color:#06F;}
     23 .btn{ height:30px; margin-top:10px; border-bottom:1px solid #CCC;}
     24 </style>
     25 <script type="text/javascript" src="lib/jquery-1.11.1/jquery.min.js"></script>
     26 </head>
     27 <body>
     28 <div class="btn">
     29 <input name="" type="button" id="btn_open" value="全部展开" />&nbsp;&nbsp;
     30 <input name="" type="button" id="btn_close" value="全部收缩" />
     31 </div>
     32 <div id="menuTree" class="menuTree"></div>
     33 </body>
     34 <script type="text/javascript">
     35 <%
     36     String menusJson = (String)session.getAttribute("menusJson");
     37 %>
     38  var json = <%=menusJson%>;
     39 /*递归实现获取无级树数据并生成DOM结构*/
     40 var str = "";
     41 var forTree = function(o){
     42  for(var i=0;i<o.length;i++){
     43  var urlstr = "";
     44  try{
     45  if(typeof o[i]["linkURL"] == "undefined"){
     46  urlstr = "<div><span>"+ o[i]["menuName"] +"</span><ul>";
     47  }else{
     48  urlstr = "<div><span><a href='"+ o[i]["linkURL"] +"' target='right'>"+ o[i]["menuName"] +"</a></span><ul>"; 
     49  }
     50  str += urlstr;
     51  if(o[i]["children"] != null && o[i]["children"] != ""){
     52  forTree(o[i]["children"]);
     53  }
     54  str += "</ul></div>";
     55  }catch(e){}
     56  }
     57  return str;
     58 }
     59 /*添加无级树*/
     60 document.getElementById("menuTree").innerHTML = forTree(json);
     61 /*树形菜单*/
     62 var menuTree = function(){
     63      //给有子对象的元素加[+-]
     64      $("#menuTree ul").each(function(index, element) {
     65          var ulContent = $(element).html();
     66          var spanContent = $(element).siblings("span").html();
     67          if(ulContent){
     68              $(element).siblings("span").html("[+] " + spanContent);
     69          }
     70      });
     71      
     72      $("#menuTree").find("div span").click(function(){
     73          var ul = $(this).siblings("ul");
     74          var spanStr = $(this).html();
     75          var spanContent = spanStr.substr(3,spanStr.length);
     76          if(ul.find("div").html() != null){
     77              if(ul.css("display") == "none"){
     78                  ul.show(300);
     79                  $(this).html("[-] " + spanContent);
     80              }else{
     81                  ul.hide(300);
     82                  $(this).html("[+] " + spanContent);
     83              }
     84          }
     85      })
     86 }()
     87 
     88 /*展开*/
     89 $("#btn_open").click(function(){
     90  $("#menuTree ul").show(300);
     91  curzt("-");
     92 })
     93 /*收缩*/
     94 $("#btn_close").click(function(){
     95  $("#menuTree ul").hide(300);
     96  curzt("+");
     97 })
     98 function curzt(v){
     99  $("#menuTree span").each(function(index, element) {
    100  var ul = $(this).siblings("ul");
    101  var spanStr = $(this).html();
    102  var spanContent = spanStr.substr(3,spanStr.length);
    103  if(ul.find("div").html() != null){
    104  $(this).html("["+ v +"] " + spanContent);
    105  }
    106  }); 
    107 }
    108 </script>
    109 </html>
    View Code

    效果就是前面的图。

    代码链接: https://pan.baidu.com/s/1cAKzmu 密码: qp5v

  • 相关阅读:
    linux 查看磁盘空间
    nginx面试中最常见的18道题
    spring -mvc service层调用工具类配置
    IntelliJ IDEA tomcat 远程Ddbug调试
    IntelliJ IDEA tomcat 热部署
    Java HttpClient PostMethod
    Java Base64 加密/解密
    启动tomcat时cmd窗口一闪而过
    remote staging type or host is not specified
    Maven更新后本地仓库jar后缀带有 lastUpdated
  • 原文地址:https://www.cnblogs.com/ShawnYang/p/6803675.html
Copyright © 2020-2023  润新知