版权声明:欢迎转载,请注明沉默王二原创。 https://blog.csdn.net/qing_gee/article/details/72519313

select2是一款jquery插件,是普通form表单select组件的升级版。
可以定制搜索、远程数据集(Remote data,本篇主要介绍点)、无限滚动(数据分页功能,这一点很妙)、还有很多高端的参数设置(有需要的下次介绍)。
内置了40种国际化语言,不过这里我们只需要用到中文。
同时支持现代和传统浏览器内置,甚至包括惹人不高兴的IE8。

切记

如果后台返回的数据当中没有id,那么select2是无法选中的,所以切记!!!!!

那么,现在让我们开始一段select2的奇幻之旅吧!

一、惊艳的效果,来一睹为快吧



本地实战结果

二、导入css和js到网站上

1.使用CDN,节省自己网站的流量

<link href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.3/css/select2.min.css" rel="stylesheet" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.3/js/select2.min.js"></script> 

2.下载文件到本地,可以做一些个性的定制(比如说修改提示语)

git下载地址

<!-- select2 -->
<link rel="stylesheet" type="text/css" href="${ctx}/common/select2/css/select2.css" />
<script type="text/javascript" src="${ctx}/common/select2/js/select2.full.js"></script>
<!-- 中文国际化还需要进行参数设置 -->
<script type="text/javascript" src="${ctx}/common/select2/js/i18n/zh-CN.js"></script>

三、真刀真枪的干起来

第一步、定制页面个性化元素

<select name="parentid" class="js-data-example-ajax" href="${ctx}/member/loadMembersInfo.do?uid=${mem.uid}" style="width:400px" inputMessage="请输入会员编号(可部分匹配)"><option selected="selected" value="666">沉默王二</option>
</select>
  1. Java端通过name属性可获得select的value值。
  2. 设置class为js-data-example-ajax,页面加载时对该组件进行select2的初始化。
  3. href属性为ajax提供后台检索的URL。
  4. style设置组件的宽度。
  5. inputMessage属性定制个性化的提示语,默认的英文版为Please enter 1 or more characters,中文国际化为“请再输入至少1个字符”,都不太能满足个性化需求,所以需要改,后面介绍。
  6. 提供一个默认的option,页面没检索之前显示。

第二步、select2组件化,注释写得很详细了哦

<script type="text/javascript">$(function() {$("select.js-data-example-ajax").each(function() {var $this = $(this);$this.select2({language : "zh-CN",// 指定语言为中文,国际化才起效inputMessage : $this.attr("inputMessage"),// 添加默认参数ajax : {url : $this.attr("href"),dataType : 'json',delay : 250,// 延迟显示data : function(params) {return {username : params.term, // 搜索框内输入的内容,传递到Java后端的parameter为usernamepage : params.page,// 第几页,分页哦rows : 10// 每页显示多少行};},// 分页processResults : function(data, params) {params.page = params.page || 1;return {results : data.data,// 后台返回的数据集pagination : {more : params.page < data.total// 总页数为10,那么1-9页的时候都可以下拉刷新}};},cache : false},escapeMarkup : function(markup) {return markup;}, // let our custom formatter workminimumInputLength : 1,// 最少输入一个字符才开始检索templateResult : function(repo) {// 显示的结果集格式,这里需要自己写css样式,可参照demo// 正在检索if (repo.loading)return repo.text;var markup = repo.username;markup += repo.realname;var markup = "<div class='select2-result-repository clearfix'>" + "<div class='select2-result-repository__avatar'><img src='"+ repo.headimgUrl + "' /></div>" + "<div class='select2-result-repository__meta'>"+ "<div class='select2-result-repository__title'>" + repo.username + "</div>";if (repo.realname) {markup += "<div class='select2-result-repository__description'>" + repo.realname + "</div>";}markup += "<div class='select2-result-repository__statistics'>"+ "<div class='select2-result-repository__forks'><i class='fa fa-user'></i> 下级会员数" + repo.children_count + " </div>"+ "</div>" + "</div></div>";return markup;}, templateSelection : function(repo) {return repo.realname || repo.text;}// 列表中选择某一项后显示到文本框的内容});});});
</script>

第三步、Java端接收参数并返回结果集,不用我强调,这步很重要

@RequestMapping(value = "loadMembersInfo")
public void loadMembersInfo(HttpServletRequest request, HttpServletResponse response) throws IOException {Integer uid = StrUtil.parseStringToInt(request.getParameter("uid"));Members mem = this.memberService.selectByPrimaryKey(uid);// 分页参数的转换,需要和前台select2进行匹配,下文放代码BaseConditionVO vo = getBaseConditionVOForTable(request);vo.addParams("username", StrUtil.getUTF8String(request.getParameter("username")));vo.addParams("uid", uid);// 封装结果集,和前台select2也是匹配的。PageGrid page = createPageGrid(this.membersMapper.getPromoterList(vo, vo.createRowBounds()), vo,this.membersMapper.searchPromoterTotalCount(vo));// 以json格式写入到responseout(page, response);}

接下来,把关键的源码贴出来,可能和你的项目不吻合,但可以参考。

BaseConditionVO.java

public class BaseConditionVO {public final static int PAGE_SHOW_COUNT = 50;private int pageNum = 1;private int numPerPage = 0;private int totalCount = 0;private String orderField;private String orderDirection;/*** @Fields ps : 对参数类型进行封装.*/private Map<String, Object> mo = new HashMap<String, Object>();public int getPageNum() {return pageNum;}public void setPageNum(int pageNum) {this.pageNum = pageNum;}public int getNumPerPage() {return numPerPage > 0 ? numPerPage : PAGE_SHOW_COUNT;}public void setNumPerPage(int numPerPage) {this.numPerPage = numPerPage;}public String getOrderField() {return orderField;}public void setOrderField(String orderField) {this.orderField = orderField;}public String getOrderDirection() {return "desc".equals(orderDirection) ? "desc" : "asc";}public void setOrderDirection(String orderDirection) {this.orderDirection = orderDirection;}public int getTotalCount() {return totalCount;}public void setTotalCount(int totalCount) {this.totalCount = totalCount;}public int getStartIndex() {int pageNum = this.getPageNum() > 0 ? this.getPageNum() - 1 : 0;return pageNum * this.getNumPerPage();}public RowBounds createRowBounds() {RowBounds ro = new RowBounds(this.getStartIndex(), this.getNumPerPage());return ro;}/*** @Title: addParams* @Description: 添加查询条件* @param key* @param value*/public void addParams(String key, Object value) {this.getMo().put(key, value);}/** * @Title: getParams * @Description: 获取查询条件* @param key* @return*/public Object getParams(String key) {return this.getMo().get(key);}/*** @return the mo*/public Map<String, Object> getMo() {return mo;}/*** @param mo*            the mo to set*/public void setMo(Map<String, Object> mo) {this.mo = mo;}
}

selec2的分页和Java端分页参数匹配

protected BaseConditionVO getBaseConditionVOForTable(HttpServletRequest req) {BaseConditionVO vo = new BaseConditionVO();// 当前页int currentPage = StrUtil.parseStringToInt(req.getParameter("page"));// 一页显示多少行int sizes = StrUtil.parseStringToInt(req.getParameter("rows"));// 排序String sortOrder = StrUtil.getString(req.getParameter("sord"));String sortCol = StrUtil.getString(req.getParameter("sidx"));vo.setNumPerPage(sizes);vo.setPageNum(currentPage);vo.setOrderField(sortCol);vo.setOrderDirection(sortOrder);return vo;
}

Java端到select2端的数据封装

@XStreamAlias("pageGrid")
@SuppressWarnings("rawtypes")
public class PageGrid {private int page;// 总页数,和select2的processResults.pagination匹配private int total;private int records;// 数据结果集,和select2的processResults.results匹配private List data;public int getPage() {return this.page;}public void setPage(int page) {this.page = page;}public int getTotal() {return this.total;}public void setTotal(int total) {this.total = total;}public int getRecords() {return this.records;}public void setRecords(int records) {this.records = records;}public List getData() {return this.data;}public void setData(List data) {this.data = data;}
}

mysql获取的数据源和PageGrid进行转换匹配

protected PageGrid createPageGrid(List list, BaseConditionVO vo, int searchTotalCount) {PageGrid pageGrid = new PageGrid();// 数据pageGrid.setData(list);// 当前页pageGrid.setPage(vo.getPageNum());// 总数目pageGrid.setRecords(list.size());// 总页数int total = 0;if (pageGrid.getRecords() != 0) {total = searchTotalCount % vo.getNumPerPage() == 0 ? searchTotalCount / vo.getNumPerPage(): searchTotalCount / vo.getNumPerPage() + 1;}pageGrid.setTotal(total);return pageGrid;
}

mybatis的分页,超简单,只要设置了createRowBounds,mybatis就会自动为你分页,这个就厉害了。

List getPromoterList(BaseConditionVO vo, RowBounds createRowBounds);

sql语句,这里的关键点是必须要回传id(m.uid as id)到select2.

<select id="getPromoterList" resultType="hashmap" parameterType="map">selectm.uid as id,convert(m.username,char) username,m.realname,m.children_count,m.headimgUrlfrommembers mwhere m.deleteflag=0<if test="mo.username != ''">and m.username like CONCAT('%', '${mo.username}', '%')</if><choose><when test="orderField !=null and orderField !=''">ORDER BY ${orderField}<if test="orderDirection != null and orderDirection != ''">${orderDirection}</if></when><otherwise>order by m.username DESC</otherwise></choose>
</select>

你是不是没看见mysql的分页limit,嗯,这里无须关注,这就是框架要为我们做的事情。

总数

int searchPromoterTotalCount(BaseConditionVO vo);

count(0)就好

<select id="searchPromoterTotalCount" resultType="java.lang.Integer" parameterType="map">select count(0) as afrommembers mwhere m.deleteflag=0 <if test="mo.username != ''">and m.username like CONCAT('%', '${mo.username}', '%')</if>
</select>

out输出到response中

protected void out(Object result, HttpServletResponse response) throws IOException {ServletOutputStream out = response.getOutputStream();ObjectMapper objectMapper = new ObjectMapper();objectMapper.writeValue(out, result);out.flush();
}

到这,select2的remote功能在代码部分就完全贴出来完了。
不过,我最后还是要强调几个点:

1.分页的参数Java端和select2一定要对照起来。
2.回传的数据一定要传递一个id回来,否则回来的列表不能选中,为什么呢?调查select2的源码可以知道。

  Results.prototype.option = function (data) {var option = document.createElement('li');option.className = 'select2-results__option';var attrs = {'role': 'treeitem','aria-selected': 'false'};if (data.disabled) {delete attrs['aria-selected'];attrs['aria-disabled'] = 'true';}// id为空的情况下,删除的aria-selected,而aria-selected恰好又是列表选中的关键属性。
// 这个就是个坑,只能这么说,select2给出的api上完全不讲这点,我去!!!!!!!if (data.id == null) {delete attrs['aria-selected'];}......
}

3.form表单如何获取select2的值?答案是,1.返回结果集必须有id,2.input标签上必须要name属性。
4.如何自定义inputMessage呢?

在select2.js中找到以下代码,注意注释部分

S2.define('select2/data/minimumInputLength',[], function () {function MinimumInputLength (decorated, $e, options) {this.minimumInputLength = options.get('minimumInputLength');// inputMessagethis.inputMessage = options.get('inputMessage');decorated.call(this, $e, options);}MinimumInputLength.prototype.query = function (decorated, params, callback) {params.term = params.term || '';if (params.term.length < this.minimumInputLength) {this.trigger('results:message', {message: 'inputTooShort',args: {minimum: this.minimumInputLength,input: params.term,inputMessage : this.inputMessage, // inputMessage,传递给i18nparams: params}});return;}decorated.call(this, params, callback);};return MinimumInputLength;
});

select2.js中defaults中增加上inputMessage

    this.defaults = {...minimumInputLength: 0,inputMessage: '',maximumInputLength: 0,...};

然后在zh-CN.js文件中修改inputTooShort方法

inputTooShort : function(e) {if (e.inputMessage) {return e.inputMessage;// 增加inputMessage} else {var t = e.minimum - e.input.length, n = "请再输入至少" + t + "个字符";return n}},

到这里嘛,真的该结束了。


欢迎关注我的公众号,给灵魂片刻安静!

微信扫一扫下方二维码即可关注 沉默王二 公众号:

select2,利用ajax高效查询大数据列表(可搜索、可分页)相关推荐

  1. [html] 如何优化大数据列表(10万+)的性能?说说你的方案

    [html] 如何优化大数据列表(10万+)的性能?说说你的方案 定时器批量绘制, 过滤,查询使用serviceWorker ? 个人简介 我是歌谣,欢迎和大家一起交流前后端知识.放弃很容易, 但坚持 ...

  2. php查询mysql表里的数据_PHP/MYSQL 查询大数据/遍历表

    PHP:PHP 5.3.6 (cli) (built: Jun 15 2011 16:29:50) MYSQL:5.1.51 如果我们有的一张表有几百万或几千万的记录,我们要使用 PHP 将所有的记录 ...

  3. Tips|如何高效入门大数据?

    说到大数据,作为技术开发的你一定不陌生,纵观国内大大小小的企业,但凡是赚钱的生意,一定与大数据有关联. 京东.淘宝等电商网站利用用户画像做个性化商品推荐: 今日头条.抖音利用算法做精细化运营: 滴滴. ...

  4. easyexcel导出excel,大数据量100万以内分页查询zip格式导出

    easyexcel导出excel,大数据量100万以内分页查询zip格式导出 准备工作 整体思路 controller层 service层 mapper层 VO 表结构 测试 备注 easyExcel ...

  5. 央行的数字货币拥有政府信用背书,是法币并能利用交易留痕大数据来追踪

    作为新兴事物,数字货币的试点受到社会各界广泛关注,"十四五"规划也提出了"建设现代中央银行制度,完善货币供应调控机制,稳妥推进数字货币研发,健全市场化利率形成和传导机制& ...

  6. SpringBoot+MongoDB查询大数据字段优化

    记录一下 SpringBoot+MongoDB查询大数据字段,查询的单个字段或者总查询结果量太大 用 mongoTemplate.find(query, NewSnapshot.class, coll ...

  7. Elasticsearch——利用Parent-Child关系解决大数据场景下的实时查询

    表与表之间的关联基本上是所有业务系统都存在的,RDBMS通过外键实现,MongoDB通过嵌入式子文档解决,那么Elasticsearch怎么解决这个问题呢?答案就是Parent-Child关联(参考文 ...

  8. EMR on ACK 全新发布,助力企业高效构建大数据平台

    简介: 阿里云 EMR on ACK 为用户提供了全新的构建大数据平台的方式,用户可以将开源大数据服务部署在阿里云容器服务(ACK)上.利用 ACK 在服务部署和对高性能可伸缩的容器应用管理的能力优势 ...

  9. 利用d3.js对大数据资料进行可视化分析

    insight-labs · 2013/12/19 18:18 作者: [email protected] [email protected] 0x00 背景 对于前段时间流出的QQ群数据大家想必已经 ...

最新文章

  1. 阿里再推社交“Real如我”,是电商巨头的流量焦虑
  2. 云炬60s看世界20211119
  3. 修改数据表部分字段方法封装-及-动态生成对象并动态添加属性
  4. 大数据上云第一课:MaxCompute授权和外表操作躲坑指南
  5. 工程院院士李国杰科学网发文称国内 AI 研究「顶不了天,落不了地」
  6. 53 岁张亚勤官宣:正式加入清华!
  7. NYOJ 364 田忌赛马
  8. Linux批量清空当前目录中的日志文件
  9. 人工智能和计算机程序有什么区别,AI与计算机程序的区别?
  10. 微观经济学(第一课)笔记
  11. 怎么做SWOT分析模型PPT呢?
  12. 图解通信原理与案例分析-15:2G GSM手机语音通话的工作原理--TDMA时分多址与GMSK调制
  13. 怎么自学plc和自动化技术?
  14. PX4 git submodule时:Failed to recurse into submodule path 'src/modules/uavcan/libuavcan
  15. 外卖返利cps小程序path
  16. 领英常见问题,猎头如何导出Linkedin全球6亿人才资料
  17. Mybatis中 if 语句使用空格问题
  18. 怎样在word中批量替换文字?Word替换文字这一招你会吗?
  19. matlab中cuk电路搭建,cuk电路matlab仿真
  20. 我给游戏服务器端开发的一些建议

热门文章

  1. python并发处理机制_Python并发处理
  2. 我这几年来是如何编写 Go HTTP 服务的(转载)
  3. 自动化运维环境搭建过程
  4. 实战:轻量级分布式文件系统FastDFS(GraphicsMagick图片压缩)
  5. Tekton基础概念介绍
  6. 关于Redis的几个问题
  7. 在集合中根据条件来筛选数据
  8. 金融壹账通京交会发布区块链白皮书 详解如何成功解决行业痛点
  9. vue-cli3+typescript+路由懒加载报错问题
  10. bzoj 1597 [Usaco2008 Mar]土地购买——斜率优化dp