bootstrap table 教程+x-editable

Bootstrap-table

快速入门---- bootstrap-table是一个基于Bootstrap的jQuery插件
可以实现从数据库中提取数据到前端进行相应操作的功能


更加优秀的页面展现请到bootstrap-table

Table of contents

quick-start

对本文有什么疑问或者建议,可以在下方的评论区说明,笔者会尽能力给出解答,另外已经完成了bootstrap-table的增删改查操作,以及增加操作的的模态框(bootstrap modal),以及表单校检(bootstrap-validate),最近有点忙,过一段时间更新,还有侧边栏的动态生成(bootstrap-treeview)也是在学习当中

快速使用:

没有配置java环境,移步JDK安装与环境变量配置;
没有配置tomcat环境,移步tomcat的下载和安装配置;
没有下载配置idea环境,移步IntelliJ IDEA安装以及配置;

why-use

  • 学习成本低,配置简单,文档齐全
  • 与Bootstrap无缝衔接,整体风格一致,也便于二次开发
  • 开发者活跃,Github定期维护

whats-included

file list:

bootstrapDemo/
├── web/
│   ├── js
│   ├── WEB-INF
│   └── bootindex.html
└── src/
│   └── DataSendServlet.java

表单展示页面 (bootindex.html)
javascript文件 (showOrder.js)从服务器取得数据,然后渲染表格

details

$("#table").bootstrapTable({
  method: "post",
  url: "获取后台数据的url",
  ... ...

});   

这里的js语句的所有渲染操作是针对html页面中的id为table的一个table,所以不要忘了在导入了该js的html中构建出id为table的table

bootstrap-table中的重要键值的简单解释:

showorder.js会向服务器发起ajax访问

bootstrapTable构建元素解析:

url
$("#table").bootstrapTable({
  method: "post",
  url: "获取后台数据的url",
  ... ...

}); 

ajax访问到的后台路径(必须),该后台需要按照指定的json 格式返回数据

method

get发送的数据在请求报文的请求行,也就是url部分,而且参数如果有中文会出现乱码问题,而post发送的数据在报文实体,都应该是post,表单的提交也一般都是post

queryParams

不需要任何修改,相当于ajax中的data键,上面的method决定这些参数传递给后台的的传递方式.发送给后台的数据,给出实现表单分页的两个参数,offsetlimit,在oTableInit.queryParams中给出,后台用request.getParameter()的方式拿到queryParams中传递过来的值,然后制定dao

pageSize

当前table一次最多显示多少行,也就是你的table的一页应该展现多少行,必须

pageNumber

起始页,一般是1不用改,这个和pageSize决定了queryParams中的offset的值,offset=(pageNow - 1) * pageSize,limit=pageSize

contentType

contentType: "application/x-www-form-urlencoded"

columns
$("#table").bootstrapTable({
  method: "post",
  url: "获取后台数据的url",
  data: [
        {field: 'testId', title: 'ID'},
        {field: 'testName', title: '姓名'},
        {field: 'testPassword', title: '密码'}
        ]  
      ... ...
  ]
});  

你的table的表结构,以上例子表示表有三列,列的实际显示名字分别是ID,姓名,密码,但是field代表实际数据的名字,表中的数据是由于ajax向服务器发起访问,服务器返回给的数据中的rows的每一个json对象的键都会对应到field的列中-----服务器返还的值

jsonstyle

{  
"total":25,  
    "rows":[
        {
        "testID":1,
        "testName":"xiaoming1",
        "testPassword":"xiaomingpwd1"
        },
        {
        "testID":2,
        "testName":"xiaoming2",
        "testPassword":"xiaomingpwd2"
        }
    ]
}    

数据库返还给发起访问的ajax的数据,必须满足,包含两个json形式的键值对,
一个是total键,值为表单拥有者在数据库中的全部数据的数量(行数),这个数据和pageSize决定table展示的页面有多少页,另一个是rows键,值为多个json对象,rows的每一个json对象就是当前table页的一行实体展示,这里的rows相当于会给前端table两行数据,testID,testName,testPassword分别会被填入到table中的field对应的列中-----前端接收到值表现

offset
oTableInit.queryParams = function (params) {

    var temp = {   //这里的键的名字和控制器的变量名必须一直,这边改动,控制器也需要改成一样的
        limit: params.limit,    //params.limit,   页面大小
        offset: params.offset,
        testNum: 445,
        testNum1: 343
    };  

offset=(pageNumber - 1) * pageSize,是会被发送到后台使用的数据,后台数据提取sql语句示例

limit
oTableInit.queryParams = function (params) {

    var temp = {   //这里的键的名字和控制器的变量名必须一直,这边改动,控制器也需要改成一样的
        limit: params.limit,    //params.limit,   页面大小
        offset: params.offset,
        testNum: 445,
        testNum1: 343
    };

limit=pageSize,是会被发送到后台使用的数据,后台数据提取sql语句示例

sql示例

SELECT * FROM test WHERE id = ? LIMIT offset,limit

表格绑定事件

用于测试ajax返回的数据是最好的

$("#table").bootstrapTable({
      method: "post",
      url: "获取后台数据的url",
      onLoadSuccess: function(){  //加载成功时执行
            console.info("加载成功");
      },
      onLoadError: function(){  //加载失败时执行
            console.info("加载数据失败");
      }
});    

关于事件,更为详细的介绍请访问boottableDoc

editable

这是在操作table吗,感觉就像是数据库展现在了页面上

如果你已经阅读完或者已经在自己代码中实现了上述功能,但是table存在的目的本来就不应该只是展现,应该还有寻常的CRUD,精力有限,只是实践了update,笔者使用的是行内编辑的方式实现的update,需要用到另一个工具X-editable,不过还好boottable有这样的插件,将x-editable封装整合到了当中,只需要引入https://cdn.bootcss.com/bootstrap-table/1.12.1/extensions/editable/bootstrap-table-editable.min.js

start editable
$("#table").bootstrapTable({
  method: "post",
  url: "获取后台数据的url",
    [
    {field: 'testId',
    title: 'ID',
    editable: {mode: 'popup'}
    },
    {field: 'testName', 
    title: '姓名'},
    {field: 'testPassword', 
    title: '密码'}
    ]  
      ... ...
  ]
});  

onEditableSave: function (field, row, oldValue, $el) {

    $.ajax({
        type: "post",
        url: "/ordercenter/updateOrder.json",
        data: {
            orderid: row.orderid,
            updateCol: field,
            updateVal: eval('row.'+field)
        },
        dataType: 'JSON',
        success: function (data, status) {
            console.log(data);
            if (status == "success") {
                alert('旧数据: 订单号: ' + row.orderid + ' ' + field + ': ' + oldValue + '\r\n'
                + '更新后的数据: 订单号: ' + data.updateId + ' ' + data.updateCol + ': ' + data.updateVal)
            }
        },
        error: function () {
            alert('编辑失败');
        },
        complete: function () {

        }

    });
},
details editable

编辑后的提交方法统一放到onEditableSave事件里面统一处理

例子: 页面table中的列姓名,field为testName,实际的值为xiaoming1,通过修改将其改为xiaoming2,这时候field为testName,row为一个json,键值对分别为该行的所有键值组合,oldValue为xiaoming1
更为详细的描述请到x-editable

建议读者直接使用我的onEditableSave,它向后台发送了三个数据精确完成update,行特定标识和列特定标识定位到修改了哪一个具体的数据,再给出updateVal指出原本的数据被修改成了updateVal

moreEditable

editable中的mode的值一般是popup,翻译是弹出的意思,也可以使用inline值,但是点击并且编辑的时候会使表格样式发生改变,而popup则不会

demo
web-xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">


    <welcome-file-list>
        <welcome-file>/bootindex.html</welcome-file>
    </welcome-file-list>
    <servlet>
        <servlet-name>DataSendServlet</servlet-name>
        <servlet-class>com.selton.DataSendServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>DataSendServlet</servlet-name>
        <url-pattern>/DataSendServlet</url-pattern>
    </servlet-mapping>
</web-app>
html-demo
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.0.1/css/bootstrap.min.css">
    <link href="https://cdn.bootcss.com/bootstrap-table/1.12.1/bootstrap-table.min.css" rel="stylesheet">
    <script src="http://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
    <link href="//cdnjs.cloudflare.com/ajax/libs/x-editable/1.5.0/bootstrap3-editable/css/bootstrap-editable.css" rel="stylesheet"/>
    <script src="//cdnjs.cloudflare.com/ajax/libs/x-editable/1.5.0/bootstrap3-editable/js/bootstrap-editable.min.js"></script>
    <script language="JavaScript" src="/js/showOrder.js"></script>
    <script language="JavaScript">
        $(function () {
            //1.初始化Table
            var oTable = new TableInit();
            oTable.Init();
        });
    </script>

</head>
<body>
<div class="container">

    <table id="Table"></table>

</div>
<script src="http://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
<script src="http://apps.bdimg.com/libs/bootstrap/3.3.4/js/bootstrap.min.js"></script>
<script src="https://cdn.bootcss.com/bootstrap-table/1.12.1/bootstrap-table.min.js"></script>

</body>
</html>
js-demo
var TableInit = function () {
var oTableInit = new Object();
//初始化Table
oTableInit.Init = function () {
    $('#Table').bootstrapTable({

        url: '/DataSendServlet',         //请求后台的URL(*)

        method: 'get',                      //请求方式(*)
        async:  true,                        //true表示执行到这,ajax向后台发起访问,在等待响应的这段时间里,继续执行下面的代码
                                             //设置为true,基本都是后面的代码(除非还有ajax)先执行
        

        // toolbar: '#toolbar',                //工具按钮用哪个容器

        striped: true,                      //是否显示行间隔色

        cache: false,                       //是否使用缓存,默认为true,所以一般情况下需要设置一下这个属性(*)

        pagination: true,                   //是否显示分页(*)

        queryParams: oTableInit.queryParams,//传递参数(*)

        sidePagination: "server",           //分页方式:client客户端分页,server服务端分页(*)

        paginationPreText:'<',              //上一页按钮样式

        paginationNextText:'>',             //下一页按钮样式

        pageNumber: 1,                       //初始化加载第一页,默认第一页

        pageSize: 10,                       //每页的记录行数(*)

        pageList: [10, 25, 50, 100],        //可供选择的每页的行数(*)

        contentType: "application/x-www-form-urlencoded",   //重要选项,必填

        showColumns: true,                  //是否显示所有的列

        showRefresh: true,                  //是否显示刷新按钮

        minimumCountColumns: 2,             //最少允许的列数

        clickToSelect: true,                //是否启用点击选中行

        //height: 700,                        //行高,如果没有设置height属性,表格自动根据记录条数决定表格高度,最好不要设置这个属性

        uniqueId: "no",                     //每一行的唯一标识,一般为主键列

        showToggle: true,                    //是否显示详细视图和列表视图的切换按钮

        cardView: false,                    //是否显示详细视图

        detailView: false,                   //是否显示父子表

        columns: [
            {
                field: 'testId',
                title: 'ID',
                editable: {
                    mode: 'inline'
                }
            }, {

                field: 'testName',
                title: '用户名'
            }, {

                field: 'testPassword',
                title: '密码'
            }
        ],
        rowStyle: function (row, index) {

            var classesArr = ['success', 'info'];

            var strclass = "";

            if (index % 2 === 0) {//偶数行

                strclass = classesArr[0];

            } else {//奇数行

                strclass = classesArr[1];

            }

            return {classes: strclass};

        },//隔行变色

    });


};


//得到查询的参数

oTableInit.queryParams = function (params) {

    var temp = {   //这里的键的名字和控制器的变量名必须一直,这边改动,控制器也需要改成一样的
        limit: params.limit,    //params.limit,   页面大小
        offset: params.offset,
        testNum: 445,
        testNum1: 343
    };



    return temp;
};
return oTableInit;
};
server-demo
package com.selton;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Enumeration;

/**
 * @author seltonzyf@gmail.com
 * @date 2018/5/10 13:59
 */
@WebServlet(name = "DataSendServlet")
public class DataSendServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {


        //这里输出后台从ajax拿到的数据
        Enumeration<String> parameterNames = request.getParameterNames();
        while (parameterNames.hasMoreElements()) {
            String s = parameterNames.nextElement();
            String parameter = request.getParameter(s);
            System.out.println("s = " + s);
            System.out.println("parameter = " + parameter);
        }
        response.getWriter().print("{\"total\": 11, \"rows\":[{\"testId\":9, \"testName\":\"selton\", \"testPassword\": 1}]}");
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request,response);
    }
}
注意
  • bootstrap-table只能被调用一次的问题

在inittable之前

$("#table").bootstrapTable('destroy'); 

清空之前表内数据

  • 服务器向前端发送的用于构建表单的json,所有的键都会变成小写

转载于:https://www.cnblogs.com/selton/p/9024060.html

JS组件Bootstrap Table使用方法详解 转载 2016年03月21日 15:06:09 标签: Bootstrap Table 最近客户提出需求,想将原有的管理系统,做下优化,通过手机也能很好展现,想到2个方案: a方案:保留原有的页面,新设计一套适合手机的页面,当手机访问时,进入m.zhy.com(手机页面),pc设备访问时,进入www.zhy.com(pc页面) b方案:采用bootstrap框架,替换原有页面,自动适应手机、平板、PC 设备 采用a方案,需要设计一套界面,并且要得重新写适合页面的接口,考虑到时间及成本问题,故项目采用了b方案 一、效果展示 二、BootStrap table简单介绍 bootStrap table 是一个轻量级的table插件,使用AJAX获取JSON格式的数据,其分页和数据填充很方便,支持国际化 三、使用方法 1、引入js、css [js] view plain copy <!--css样式--> <link href="css/bootstrap/bootstrap.min.css" rel="stylesheet"> <link href="css/bootstrap/bootstrap-table.css" rel="stylesheet"> <!--js--> [removed][removed] [removed][removed] [removed][removed] [removed][removed] 2、table数据填充 bootStrap table获取数据有两种方式,一是通过table 的data-url属性指定数据源,二是通过JavaScript初始化表格时指定url来获取数据 [xhtml] view plain copy ... ... [xhtml] view plain copy $('#table').bootstrapTable({ url: 'data.json' }); 第二种方式交第一种而言在处理复杂数据时更为灵活,一般使用第二种方式来进行table数据填充。 [js] view plain copy $(function () { //1.初始化Table var oTable = new TableInit(); oTable.Init(); //2.初始化Button的点击事件 /* var oButtonInit = new ButtonInit(); oButtonInit.Init(); */ }); var TableInit = function () { var oTableInit = new Object(); //初始化Table oTableInit.Init = function () { $('#tradeList').bootstrapTable({ url: '/VenderManager/TradeList', //请求后台的URL(*) method: 'post', //请求方式(*) toolbar: '#toolbar', //工具按钮用哪个容器 striped: true, //是否显示行间隔色 cache: false, //是否使用缓存,默认为true,所以一般情况下需要设置一下这个属性(*) pagination: true, //是否显示分页(*) sortable: false, //是否启用排序 sortOrder: "asc", //排序方式 queryParams: oTableInit.queryParams,//传递参数(*) sidePagination: "server", //分页方式:client客户端分页,server服务端分页(*) pageNumber:1, //初始化加载第一页,默认第一页 pageSize: 50, //每页的记录行数(*) pageList: [10, 25, 50, 100], //可供选择的每页的行数(*) strictSearch: true, clickToSelect: true, //是否启用点击选中行 height: 460, //行高,如果没有设置height属性,表格自动根据记录条数觉得表格高度 uniqueId: "id", //每一行的唯一标识,一般为主键列 cardView: false, //是否显示详细视图 detailView: false, //是否显示父子表 columns: [{ field: 'id', title: '序号' }, { field: 'liushuiid', title: '交易编号' }, { field: 'orderid', title: '订单号' }, { field: 'receivetime', title: '交易时间' }, { field: 'price', title: '金额' }, { field: 'coin_credit', title: '投入硬币' }, { field: 'bill_credit', title: '投入纸币' }, { field: 'changes', title: '找零' }, { field: 'tradetype', title: '交易类型' },{ field: 'goodmachineid', title: '货机号' },{ field: 'inneridname', title: '货道号' },{ field: 'goodsName', title: '商品名称' }, { field: 'changestatus', title: '支付' },{ field: 'sendstatus', title: '出货' },] }); }; //得到查询的参数 oTableInit.queryParams = function (params) { var temp = { //这里的键的名字和控制器的变量名必须一直,这边改动,控制器也需要改成一样的 limit: params.limit, //页面大小 offset: params.offset, //页码 sdate: $("#stratTime").val(), edate: $("#endTime").val(), sellerid: $("#sellerid").val(), orderid: $("#orderid").val(), CardNumber: $("#CardNumber").val(), maxrows: params.limit, pageindex:params.pageNumber, portid: $("#portid").val(), CardNumber: $("#CardNumber").val(), tradetype:$('input:radio[name="tradetype"]:checked').val(), success:$('input:radio[name="success"]:checked').val(), }; return temp; }; return oTableInit; }; field字段必须与服务器端返回的字段对应才会显示出数据。 3、后台获取数据 a、servlet获取数据 [js] view plain copy BufferedReader bufr = new BufferedReader( new InputStreamReader(request.getInputStream(),"UTF-8")); StringBuilder sBuilder = new StringBuilder(""); String temp = ""; while((temp = bufr.readLine()) != null){ sBuilder.append(temp); } bufr.close(); String json = sBuilder.toString(); JSONObject json1 = JSONObject.fromObject(json); String sdate= json1.getString("sdate");//通过此方法获取前端数据 ... b、springMvc Controller里面对应的方法获取数据 [js] view plain copy public JsonResult GetDepartment(int limit, int offset, string orderId, string SellerId,PortId,CardNumber,Success,maxrows,tradetype) { ... } 4、分页(遇到问题最多的) 使用分页,server端返回的数据必须包括rows和total,代码如下: [js] view plain copy ...gblst = SqlADO.getTradeList(sql,pageindex,maxrows); JSONArray jsonData=new JSONArray(); JSONObject jo=null; for (int i=0,len=gblst.size();i<len;i++) { TradeBean tb = gblst.get(i); if(tb==null) { continue; } jo=new JSONObject(); jo.put("id", i+1); jo.put("liushuiid", tb.getLiushuiid()); jo.put("price", String.format("%1.2f",tb.getPrice()/100.0)); jo.put("mobilephone", tb.getMobilephone()); jo.put("receivetime", ToolBox.getYMDHMS(tb.getReceivetime())); jo.put("tradetype", clsConst.TRADE_TYPE_DES[tb.getTradetype()]); jo.put("changestatus", (tb.getChangestatus()!=0)?"成功":"失败"); jo.put("sendstatus", (tb.getSendstatus()!=0)?"成功":"失败"); jo.put("bill_credit", String.format("%1.2f",tb.getBill_credit()/100.0)); jo.put("changes",String.format("%1.2f",tb.getChanges()/100.0)); jo.put("goodroadid", tb.getGoodroadid()); jo.put("SmsContent", tb.getSmsContent()); jo.put("orderid", tb.getOrderid()); jo.put("goodsName", tb.getGoodsName()); jo.put("inneridname", tb.getInneridname()); jo.put("xmlstr", tb.getXmlstr()); jsonData.add(jo); } int TotalCount=SqlADO.getTradeRowsCount(sql); JSONObject jsonObject=new JSONObject(); jsonObject.put("rows", jsonData);//JSONArray jsonObject.put("total",TotalCount);//总记录数 out.print(jsonObject.toString()); ... 5、分页界面内容介绍 前端获取分页数据,代码如下: [js] view plain copy ...oTableInit.queryParams = function (params) { var temp = { //这里的键的名字和控制器的变量名必须一直,这边改动,控制器也需要改成一样的 limit: params.limit, //第几条记录 offset: params.offset, //显示一页多少记录 sdate: $("#stratTime").val(), }; return temp; };... 后端获取分页数据,代码如下: [js] view plain copy ...int pageindex=0; int offset = ToolBox.filterInt(json1.getString("offset")); int limit = ToolBox.filterInt(json1.getString("limit")); if(offset !=0){ pageindex = offset/limit; } pageindex+= 1;//第几页... 以上就是为大家分享的Bootstrap Table使用方法,希望对大家熟练掌握Bootstrap Table使用方法有所帮助。 转自:http://www.jb51.net/article/79033.htm
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值