使用java搭建简单的ligerui环境

2024-02-29 20:38

本文主要是介绍使用java搭建简单的ligerui环境,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  最近因为工作需要,学习了ligerui框架。但是,因为在公司,我们只是作为最低层的码农,所以环境都已经搭建好了,我们这些码农平时都是直接拿到工程,然后在别人的框架上不断的ctrl + c、ctrl + v,然后修修补补。所以为了摆脱这种困境,决定自己使用简单的servlet搭建一个ligerui,然后测试下ligerui这玩意到底是怎么跑起来的。

        1、下载ligerui相关组件。这个很简单,直接去www.ligerui.com即可找到。

        2、使用Eclipse创建一个web工程,然后搭建下面这个目录结构。


                                                      

                                           

        3、将ligerui的相关组件加入到WebContent/ligerUI下面,相关组件内容为:

  

        

        4、通过上面几个步奏,我们已经搭建好了一个最基本ligerui的环境了。我们可以直接访问ligerUI/index.htm,这个虽然是静态的数据,但是可以告诉你相关的文件是否全部导入。在这里需要注意一点,在引用ligerui组件时,jsp中使用全路径来访问这些组件,不要使用相对路径。因为在jsp环境中,forward指令会改变当前路径。

        5、模拟一个ligerui的tree组件。在模拟时,我们先观察ligerui的静态数据格式,然后使用面向对象的思想提取出相关组件的javabean即可。


        下面的数据是ligerui首页indexdata.js的数据格式,观察数据,然后结合ligerui效果图

        

[html] view plain copy
  1. {isexpand:"false",text:"布局",children:[   
  2.         {url:"demos/layout/layoutMinWidth.htm",text:"最小宽度"},  
  3.         {url:"demos/layout/layoutAutoHeight.htm",text:"自动高度"},  
  4.         {url:"demos/layout/layoutAutoHeightAndDiff.htm",text:"高度补差"},  
  5.         {url:"demos/layout/layoutCenterOnly.htm",text:"只显示中间部分"},  
  6.         {url:"demos/layout/layoutFixedHeight.htm",text:"固定高度"},  
  7.         {url:"demos/layout/layoutFullHeight.htm",text:"全屏高度"},  
  8.         {url:"demos/layout/layoutHalfHeight.htm",text:"百分比高度"},  
  9.         {url:"demos/layout/layoutLeftMiddleOnly.htm",text:"只显示左侧和中间"},  
  10.         {url:"demos/layout/layoutLeftWidth.htm",text:"限制左边宽度"},  
  11.         {url:"demos/layout/layoutLeftHide.htm",text:"左边刚开始隐藏"},   
  12.         {url:"demos/layout/layoutHideToggle.htm",text:"左边右边不允许隐藏"},    
  13.         {url:"demos/layout/layoutResizeDisable.htm",text:"左边底部不允许调整大小"}    
  14.     ]  
  15.     }  
 

        从上面可以看到,一个菜单有子菜单,或者是多个子叶子节点。下面是具体的代码:

[html] view plain copy
  1. package net.itaem.vo;  
  2.   
  3. import java.util.List;  
  4.   
  5. import net.sf.json.JSONArray;  
  6. import net.sf.json.JSONObject;  
  7.   
  8. /**  
  9.  * 菜单  
  10.  *   
  11.  * 用来模拟ligerui的菜单  
  12.  *   
  13.  * */  
  14. public class MenuVo {  
  15.     /**  
  16.      * id值  
  17.      * */  
  18.     private String id;  
  19.     /**  
  20.      * 菜单名  
  21.      * */  
  22.     private String text;  
  23.     /**  
  24.      * 是否打开菜单,默认不打开  
  25.      * */  
  26.     private boolean isexpand;  
  27.     /**  
  28.      * 菜单下面的子菜单  
  29.      * */  
  30.     private List<MenuVo> children;  
  31.     /**  
  32.      * 该菜单的父亲菜单  
  33.      * */  
  34.     private MenuVo parent;   //父menu菜单id  
  35.     /**  
  36.      * 菜单的url  
  37.      * */  
  38.     private String url;  
  39.   
  40.   
  41.     public MenuVo(){  
  42.   
  43.     }  
  44.   
  45.     public MenuVo(String id, String text, boolean isexpend){  
  46.         this.id = id;  
  47.         this.text = text;  
  48.         this.isexpand = isexpend;  
  49.     }  
  50.   
  51.   
  52.     public String getUrl() {  
  53.         return url;  
  54.     }  
  55.   
  56.     public void setUrl(String url) {  
  57.         this.url = url;  
  58.     }  
  59.   
  60.     public MenuVo getParent() {  
  61.         return parent;  
  62.     }  
  63.   
  64.     public void setParent(MenuVo parent) {  
  65.         this.parent = parent;  
  66.     }  
  67.   
  68.     public String getId() {  
  69.         return id;  
  70.     }  
  71.   
  72.   
  73.     public void setId(String id) {  
  74.         this.id = id;  
  75.     }  
  76.   
  77.   
  78.     public String getText() {  
  79.         return text;  
  80.     }  
  81.   
  82.   
  83.     public void setText(String text) {  
  84.         this.text = text;  
  85.     }  
  86.   
  87.   
  88.     public boolean isIsexpand() {  
  89.         return isexpand;  
  90.     }  
  91.   
  92.   
  93.     public void setIsexpand(boolean isexpand) {  
  94.         this.isexpand = isexpand;  
  95.     }  
  96.   
  97.   
  98.     public List<MenuVo> getChildren() {  
  99.         return children;  
  100.     }  
  101.   
  102.   
  103.     public void setChildren(List<MenuVo> children) {  
  104.         this.children = children;  
  105.     }  
  106.   
  107.     /**  
  108.      * 使用递归的方式来生成这个Menu的json格式字符串  
  109.      * @return 返回该菜单的json格式字符串  
  110.      * @see MenuVo#menuJson(MenuVo)  
  111.      * */  
  112.     @Override  
  113.     public String toString() {  
  114.         JSONObject json = new JSONObject();  
  115.         //生成这个节点的基本数据  
  116.         json.put("text", text);  
  117.         json.put("isexpand", isexpand);  
  118.         json.put("url", url);  
  119.           
  120.         if(parent != null){  
  121.             json.put("pid", parent.getId());      
  122.         }  
  123.   
  124.         //生成这个节点的子菜单数据  
  125.         JSONArray childrenJson = new JSONArray();  
  126.         if(children != null){  
  127.             for(MenuVo child: children){  
  128.                 //让每个子menu递归的去生成json数据  
  129.                 childrenJson.add(toJson(child));  
  130.             }  
  131.             json.put("children", childrenJson);  
  132.         }  
  133.   
  134.         return json.toString();  
  135.     }  
  136.       
  137.     /**  
  138.      * 递归入口  
  139.      * @see MenuVo#toJson()  
  140.      * */  
  141.     private String toJson(MenuVo menu){  
  142.         JSONObject json = new JSONObject();  
  143.         if(menu.getChildren() != null){  
  144.             //生成这个菜单节点的基本数据  
  145.             json.put("text", menu.getText());  
  146.             json.put("id", menu.getId());  
  147.             if(menu.getParent() != null){  
  148.                 json.put("pid", menu.getParent().getId());  
  149.             }  
  150.             json.put("isexpand", menu.isIsexpand());  
  151.             if(menu.getParent() != null){  
  152.                 json.put("pid", menu.getParent().getId());    
  153.             }  
  154.             //生成这个菜单节点的子菜单数据  
  155.             JSONArray childrenJson = new JSONArray();  
  156.             if(menu.getChildren() != null){  
  157.                 for(MenuVo child: menu.getChildren()){  
  158.                     //让每个子menu递归的去生成json数据  
  159.                     childrenJson.add(toJson(child));  
  160.                 }  
  161.                 json.put("children", childrenJson);  
  162.             }  
  163.         }else{   //这个节点不是菜单,是菜单下面的一个具体子节点,该节点已经没有子节点了  
  164.             json.put("id", menu.getId());  
  165.             if(menu.getParent() != null){  
  166.                 json.put("pid", menu.getParent().getId());  
  167.             }  
  168.             json.put("text", menu.getText());  
  169.             json.put("url", menu.getUrl());  
  170.         }  
  171.         return json.toString();  
  172.     }  
  173.     /**  
  174.      * hasCode方法  
  175.      * 由于业务逻辑需要,重写  
  176.      * */  
  177.     @Override  
  178.     public int hashCode() {  
  179.         final int prime = 31;  
  180.         int result = 1;  
  181.         result = prime * result  
  182.                 + ((children == null) ? 0 : children.hashCode());  
  183.         result = prime * result + ((id == null) ? 0 : id.hashCode());  
  184.         result = prime * result + (isexpand ? 1231 : 1237);  
  185.         result = prime * result + ((parent == null) ? 0 : parent.hashCode());  
  186.         result = prime * result + ((text == null) ? 0 : text.hashCode());  
  187.         result = prime * result + ((url == null) ? 0 : url.hashCode());  
  188.         return result;  
  189.     }  
  190.   
  191.      /**  
  192.      * equals方法  
  193.      * 由于业务逻辑需要,重写  
  194.      * */  
  195.     @Override  
  196.     public boolean equals(Object obj) {  
  197.         if (this == obj)  
  198.             return true;  
  199.         if (obj == null)  
  200.             return false;  
  201.         if (getClass() != obj.getClass())  
  202.             return false;  
  203.           
  204.         MenuVo other = (MenuVo) obj;  
  205.         if (children == null) {  
  206.             if (other.children != null)  
  207.                 return false;  
  208.         } else if (!children.equals(other.children))  
  209.             return false;  
  210.         if (id == null) {  
  211.             if (other.id != null)  
  212.                 return false;  
  213.         } else if (!id.equals(other.id))  
  214.             return false;  
  215.         if (isexpand != other.isexpand)  
  216.             return false;  
  217.         if (parent == null) {  
  218.             if (other.parent != null)  
  219.                 return false;  
  220.         } else if (!parent.equals(other.parent))  
  221.             return false;  
  222.         if (text == null) {  
  223.             if (other.text != null)  
  224.                 return false;  
  225.         } else if (!text.equals(other.text))  
  226.             return false;  
  227.         if (url == null) {  
  228.             if (other.url != null)  
  229.                 return false;  
  230.         } else if (!url.equals(other.url))  
  231.             return false;  
  232.           
  233.         return true;  
  234.     }  
  235.       
  236.       
  237. }  

      上面我们使用递归的形式来生成每个menu的json数据,因为一个菜单下面可以有N级的子菜单,所以很适合使用递归的方式来解决问题。

       下面我们使用servlet来生成一个 10 * 10 * 3的目录菜单。下面是servlet:

[html] view plain copy
  1. package net.itaem.servlet;  
  2.   
  3. import java.io.IOException;  
  4. import java.util.ArrayList;  
  5. import java.util.List;  
  6.   
  7. import javax.servlet.ServletException;  
  8. import javax.servlet.http.HttpServlet;  
  9. import javax.servlet.http.HttpServletRequest;  
  10. import javax.servlet.http.HttpServletResponse;  
  11.   
  12. import net.itaem.vo.MenuVo;  
  13. import net.sf.json.JSONArray;  
  14.   
  15. public class LigerUiTreeServlet extends HttpServlet{  
  16.   
  17.     /**  
  18.      *   
  19.      */  
  20.     private static final long serialVersionUID = 145235235L;  
  21.   
  22.     @Override  
  23.     protected void doGet(HttpServletRequest req, HttpServletResponse resp)  
  24.             throws ServletException, IOException {  
  25.   
  26.         doPost(req, resp);  
  27.     }  
  28.   
  29.     @Override  
  30.     protected void doPost(HttpServletRequest req, HttpServletResponse resp)  
  31.             throws ServletException, IOException {  
  32.         JSONArray json = new JSONArray();  
  33.   
  34.         //生成一个10 * 10 *3的树  
  35.         for(int i=0; i<10; i++){  
  36.             MenuVo menu = new MenuVo();  
  37.             menu.setText("text" + i);  
  38.             menu.setId(i + "");  
  39.   
  40.             //偶数的菜单展开  
  41.             menu.setIsexpand(false);  
  42.   
  43.   
  44.             List<MenuVo> children = new ArrayList<MenuVo>();  
  45.             for(int j=0; j<10; j++){  
  46.                 MenuVo menu1 = new MenuVo();  
  47.                 menu1.setText("text" + i + j);  
  48.                 menu1.setId(i + "" + j);  
  49.                 children.add(menu1);  
  50.                 menu1.setParent(menu);  
  51.                 List<MenuVo> menu1Children = new ArrayList<MenuVo>();  
  52.                 for(int k=0; k<3; k++){  
  53.                     MenuVo menuVo = new MenuVo();  
  54.   
  55.                     menuVo.setText("text" + i + "" + j + "" + k);  
  56.                     menuVo.setId("text" + i+ "" + j + ""+ k);  
  57.                     menuVo.setUrl("#");  
  58.                     menuVo.setParent(menu1);  
  59.                     menu1Children.add(menuVo);  
  60.                 }  
  61.                 menu1.setChildren(menu1Children);  
  62.                 menu.setChildren(children);  
  63.             }  
  64.             json.add(menu.toString());  
  65.   
  66.             System.out.println(menu.toString());  
  67.         }  
  68.   
  69.         req.setAttribute("treeData", json.toString());  
  70.         req.getRequestDispatcher("ligerUI/index.jsp").forward(req, resp);  
  71.     }  
  72.   
  73.   
  74.   
  75. }  

        然后配置相关servlet:

[html] view plain copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  3.     xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"  
  4.     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"  
  5.     version="2.5">  
  6.       
  7.   <display-name></display-name>   
  8.     
  9.   <servlet>  
  10.       <servlet-name>LigerUiTreeServlet</servlet-name>  
  11.       <servlet-class>net.itaem.servlet.LigerUiTreeServlet</servlet-class>  
  12.   </servlet>  
  13.     
  14.     
  15.   <servlet-mapping>  
  16.       <servlet-name>LigerUiTreeServlet</servlet-name>  
  17.       <url-pattern>/ligerTree.do</url-pattern>  
  18.   </servlet-mapping>  
  19.     
  20.     
  21.   <welcome-file-list>  
  22.     <welcome-file>index.jsp</welcome-file>  
  23.   </welcome-file-list>  
  24. </web-app>  

      然后每次访问这个servlet,都会跳转到ligerUI/index.jsp,这里基本和ligerui提供的静态代码一致,只需要将树的数据修改为后台servlet提供的数据即可。

    



        总结:从上面的例子我们可以看出,快速搭建一个ligerui环境难度并不高。作为一个java web工程师,我们应该多掌握这种开源框架。虽然上面的例子只是模拟了一个menu树,但是窥斑见豹,我们有了这个例子,其他的ligerui组件也肯定可以搞定了。


这篇关于使用java搭建简单的ligerui环境的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/759991

相关文章

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

Spring Security--Architecture Overview

1 核心组件 这一节主要介绍一些在Spring Security中常见且核心的Java类,它们之间的依赖,构建起了整个框架。想要理解整个架构,最起码得对这些类眼熟。 1.1 SecurityContextHolder SecurityContextHolder用于存储安全上下文(security context)的信息。当前操作的用户是谁,该用户是否已经被认证,他拥有哪些角色权限…这些都被保

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数