• angularJS 条件查询 品优购条件查询品牌(条件查询和列表展示公用方法解决思路 及 post请求混合参数提交方式)


    Brand.html

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>品牌管理</title>
    <meta
        content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no"
        name="viewport">
    <link rel="stylesheet" href="../plugins/bootstrap/css/bootstrap.min.css">
    <link rel="stylesheet" href="../plugins/adminLTE/css/AdminLTE.css">
    <link rel="stylesheet"
        href="../plugins/adminLTE/css/skins/_all-skins.min.css">
    <link rel="stylesheet" href="../css/style.css">
    <script src="../plugins/jQuery/jquery-2.2.3.min.js"></script>
    <script src="../plugins/bootstrap/js/bootstrap.min.js"></script>
    <!-- 引入angularJS -->
    <script src="../plugins/angularjs/angular.min.js"></script>
    
    <!-- 分页插件使用 -->
    <script src="../plugins/angularjs/pagination.js"></script>
    <link rel="stylesheet" href="../plugins/angularjs/pagination.css">
    
    <script type="text/javascript">
        var app = angular.module("pingyougou", [ "pagination" ]);
        app.controller("brandController", function($scope, $http) {
            //分页查询品牌列表
            //【其实在分页插件内部就有当页面一加载就执行一遍请求的方法调用,所以我们在这块代码中不用再显示的写一遍$scope.reloadList()】
    
            //分页控件配置 
            /* 
             currentPage: 当前页
             totalItems: 总记录数
             itemsPerPage: 每页记录数
             perPageOptions: [10, 20, 30, 40, 50], 分页选项【就是每页显示几条记录的备选下拉】
             onChange: 当页面变更后自动触发的方法
            
             */
             
            $scope.paginationConf = {
                currentPage : 1,
                totalItems : 10,
                itemsPerPage : 10,
                perPageOptions : [ 10, 20, 30, 40, 50 ],
                onChange : function() {
                    $scope.reloadList();//重新加载
                }
            };
            
            //有关reloadFlag的所有额外代码都是为了解决分页插件自动刷新两次问题
            $scope.reloadFlag = true;
            //刷新列表【因为要频繁使用,避免写很长代码,这里封装成一个方法】
            $scope.reloadList = function() {
                
                if(!$scope.reloadFlag){
                    return;
                }
                //调用分页请求方法
                $scope.search($scope.paginationConf.currentPage,
                        $scope.paginationConf.itemsPerPage);
                
                $scope.reloadFlag=false;
                setTimeout(function(){
                    $scope.reloadFlag=true;
                }, 200)
            }
            //定义默认值,因为前台post请求提交,后台用@RequestBody注解时,被注解的对象一定要从前台传递,即使其值为空也要写出来
            $scope.searchEntity = {};
            //定义搜索方法
            $scope.search=function(page,size){
                //注意:可以这样传参数  就是变量和对象一起放在post请求中(因为后台brand参数上加了@RequestBody注解所以这里必须用post)
                $http.post("../brand/search.do?page="+page+"&size="+size,$scope.searchEntity).success(
                    function(response){
                        $scope.list = response.rows; //显示当前页数据
                        $scope.paginationConf.totalItems = response.total;//更新总记录数
                    }        
                );
            }
    
            //分页请求方法(现在加载页面和条件查询改为都用search方法,原findpage方法就可以不用了)
            $scope.findPage = function(page, size) {
                $http.get("../brand/findPage.do?page=" + page + "&size=" + size)
                        .success(function(response) {
                            $scope.list = response.rows; //显示当前页数据
                            $scope.paginationConf.totalItems = response.total;//更新总记录数
                        });
            }
            
            //新增方法(为了新增和修改都用同一个方法,将此方法改名为save)
            $scope.save = function(){ //entity是我们在$scope中自定义的一个ang变量
                //默认是新增
                var methodName="add";
                //不为空说明是修改
                if($scope.entity.id != null){
                    methodName="update";
                }
                $http.post("../brand/"+methodName+".do?",$scope.entity).success(
                        function(response){
                            if(response.success){
                                $scope.reloadList();//刷新
                            }else{
                                alert(response.message);
                            }
                        }
                );
            }
            
            //查询实体
            $scope.findOne=function(id){
                $http.get("../brand/findOne.do?id="+id).success(
                        function(response){
                            //利用ang的双向绑定特性,实现前台取值的更新
                            $scope.entity = response;
                        }
                );
            }
            
            //用户勾选复选框
            $scope.selectIds=[]; //定义一个用户勾选的id集合
            //定义一个向集合中添加、删除元素的方法
            $scope.updateSelection=function($event,id){
                //$event.target代表当前input框的js对象,如果当前input是checkbox则其有checked属性
                if($event.target.checked){
                    //如果点击完是选中状态则添加到集合
                    $scope.selectIds.push(id); //向集合中添加元素
                }else{
                    //点击 完是未选中状态则从集中中删除当前元素
                    var index = $scope.selectIds.indexOf(id);//查找值的位置
                    $scope.selectIds.splice(index,1);//参数1:移除的位置   参数2:移除的个数
                }
            }
            
            //删除品牌方法
            $scope.dele=function(){
                $http.get("../brand/delete.do?ids="+$scope.selectIds).success(
                    function(response){
                        if(response.success){
                            //刷新列表
                            $scope.reloadList();
                        }
                    }    
                );
            }
            
        });
    </script>
    
    </head>
    <body class="hold-transition skin-red sidebar-mini" ng-app="pingyougou"
        ng-controller="brandController">
        <!-- .box-body -->
        <div class="box-header with-border">
            <h3 class="box-title">品牌管理</h3>
        </div>
    
        <div class="box-body">
    
            <!-- 数据表格 -->
            <div class="table-box">
    
                <!--工具栏-->
                <div class="pull-left">
                    <div class="form-group form-inline">
                        <div class="btn-group">
                        <!-- ng-click="entity={}" 用于清空上次数据使每次点新建打开的都是干净的表单;因为逻辑简单所以不用封装方法,若逻辑复杂可以封装方法-->
                            <button type="button" class="btn btn-default" title="新建"
                                data-toggle="modal" data-target="#editModal" ng-click="entity={}">
                                <i class="fa fa-file-o"></i> 新建
                            </button>
                            <button type="button" class="btn btn-default" title="删除" ng-click="dele()">
                                <i class="fa fa-trash-o"></i> 删除
                            </button>
                            <button type="button" class="btn btn-default" title="刷新"
                                onclick="window.location.reload();">
                                <i class="fa fa-refresh"></i> 刷新
                            </button>
                        </div>
                    </div>
                </div>
                <div class="box-tools pull-right">
                    <div class="has-feedback">
                        品牌名称:<input ng-model="searchEntity.name"> 品牌首字母:<input ng-model="searchEntity.firstChar"> 
                        <button class="btn btn-default" ng-click="reloadList()">查询</button>
                    </div>
                </div>
                <!--工具栏/-->
    
                <!--数据列表-->
                <table id="dataList"
                    class="table table-bordered table-striped table-hover dataTable">
                    <thead>
                        <tr>
                            <th class="" style="padding-right: 0px">
                                <input id="selall" type="checkbox" class="icheckbox_square-blue">
                            </th>
                            <th class="sorting_asc">品牌ID</th>
                            <th class="sorting">品牌名称</th>
                            <th class="sorting">品牌首字母</th>
                            <th class="text-center">操作</th>
                        </tr>
                    </thead>
                    <tbody>
                        <tr ng-repeat="entity in list">
                        <!-- 为了获取当前复选框的状态,需要再加入一个参数 $event代表源,这里指当前input框 -->
                            <td><input type="checkbox" ng-click="updateSelection($event,entity.id)"></td>
                            <td>{{entity.id}}</td>
                            <td>{{entity.name}}</td>
                            <td>{{entity.firstChar}}</td>
                            <td class="text-center">
                                <!-- ng-click="findOne(entity.id) 注意:方法的参数中直接写ang变量及其属性即可不用加任何大括号 -->
                                <button type="button" class="btn bg-olive btn-xs"
                                    data-toggle="modal" data-target="#editModal" ng-click="findOne(entity.id)">修改</button>
                            </td>
                        </tr>
    
                    </tbody>
                </table>
                <!-- 分页 -->
                <tm-pagination conf="paginationConf"></tm-pagination>
    
            </div>
            <!-- 方便测试观察,这里打印出数组变量的内容,代码调试时使用 -->
    
        </div>
        <!-- /.box-body -->
    
        <!-- 编辑窗口 -->
        <div class="modal fade" id="editModal" tabindex="-1" role="dialog"
            aria-labelledby="myModalLabel" aria-hidden="true">
            <div class="modal-dialog">
                <div class="modal-content">
                    <div class="modal-header">
                        <button type="button" class="close" data-dismiss="modal"
                            aria-hidden="true">×</button>
                        <h3 id="myModalLabel">品牌编辑</h3>
                    </div>
                    <div class="modal-body">
                        <table class="table table-bordered table-striped" width="800px">
                            <tr><!-- 只要你在当前文本框中填值,那么它就会自动封装到entity变量中的name属性中,这样entity变量就自动产生了 -->
                                <td>品牌名称</td>
                                <td><input class="form-control" placeholder="品牌名称" ng-model="entity.name">
                                </td>
                            </tr>
                            <tr>
                                <td>首字母</td>
                                <td><input class="form-control" placeholder="首字母" ng-model="entity.firstChar"></td>
                            </tr>
                        </table>
                    </div>
                    <div class="modal-footer"><!-- 用ng-click指令绑定点击时执行ang中定义的方法 -->
                        <button class="btn btn-success" data-dismiss="modal"
                            aria-hidden="true" ng-click="save()">保存</button>
                        <button class="btn btn-default" data-dismiss="modal"
                            aria-hidden="true">关闭</button>
                    </div>
                </div>
            </div>
        </div>
    
    </body>
    </html>

     

    前台思路解析:

    首先在页面上添加 搜索文本框

    品牌名称:<input ng-model="searchEntity.name"> 品牌首字母:<input ng-model="searchEntity.firstChar"> 
                        <button class="btn btn-default" ng-click="reloadList()">查询</button>

    同时用ang的 ng-model 指令定义并绑定变量 searchEntity 及其两个属性 name 和 firstChar,

    同时在 查询 按钮 上 用 ng-click 指令绑定 点击按钮触发 reloadList 方法。

    然后在 控制层,修改 reloadList方法,使其调用 search 方法

      //刷新列表【因为要频繁使用,避免写很长代码,这里封装成一个方法】
            $scope.reloadList = function() {
                //调用分页请求方法
                $scope.search($scope.paginationConf.currentPage,
                        $scope.paginationConf.itemsPerPage);  
            }
            //定义默认值,因为前台post请求提交,后台用@RequestBody注解时,被注解的对象一定要从前台传递,即使其值为空也要写出来
            $scope.searchEntity = {};
            //定义搜索方法
            $scope.search=function(page,size){
                //注意:可以这样传参数  就是变量和对象一起放在post请求中(因为后台brand参数上加了@RequestBody注解所以这里必须用post)
                $http.post("../brand/search.do?page="+page+"&size="+size,$scope.searchEntity).success(
                    function(response){
                        $scope.list = response.rows; //显示当前页数据
                        $scope.paginationConf.totalItems = response.total;//更新总记录数
                    }        
                );
            }

    要注意,post方法提交参数时的这种混合提交方式

    Controller:

        //条件查询
        @RequestMapping("/search")
        public PageResult search(@RequestBody TbBrand brand, int page,int size){
            PageResult result = brandService.findPage(brand, page, size);
            return result;
        }
        

    Service:

    @Override
        public PageResult findPage(TbBrand brand, int pageNum, int pageSize) {
            TbBrandExample example = new TbBrandExample();
            Criteria criteria = example.createCriteria();
            if (brand!=null) {
                if (brand.getName()!=null&&brand.getName().length()>0) {
                    criteria.andNameLike("%"+brand.getName()+"%");
                }
                if (brand.getFirstChar()!=null&&brand.getFirstChar().length()>0) {
                    criteria.andFirstCharLike("%"+brand.getFirstChar()+"%");
                }
            }
            PageHelper.startPage(pageNum, pageSize);//分页
            Page<TbBrand> page = (Page<TbBrand>) brandMapper.selectByExample(example);
            return new PageResult(page.getTotal(), page.getResult()); 
        }
  • 相关阅读:
    java调用存储过程(stored procedures)的HelloWorld例子
    java中JDBC当中请给出一个DataSource的HelloWorld例子
    java当中JDBC当中请给出一个DataSource的单态模式(SingleTon)HelloWorld例子
    java当中JDBC当中Scrollable和Updatable ResultSet的用法和Helloworld例子
    java当中JDBC当中请给出一个sql server的helloworld例子
    java当中请给出一个oracle的helloworld例子
    java当中JDBC当中请给出一个sql server的stored procedure例子
    java当中JDBC当中请给出一个sql server的dataSource的helloworld例子
    java当中JDBC当中请给出一个SQLServer DataSource and SingleTon例子
    java当中JDBC当中请给出一个Oracle DataSource and SingleTon例子
  • 原文地址:https://www.cnblogs.com/libin6505/p/10083227.html
Copyright © 2020-2023  润新知