一、问题概述

  在开发web信息管理系统时,使用Web前端框架可以帮助我们快速搭建一组风格统一的界面效果,而且能够解决大多数浏览器兼容问题,提升开发效率。在关于LigerGrid的前两篇的内容里,给大家介绍了表格的基本的展示数据用法。(传送门:LigerUI之Grid使用详解(一)——显示数据 、LigerUi之Grid使用详解(二)——数据编辑 )

  在实际应用开发中,我们会经常遇到这样的场景,在展示业务数据的时候需要把业务数据中的参数项或者字典项的编码转换成参数名称或者字典名称展示出来。在这里本人总结了三种解决方案,并做了对比。

二、表格中显示字典数据

  首先创建字典表和业务数据表,创建字典参数表,并插入数据:

CREATE TABLE SYSPARAMS
(PID          VARCHAR2(10),CATEGORYCODE VARCHAR2(10),CATEGORYNAME VARCHAR2(50),PCODE        VARCHAR2(10),PNAME        VARCHAR2(50),ENABLED      CHAR(1) DEFAULT 1,SORTNO       NUMBER,REMARK       VARCHAR2(100)
);
ALTER TABLE SYSPARAMSADD CONSTRAINT SYSPARAMS_PK_PID PRIMARY KEY (PID);INSERT INTO SYSPARAMS VALUES('1000000001','PARTSBRAND','配件品牌','1','三一','1',1,'');
INSERT INTO SYSPARAMS VALUES('1000000002','PARTSBRAND','配件品牌','2','徐工','1',2,'');
INSERT INTO SYSPARAMS VALUES('1000000003','PARTSBRAND','配件品牌','3','中联','1',3,'');

  创建业务表,并插入测试数据:

CREATE TABLE BIZ_PARTS
(PCODE   VARCHAR2(10),PNAME   VARCHAR2(50),PBRAND  VARCHAR2(10),PNO     VARCHAR2(50),PGENNO  VARCHAR2(50),PMODEL  VARCHAR2(50),PSIZE   VARCHAR2(20),PWEIGHT VARCHAR2(10),PUNIT   VARCHAR2(10),PSPRICE NUMBER(10,2),REMARK  VARCHAR2(100)
);
ALTER TABLE BIZ_PARTSADD CONSTRAINT BIZ_PRATS_PK_PCODE PRIMARY KEY (PCODE);
INSERT INTO BIZ_PARTS VALUES('PJ00000001','DH150主控阀','1','DB11-1-50/315','','DB11-1-50/315',NULL,NULL,NULL,200,NULL);
INSERT INTO BIZ_PARTS VALUES('PJ00000002','EC360液压泵','2','DB10-2-30/315','','DB10-2-30/33333',NULL,NULL,NULL,300,NULL);
INSERT INTO BIZ_PARTS VALUES('PJ00000003','DH420斗齿','3','DB20-1-30/315','','DB20-1-30/315555',NULL,NULL,NULL,300,NULL);

  数据准备好之后,我们分别来看看这三种解决方案是如何实现的。

解决方案一

  首先来看第一种解决方案,在这种解决方案中,前台需要显示什么数据,我们在后台就查询什么数据传递给前台,即在后台查询时,采用表连接查询或者子查询的方式将数据查询出,并封装成实体集合传递给前台。查询SQL如下:

SELECT B.PCODE, B.PNAME, B.PBRAND, P.PNAME AS PBRANDNAME, B.PNO, B.PMODEL, B.PSPRICE
FROM BIZ_PARTS B, SYSPARAMS P
WHERE B.PBRAND = P.PCODE
AND P.CATEGORYCODE = 'PARTSBRAND';

  或者:

SELECT B.PCODE,B.PNAME,B.PBRAND,B.PNO,B.PMODEL,B.PSPRICE,(SELECT P.PNAMEFROM SYSPARAMS PWHERE B.PBRAND = P.PCODEAND P.CATEGORYCODE = 'PARTSBRAND') AS PBRANDNAMEFROM BIZ_PARTS B;

  最终结果呈现如下:

  此解决方案优点是前台无需做任何处理即可展示我们想看到的数据,缺点是增加查询复杂度,增加实体属性,并且业务数据和参数数据在混杂在一起,不利于后期维护和扩展。

解决方案二

  直接查询业务数据,所有展示问题交给前台处理,步骤如下:

  1、  编写查询SQL:

SELECT B.PCODE, B.PNAME, B.PBRAND, B.PNO, B.PMODEL, B.PSPRICE FROM BIZ_PARTS B;

  2、  将查询数据展示在前台表格中。

$("#maingrid").ligerGrid({columns:[{display:"配件名称",name:"name",isAllowHide:false,align:"left",width:140},{display:"配件品牌",name:"brandCode",isAllowHide:false,align:"left",width:120},{display:"配件件号",name:"no",isAllowHide:false,align:"left",width:120},{display:"配件型号",name:"model",isAllowHide:false,align:"left",width:140},{display:"单价",name:"price",type:"float",isAllowHide:false,align:"left",width:80,render:function(item){return formatCurrency(item.price);}}],rownumbers:true,isScroll:true,url:"main/bizParts.action?reqCode=findOnlyBizParts",width:"99.7%"});

  效果如下:

  可以看到配件品牌展示的是编码,我们需要将其转换为名称字符,继续改造代码。

  3、  使用ajax将本业务数据中用到的字典数据加载到本页面后,再去构建表格,并利用表格的render属性对单元格内容进行渲染。

    A、使用ajax将配件品牌字典查询保证到页面,代码如下:

          $.post("main/bizParts.action?reqCode=findSysParamsByCategoryCode",{code:"PARTSBRAND"},function(data){brandData = data;init_grid();},"json");

   B、参数数据加载成功后,初始化表格并在表格的配件品牌列中添加渲染函数
{display:"配件品牌",name:"brandCode",isAllowHide:false,align:"left",width:120,render:function(item){for(var i=0;i<brandData.length;i++){if(item.brandCode==brandData[i].pcode){return brandData[i].pname;}}}}

  最终效果如方案一。此解决方案优点在于后台数据解耦,有利于后期的维护和扩展,缺点在于除了专注于业务数据的同时,还要处理相关参数数据。

解决方案三

  采用自定义标签,将字典数据的获取及渲染函数全部封装到自定义标签中,这样我们在用到字典的时候直接使用标签即可。具体步骤如下:

  1、  编写标签处理类:在此做简单处理,渲染函数的命名方式为:render_字典类型编号。实际上字符连接这块内容,我们应该定义成tpl模板。

public class JreduSysParamsTag extends SimpleTagSupport {private String categoryCode;public String getCategoryCode() {return categoryCode;}public void setCategoryCode(String categoryCode) {this.categoryCode = categoryCode;}@Overridepublic void doTag() throws JspException, IOException {SysParamsService sysParamService = new SysParamsServiceImpl();List<Map<String, String>> list =sysParamService.findSysParamsByCategoryCode(categoryCode);JSONArray  array = JSONArray.fromObject(list);StringBuilder stringBuilder = new StringBuilder();stringBuilder.append("<script>");stringBuilder.append(" var data_").append(categoryCode).append("=");stringBuilder.append(array.toString());stringBuilder.append(";");stringBuilder.append("function ");stringBuilder.append("render_").append(categoryCode);stringBuilder.append("(item,item1,item2,cell){");stringBuilder.append("for( var i=0;i<data_").append(categoryCode).append(".length;i++){");stringBuilder.append("if(item[cell.name]==data_").append(categoryCode).append("[i].id){");stringBuilder.append("return data_").append(categoryCode).append("[i].text;");stringBuilder.append("}");stringBuilder.append("}");stringBuilder.append("}");stringBuilder.append("</script>");getJspContext().getOut().write(stringBuilder.toString());}
}

  2、  编写标签库文件:

    <tag><name>JreduSysParams</name><tagclass>com.jereh.edu.tag.JreduSysParamsTag</tagclass><bodycontent>empty</bodycontent><attribute><name>categoryCode</name><required>true</required></attribute></tag>

  3、  在jsp页面中结合ligerGrid使用此标签。

<jredu:JreduSysParams categoryCode="PARTSBRAND"/>

  修改grid列的render:
{display:"配件品牌",name:"brandCode",isAllowHide:false,align:"left",width:120,render:render_PARTSBRAND
}

  最终效果如下:

  综上所述,方案三不仅解决了之前两种方案中的问题,还能够实现组件的重用,在此推荐大家使用此方案解决表格中显示字典数据的问题。

※ 源码下载

  如需源码,请点击百度云源码下载:http://pan.baidu.com/s/1gd6DIYv ,欢迎分享。

作者:杰瑞教育
出处:http://www.cnblogs.com/jerehedu/ 
本文版权归烟台杰瑞教育科技有限公司和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

转载于:https://www.cnblogs.com/jerehedu/p/4255850.html

LigerUI之Grid使用详解(三)——字典数据展示相关推荐

  1. LigerUi之Grid使用详解(二)——数据编辑

    一.问题概述 在开发web信息管理系统时,使用Web前端框架可以帮助我们快速搭建一组风格统一的界面效果,而且能够解决大多数浏览器兼容问题,提升开发效率.所以上一篇文章为大家介绍了LigerGrid的显 ...

  2. 在列表前方插入一个数据_Python基础知识详解(三):数据结构篇

    作者 | CDA数据分析师 1.列表的概念 列表(list)是用来存储一组有序数据元素的数据结构,元素之间用都好分隔.列表中的数据元素应该包括在方括号中,而且列表是可变的数据类型,一旦创建了一个列表, ...

  3. linux 进程间通信 dbus-glib【实例】详解三 数据类型和dteeth(类型签名type域)(层级结构:服务Service --> Node(对象、object) 等 )(附代码)

    linux 进程间通信 dbus-glib[实例]详解一(附代码)(d-feet工具使用) linux 进程间通信 dbus-glib[实例]详解二(上) 消息和消息总线(附代码) linux 进程间 ...

  4. P2P技术详解(三):P2P技术之STUN、TURN、ICE详解

    本文是<P2P理论详解>系列文章中的第2篇,总目录如下: <P2P技术详解(一):NAT详解--详细原理.P2P简介> <P2P技术详解(二):P2P中的NAT穿越(打洞 ...

  5. Android init.rc文件解析过程详解(三)

    Android init.rc文件解析过程详解(三) 三.相关结构体 1.listnode listnode结构体用于建立双向链表,这种结构广泛用于kernel代码中, android源代码中定义了l ...

  6. Windows 7防火墙设置详解(三)

    Windows 7防火墙设置详解(三) 一.如何禁用或启用规则 方法:只需要在需要禁用或启动的规则上,鼠标右键选择启用或禁止规则即可,或点击右侧的操作栏进行规则启用或禁止. 二.入站规则和出站规则 由 ...

  7. Android Studio 插件开发详解三:翻译插件实战

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/78113868 本文出自[赵彦军的博客] 系列目录 Android Gradle使用 ...

  8. 数据结构--图(Graph)详解(三)

    数据结构–图(Graph)详解(三) 文章目录 数据结构--图(Graph)详解(三) 一.深度优先生成树和广度优先生成树 1.铺垫 2.非连通图的生成森林 3.深度优先生成森林 4.广度优先生成森林 ...

  9. SharePoint2007安装图文详解三:安装SqlServer2005

    SharePoint2007 中的很多功能会用到数据库,如分析服务,报表服务等.本文介绍SqlServer2005的安装,数据库的安装很简单,基本上安装默认选项点击下一步即可,需要注意的地方在下面会提 ...

  10. C语言中三个数比较大小详解——三种方法

    ​ C语言中三个数比较大小详解--三种方法 方法一:if-else法 方法二:函数法 方法三:三目运算符法 C语言中比较三个数的大小有很多方法,以下是我总结的三种方法: 首先我定义 int a = 1 ...

最新文章

  1. 2007年分区联赛提高组之一 统计数字
  2. 计算机道德 英语作文,公共道德英语作文
  3. [书籍分享]0-003.你的灯亮着吗:发现问题的真正所在
  4. docker 相关操作
  5. Java 200+ 面试题补充② Netty 模块
  6. 安装java 并配置环境变量_安装Java JDK并配置环境变量
  7. ObjC学习7-C语言特性
  8. canvas 绘制直线 并选中_canvas绘制飞线效果
  9. LINUX内核协议栈分析初探
  10. python工厂方法_Python设计模式:工厂方法模式初探
  11. java中的迭代是什么意思_JAVA里的 迭代 具体是指什么意思
  12. 黄梅一中高考2021成绩查询,2020年黄冈高考成绩出炉!这些高分考生太棒了!
  13. mysql 签到_签到功能,用mysql还是redis?
  14. web利用html2canvas实现截图上传图片
  15. MySQL复制表结构,表数据。
  16. Win7安装Ubuntu1804双系统
  17. jquery 遍历集合
  18. 怎样根据不同的睡姿选择合适的枕头?
  19. c++ zlib 7z解压缩
  20. 将excel中的数据导入数据库

热门文章

  1. SQL注入攻击防御深层思考
  2. c#实现程序的互斥运行
  3. 如何设置一个全局流水号
  4. 用virtualenv建立独立虚拟环境 批量导入模块信息
  5. [BZOJ] 1639: [Usaco2007 Mar]Monthly Expense 月度开支
  6. 用Siri显示二维码, iOS11, INGetVisualCodeIntent
  7. 面试题:return和finally执行
  8. android 点击屏幕 回调,Android 点击回调传递
  9. spark使用KryoRegistrator java代码示例
  10. Flask模板操作一:基本使用