zoukankan      html  css  js  c++  java
  • 移动商城第七篇【查询商品、分页查询、数据回显】

    逆向生成item

    将表名设置成eb_item就行了。

            <table schema="" tableName="eb_item" enableCountByExample="false"
                enableUpdateByExample="false" enableDeleteByExample="false"
                enableSelectByExample="false" selectByExampleQueryId="false"
            >
            </table>

    查询商品

    由于我们查询商品的话,可能商品的数量是非常大的,因此我们需要用到分页…

    对于分页,我们现在就一点也不陌生了。无非就是把分页所用到的数据封装到page对象中,我们在dao层

    首先,我们来看一下对应的原型界面把:

    这里写图片描述

    我们想要看这个原型界面的话,现在是点不进去的了,因为我们把JSP文件放在WEB-INF下了。因此,我们用Controller做一个转发就行了

    创建商品的Controller

    
    @Controller
    @RequestMapping("item")
    public class EbItemController {
    
        @RequestMapping("/listItem.do")
        public String listItem() {
            return "item/list";
        }
    
    }

    接着,修改页面上跳转的请求链接:

    
        <li><a href="${path}/item/listItem.do"><samp class="t05"></samp>商品录入/上下架</a></li>

    我们发现页面是这样子的。

    这里写图片描述

    我们可以从原型界面上知道:用户可以根据多个条件来对我们的数据进行筛选,并且我们是需要做分页的

    创建查询条件对象

    由于查询条件有多个,那么我们可以把这些条件封装成一个对象。

    在页面上我们可以发现到4个查询条件:

    这里写图片描述

    用于我们的分页有三个条件变量

    • 开始页数
    • 结束页数
    • 当前页数【页面传递过来的】

    因此,我们的查询对象是这样子的:

    
    package com.rl.ecps.model;
    
    public class QueryCondition {
    
        private Integer auditStatus;
    
        private Integer showStatus;
    
        private Long brandId;
    
        private String itemName;
    
        private Integer startNum;
    
        private Integer endNum;
    
        private Integer pageNo;
    
    
    
        public Integer getPageNo() {
            return pageNo;
        }
    
        public void setPageNo(Integer pageNo) {
            this.pageNo = pageNo;
        }
    
        public Integer getAuditStatus() {
            return auditStatus;
        }
    
        public void setAuditStatus(Integer auditStatus) {
            this.auditStatus = auditStatus;
        }
    
        public Integer getShowStatus() {
            return showStatus;
        }
    
        public void setShowStatus(Integer showStatus) {
            this.showStatus = showStatus;
        }
    
        public Long getBrandId() {
            return brandId;
        }
    
        public void setBrandId(Long brandId) {
            this.brandId = brandId;
        }
    
        public String getItemName() {
            return itemName;
        }
    
        public void setItemName(String itemName) {
            this.itemName = itemName;
        }
    
        public Integer getStartNum() {
            return startNum;
        }
    
        public void setStartNum(Integer startNum) {
            this.startNum = startNum;
        }
    
        public Integer getEndNum() {
            return endNum;
        }
    
        public void setEndNum(Integer endNum) {
            this.endNum = endNum;
        }
    
    
    }
    

    创建分页对象

    
    package com.rl.ecps.utils;
    
    import java.util.List;
    
    public class Page {
    
        /**
         * 当前页码(已知)
         */
        private int pageNo = 1;
    
        /**
         * 每页记录数(已知)
         */
        private int pageSize = 5;
        /**
         * 指定查询条件下 的记录数(已知)
         */
        private int totalCount = 0;
        /**
         * 指定查询下的总页数(未知)
         */
        private int totalPage = 1;
        /**
         * 开始行号(未知)
         */
        private int startNum = 0;
    
        /**
         * 未知
         */
        private int endNum = 0;
        private List<?> list;
    
        public int getPageNo() {
            return pageNo;
        }
    
        public void setPageNo(int pageNo) {
            this.pageNo = pageNo;
        }
    
        public int getPageSize() {
            return pageSize;
        }
    
        public void setPageSize(int pageSize) {
            this.pageSize = pageSize;
        }
    
        public int getTotalCount() {
            return totalCount;
        }
    
        public void setTotalCount(int totalCount) {
            this.totalCount = totalCount;
        }
    
        /**
         * totalCount       pageSize        totalPage
         *    0                10               1
         *    95               10               10
         *    100              10               10
         * 
         * 
         * 
         * @return
         */
        public int getTotalPage() {
            totalPage = totalCount/pageSize;
            if(totalCount == 0 || totalCount%pageSize != 0){
                totalPage++;
            }
            return totalPage;
        }
    
        public void setTotalPage(int totalPage) {
            this.totalPage = totalPage;
        }
    
        public int getStartNum() {
            return (pageNo - 1)*pageSize;
        }
    
        public void setStartNum(int startNum) {
            this.startNum = startNum;
        }
    
        public int getEndNum() {
            return pageNo*pageSize + 1;
        }
    
        public void setEndNum(int endNum) {
            this.endNum = endNum;
        }
    
        public List<?> getList() {
            return list;
        }
    
        public void setList(List<?> list) {
            this.list = list;
        }
    
    }
    

    编写SQL

    由于我们的条件未必是存在的,因此我们使用到了动态SQL。

     <!--根据条件查询分页查询数据-->
        <select id="selectItemByCondition" parameterType="com.rl.ecps.model.QueryCondition" resultMap="BaseResultMap">
            select * from (
            select eb_item.*,ROWNUM rn from eb_item
            <where>
                <if test="brandId != null">
                    brand_id = #{brandId}
                </if>
                <if test="auditStatus != null">
                    and audit_status = #{auditStatus}
                </if>
                <if test="showStatus != null">
                    and show_status = #{showStatus}
                </if>
                <if test="itemName != null">
                    and item_name like '%${itemName}%'
                </if>
                <![CDATA[ and rownum <  ]]> #{endNum}
            </where>
            order by item_id desc
            )t
            where t.rn <![CDATA[ > ]]>#{startNum}
        </select>
    
    
        <!--根据条件查询总页数-->
        <select id="selectItemByConditionCount" parameterType="com.rl.ecps.model.QueryCondition" resultType="int">
    
            SELECT count(item_id) from eb_item t
            <where>
                <if test="brandId != null">
                    t.brand_id = #{brandId}
                </if>
                <if test="auditStatus != null">
                    and t.audit_status = #{auditStatus}
                </if>
                <if test="showStatus != null">
                    and t.show_status = #{showStatus}
                </if>
                <if test="itemName != null">
                    and t.item_name like '%${itemName}%'
                </if>
            </where>
        </select>
    

    编写Dao

    
    @Repository
    public class EbItemDaoImpl extends SqlSessionDaoSupport implements EbItemDao  {
        String nameSpace = "com.rl.ecps.sqlMap.sqlMap.EbItemMapper.";
        public List<EbItem> selectItemByCondition(QueryCondition queryCondition) {
            return this.getSqlSession().selectList(nameSpace + "selectItemByCondition", queryCondition);
        }
        public int selectItemByConditionCount(QueryCondition queryCondition) {
            return this.getSqlSession().selectOne(nameSpace + "selectItemByConditionCount", queryCondition);
        }
    }

    编写service

    
    @Service
    public class EbItemServiceImpl implements EbItemService {
    
        @Qualifier("ebItemDaoImpl")
        @Autowired
        private EbItemDao itemDao;
    
        public Page selectItemByCondition(QueryCondition queryCondition) {
    
            //查询当前条件下的总页数
            int count = itemDao.selectItemByConditionCount(queryCondition);
    
            //根据总页数和当前页数【qc从前端拿到的】,计算得出其他分页属性的数据
            Page page = new Page();
            page.setTotalCount(count);
            page.setPageNo(queryCondition.getPageNo());
            int startNum = page.getStartNum();
            int endNum = page.getEndNum();
    
            //将计算出来的开始页数和结束页数封装到qc中,获取数据库中的数据
            queryCondition.setStartNum(startNum);
            queryCondition.setEndNum(endNum);
            List<EbItem> ebItems = itemDao.selectItemByCondition(queryCondition);
    
            //设置到page对象中
            page.setList(ebItems);
    
            return page ;
        }
    }
    

    编写Controller

    
    @Controller
    @RequestMapping("/item")
    public class EbItemController {
    
    
        @Qualifier("ebItemServiceImpl")
        @Autowired
        private EbItemService itemService;
        @Qualifier("ebBrandServiceImpl")
        @Autowired
        private EbBrandService ebBrandService;
    
    
        @RequestMapping("/listItem.do")
        public String listItem(QueryCondition queryCondition, Model model) {
            //拿到所有的品牌,用于给用户下拉框选择
            List<EbBrand> ebBrands = ebBrandService.selectBrand();
    
            //如果是第一次访问的话,那么默认是没有当前页号的,因此赋值为1
            if (queryCondition.getPageNo() == null) {
                queryCondition.setPageNo(1);
            }
    
            //得到分页数据
            Page page = itemService.selectItemByCondition(queryCondition);
    
            model.addAttribute("page", page);
            model.addAttribute("ebBrands", ebBrands);
    
            //回显条件数据
            model.addAttribute("queryCondition", queryCondition);
    
            return "item/list";
        }
    
    }

    得到所有的品牌

    使用下拉框来进行遍历出我们所有的品牌就行了。

    开始的时候使用一个空值”全部品牌“

    
            <select id="brandId" name="brandId" >
    
                <option value="">全部品牌</option>
                <c:forEach items="${ebBrands}" var="brand">
                    <option value="${brand.brandId}">${brand.brandName}</option>
                </c:forEach>
            </select>

    这里写图片描述


    设置默认的上架状态

    这里写图片描述

    在我们的页面上,是没有原始的上架状态的。我们使用class属性设置默认的查询上架状态:

            <a id="label6" href="${path}/item/queryItemByCondtion.do" title="全部实体商品" class="here">全部</a>

    测试条件查询

    
            <%--上架的状态模块--%>
            <h2 class="h2_ch"><span id="tabs" class="l">
            <a id="label6" href="${path}/item/listItem.do" title="全部实体商品" class="here">全部</a>
            <a id="label4" href="${path}/item/listItem.do?showStatus=1" title="未上架实体商品"
               class="nor">未上架</a>
            <a id="label5" href="${path}/item/listItem.do?showStatus=0" title="已上架实体商品"
               class="nor">已上架</a>
        </span></h2>
    
            <form id="form1" name="form1" action="${path}/item/listItem.do" method="post">
    
    
                <%--得到初始的上下架状态的值--%>
                <input type="hidden" name="showStatus" value="${queryCondition.showStatus}">
    
                <%--条件查询模块--%>
                <div class="sch">
                    <p>搜索:
                        <select id="brandId" name="brandId">
                            <option value="">全部品牌</option>
                            <c:forEach items="${ebBrands}" var="brand">
                                <option value="${brand.brandId}">${brand.brandName}</option>
                            </c:forEach>
                        </select>
                        <select id="auditStatus" name="auditStatus">
                            <option value="" selected>全部审核状态</option>
                            <option value="0">待审核</option>
                            <option value="1">通过</option>
                            <option value="2">不通过</option>
                        </select>
                        <input type="text" id="searchText" name="itemName" title="请输入商品名称" class="text20 medium gray"/>
                        <input type="submit" id="goSearch" class="hand btn60x20" value="查询"/>
                    </p>
                </div>

    到目前为止,我们4个查询条件可以都使用了。接下来就是我们的数据回显了。

    为什么要数据回显??我们一旦使用了条件查询,跳转到对应的controller时,返回的页面的查询条件就没有了,这是不合理的。因此我们要对条件查询进行回显

    品牌回显:只要查询条件的值等于品牌对应的值,那么我们就选中!

    
            <select id="brandId" name="brandId">
                <option value="">全部品牌</option>
                <c:forEach items="${ebBrands}" var="brand">
                    <option value="${brand.brandId}"  <c:if test="${queryCondition.brandId == brand.brandId}">selected</c:if>>
                    ${brand.brandName}
                    </option>
                </c:forEach>
            </select>

    审核条件回显:只要查询条件的值等于审核条件的值,那么就选中!

    
        <select id="auditStatus" name="auditStatus">
            <option value="" selected>全部审核状态</option>
            <option value="0" <c:if test="${queryCondition.auditStatus==0}">selected</c:if>>待审核</option>
            <option value="1" <c:if test="${queryCondition.auditStatus==1}">selected</c:if>>通过</option>
            <option value="2" <c:if test="${queryCondition.auditStatus==2}">selected</c:if>>不通过</option>
        </select>

    模糊查询回显:

    
    <input type="text" id="searchText" name="itemName" title="请输入商品名称" class="text20 medium gray" value="${queryCondition.itemName}"/>

    上架状态条件回显:

    上架状态的条件并不是通过表单来提交的,而是直接使用超链接定位的。

    
            <a id="label6" href="${path}/item/listItem.do" title="全部实体商品" class="here">全部</a>
            <a id="label4" href="${path}/item/listItem.do?showStatus=1" title="未上架实体商品"
               class="nor">未上架</a>
            <a id="label5" href="${path}/item/listItem.do?showStatus=0" title="已上架实体商品"
               class="nor">已上架</a>

    当我们店家未上架商品的时候,我们的样式应该是会改变到here属性上的。因此,我们想要上架状态条件回显,首先得获取到对应的值

            <%--得到上下架状态的值--%>
             <input type="hidden" id="showStatus" name="showStatus" value="${queryCondition.showStatus}">

    使用jquery代码进行控制样式

    
            $(function () {
                var showStatusVal =  $("#showStatus").val();
                if(showStatusVal=='0') {
                    $("#label5").attr("class", "here");
                }else if(showStatusVal=='1') {
                    $("#label4").attr("class", "here");
                }else {
                    $("#label6").attr("class", "here");
                }
            });

    页面的上分页

    这里写图片描述

    
                <%--页数--%>
                <div class="page_c">
                    <span class="l inb_a">
                    </span>
                    <span class="r page">
                        <input type="hidden" id="pageNo" name="pageNo" />
                        <input type="hidden" value="${page.totalCount}" id="totalCount" name="totalCount"/>
                        <input type="hidden" value="${page.pageNo}" id="currentPageNo" name="currentPageNo"/>
                        <input type="hidden" value="${page.totalPage}" id="totalPage" name="totalPage"/>
                                共<var id="pagePiece" class="orange">${page.totalCount}</var>条<var
                            id="pageTotal">${page.pageNo}/${page.totalPage}</var>
    
                        <a href="javascript:void(0);" id="previous" class="show" title="上一页">上一页</a>
                        <a href="javascript:void(0);" id="next" class="show" title="下一页">下一页</a>
                    </span>
                </div>

    我们也可以使用Jquery代码来对分页进行页面的逻辑控制

    
                //得到当前页数,总页数
                var pageNoVal = parseInt($("#currentPageNo").val());//1,2
                var totalPageVal = parseInt($("#totalPage").val());
    
                //上一页和下一页都不显示的条件
                if (pageNoVal ==1 && pageNoVal==totalPageVal ) {
                    $("#previous").hide();
                    $("#next").hide();
                }//显示下一页,不显示上一页的条件
                else if (pageNoVal == 1 && pageNoVal < totalPageVal) {
                    $("#next").show();
                    $("#previous").hide();
                } //既显示上一页和下一页的条件
                else if(pageNoVal > 1 && pageNoVal < totalPageVal) {
                    $("#next").show();
                    $("#previous").show();
                }//显示上一页,不显示下一页的条件
                else if(pageNoVal > 1 && pageNoVal==totalPageVal) {
                    $("#next").hide();
                    $("#previous").show();
                }
    
                //按钮点击事件
                $("#next").click(function () {
    
                    //将当前页数+1,设置到我们的隐藏域中
                    pageNoVal++;//2
                    $("#pageNo").val(pageNoVal);//2
    
                    //提交表单
                    $("#form1").submit();
                });
    
                $("#previous").click(function () {
                    //将当前页数+1,设置到我们的隐藏域中
                    pageNoVal--;
                    $("#pageNo").val(pageNoVal);
    
                    //提交表单
                    $("#form1").submit();
                });
    
    

    需要值得注意的是:我们在input标签上多了一行这么一段代码:

    
        <input type="hidden" value="${page.pageNo}" id="currentPageNo" name="currentPageNo"/>
    

    那为什么我们要使用currentPageNo这么一行代码呢???而我们的Jquery代码也是拿currentPageNo它的值作为我们页面跳转

    如果没有这行代码,直接使用PageNo会怎么样呢??

    解释:

    其实我们的页面跳转也是需要根据查询条件的结果来进行跳转的

    • 如果我们查询了所有数据,我们跳转到第7页,再设置条件为“三星”,如果直接使用PageNo的话,那么系统就会去找“三星”的第七页数据,显然,这是不合理的,当我们设置了查询条件时,应该跳转到的是“三星”的第一页数据!
    • 归终到底,currentPageNo它就是根据我们当前条件来进行跳转如果查询条件修改了,那么PageNo默认的值是为1的
  • 相关阅读:
    NOI 2020 游记
    BJOI2020 游记
    行列式
    CSP-S 2019 游记
    类欧几里得算法
    有关二次离线和 Yuno loves sqrt technology II
    NOI2019 游记
    CTS 2019 Pearl
    BJOI2019 游记
    2017 山东二轮集训 Day7 国王
  • 原文地址:https://www.cnblogs.com/zhong-fucheng/p/7554328.html
Copyright © 2011-2022 走看看