• javaWeb核心技术第十二篇之分页和条件


    分页:limit ?,?
        参数1 : startIndex  开始索引.
        参数2 : pageSize  每页显示的个数
        n 表示第几页 给定一个特殊的单词  pageNumber
        select * from product;
        
        第一页显示五条数据:
        select * from product LIMIT 0 , 5;
        第二页显示五条数据
        select * from product LIMIT 5 , 5;
        第三页显示五条数据
        select * from product LIMIT 10 , 5;
        
        第N页显示五条数据
        select * from product LIMIT (pageNumber-1)*pageSize , pageSize;
        
        如果只有一个参数 表示 第一页 显示几个数据
        select * from product LIMIT 5;
        
        简单分页查询步骤:
            1.sql : select from table limit ?,?
            2.startIntdex : 开始索引  不可以是负数
            3.pageSize : 每页显示的个数
            4.pageNumber : 用户访问的当前页
            5.由页面发起传入 pageNumber 和 pageSize(目前写死)  在service层中进行计算startIndex
            6.公式 (pageNumber-1)*pageSize
        
        高级分页查询:
            将service返回的六个参数,封装成一个PageBean
        两个传的
            pageNumber,pageSize.
        两个查的
            totalRecord,data
        两个算的
            startIndex,totalPage
        
        在service编写代码逻辑 --> 将所有的代码逻辑封装到PageBean中
        
    /*
        
        <!--分页  class="disabled"  class="active"-->
            <div style="1100px;margin:0 auto;margin-top:50px;">
                
                <ul class="pagination" style="text-align:center; margin-top:10px;">
                    
                    <%-- 如果当前页 等于 1 不需要再显示上一页  如果当前不等于1 显示 --%>
                    <c:if test="${pageBean.pageNumber != 1}">
                        <li ><a href="${pageContext.request.contextPath}/ProductServlet?method=findAll&pageNumber=1" aria-label="Previous"><span aria-hidden="true">&laquo;</span></a></li>
                        <li ><a href="${pageContext.request.contextPath}/ProductServlet?method=findAll&pageNumber=${pageBean.pageNumber - 1 }" aria-label="Previous"><span aria-hidden="true">上一页</span></a></li>
                    </c:if>
                    
                    <%-- 循环显示 所有的页数 --%>
                    <c:forEach begin="${pageBean.start}" end="${pageBean.end}" var="num" step="1">
                        <li ${pageBean.pageNumber == num ? " class='active'"  : ""} ><a href="${pageContext.request.contextPath}/ProductServlet?method=findAll&pageNumber=${num}">${num}</a></li>
                    </c:forEach>
                    
                    <%-- 如果当前页小于总页数 显示下一页 --%>
                    <c:if test="${pageBean.pageNumber < pageBean.totalPage}">
                        <li><a href="${pageContext.request.contextPath}/ProductServlet?method=findAll&pageNumber=${pageBean.pageNumber + 1 }" aria-label="Next"><span aria-hidden="true">下一页</span></a></li>
                        <li><a href="${pageContext.request.contextPath}/ProductServlet?method=findAll&pageNumber=${pageBean.totalPage}" aria-label="Next"><span aria-hidden="true">&raquo;</span></a></li>
                    </c:if>
                    
                    
                </ul>
                
            </div>
            <!-- 分页结束=======================        -->
        
    
        以后专门用来处理分页的数据:
        泛型的定义:
            1:方法级别的定义,修饰和返回值之间<T>
            2:类级别泛型定义,类名后<T>
        public class PageBean<T> {
            /*
            一共六个参数:
            2个传入:
                pageNumber : 表示当前页
                pageSize : 表示每页显示个数
            2个查询
                data : 分页的数据
                totalRecord : 总记录数
            2个计算
                startIndex : 开始索引
                totalPage : 总页数
            private int pageNumber;
            private int pageSize;
            private int totalRecodr;
            private int startIndex;
            private int totalPage;
            private List<T> data;
            
            public int getStartIndex() {
                startIndex = (pageNumber - 1)*pageSize;
            }
            
            public int getTotalPage() {
                if(totalRecord % pageSize == 0) {
                    totalPage = totalRecord / pageSize;
                }else {
                    totalPage = totalRecord / pageSize + 1;
                }
                return totalPage;
            }
            
            public int getPageNumber() {
                return pageNumber;
            }
            
            public void setPageNumber(int pageNumber) {
                this.pageNumber = pageNumber;
            }
        }
        开发中真实案例--前五后四动态条 - 扩展 - 前四后五
            开发中应用:
        //循环的开始
            private int start;
        //循环结束
            private int end;
            
        //计算  开始  和  结束的数据
        private void jisuan() {
            //总页数有没有可能小于10
            //小于 10 不需要前四后五的动态条
            if(getTotalPage() < 10) {//必须调用getTotalPage() 因为totalPage需要提前计算
                start = 1;
                end = totalPage;//最后一页等于最大页数
                
            }else {
                //总页数一定大于10  需要前四后五动态条
                start = pageNumber - 4;
                end = pageNumber + 5;
                //如果start < 1 表示 当前1 2 3 4 总共显示10页
                if(start < 1) {
                    start = 1;
                    end = 10;
                }
                
                //如果end > totalPage 需要 计算start值
                if(end > totalPage) {
                    end = totalPage;
                    start = totalPage - 9;
                }
                
            }
            
        }
        
    案例:代码体现
    
        public class ProductServlet extends HttpServlet {
        
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
            try {
                //获得页面传递的参数 用来执行某段代码
                String method = request.getParameter("method");
                
                ProductService pService = new ProductService();
                CategoryService cService = new CategoryService();
                //根据页面功能执行某段特殊的代码
                if("findAll".equals(method)){
                    /**
                     * 1.类型问题       两种解决方式:   1.正则 2.try
                     * 2.索引不可以是负数
                     */
                    //1.获得 
                    // 获得分页的数据 pageNumber 
                    String pageNumberStr = request.getParameter("pageNumber");            
                    int pageNumber = 1;
                    try {
                        //如果是a 强转失败  赋值操作没有成功  pageNumber = 1 
                        pageNumber = Integer.valueOf(pageNumberStr);
                        if(pageNumber < 1 ){
                            pageNumber = 1;
                        }
                        
                    } catch (Exception e) {
                    }
                    int pageSize = 2;
                    //2.处理
                    //List<Product> pList = pService.findByPage(pageNumber , pageSize);
                    PageBean<Product> pageBean = pService.findByPage(pageNumber , pageSize);
                    //3.响应
                    //3.1 将数据存到request
                    request.setAttribute("pageBean", pageBean);
                    //3.2 请求转发给jsp 
                    request.getRequestDispatcher("/admin/product/product_list.jsp").forward(request, response);
                    return;
                }
                
                //添加商品前查询分类的数据
                if("addProductUI".equals(method)){
                    //1.获得
                    //2.处理
                    //2.1 调用service 查询出所有分类 返回值 List<Category>
                    
                    List<Category> cList = cService.findAll();
                    //3.响应
                    //3.1 将数据存到request
                    request.setAttribute("cList", cList);
                    //3.2 请求转发给product_add.jsp 
                    request.getRequestDispatcher("/admin/product/product_add.jsp").forward(request, response);
                    
                    return;
                }
                
                //添加商品数据
                if("addProduct".equals(method)){
                    
                    //1.获得
                    //1.1 获得map
                    Map<String, String[]> map = request.getParameterMap();
                    //1.2 创建Product
                    Product product = new Product();
                    //1.3 封装数据
                    BeanUtils.populate(product, map);
                    //1.4 手动封装数据
                    product.setPid( UUID.randomUUID().toString().replace("-", "") );//主键会随机生成
                    product.setPimage("products/1/c_0001.jpg");
                    product.setPdate(new Date().toLocaleString());
                    product.setIs_hot(0);//0表示非热门
                    product.setPflag(0);//0表示未下架
                    //2.处理
                    //调用service保存
                    pService.save(product);
                    //3.响应
                    //重定向到查询所有的案例
                    response.sendRedirect(request.getContextPath() +"/ProductServlet?method=findAll");
                    return;
                    
                }
                
                //根据pid查询出商品的信息
                if("findByPid".equals(method)){
                    //1.获得
                    //获得pid的编号
                    String pid = request.getParameter("pid");
                    //2 处理
                    //2.1 商品数据
                    Product product = pService.findByPid(pid);
                    //2.2 分类的数据
                    List<Category> cList = cService.findAll();
                    //3 响应
                    request.setAttribute("product", product);
                    request.setAttribute("cList", cList);
                    request.getRequestDispatcher("/admin/product/product_edit.jsp").forward(request, response);
                    return;
                }
                
                
                //修改商品数据的代码
                if("editProduct".equals(method)){
                    //1.获得
                    //1.1 获得map集合
                    Map<String, String[]> map = request.getParameterMap();
                    //1.2 创建product对象
                    Product product = new Product();
                    //1.3 封装
                    BeanUtils.populate(product, map);
                    //2.处理
                    //2.1 调用service修改
                    boolean flag = pService.update(product);
                    //3.响应
                    //3.1 重定向到查询所有的案例
                    if(flag){
                        //成功
                        response.sendRedirect(request.getContextPath() + "/ProductServlet?method=findAll");
                    }
                    return ;
                }
                
                
                //根据pid删除商品
                if("deleteByPid".equals(method)){
                    //1.获得
                    //获得pid
                    String pid = request.getParameter("pid");
                    //2.处理
                    int count = pService.deleteByPid(pid);
                    //3.响应
                    if(count > 0){
                        response.sendRedirect(request.getContextPath() + "/ProductServlet?method=findAll");
                    }
                    return;
                }
                
            } catch (Exception e) {
                e.printStackTrace();
            }
        
        }
    
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            // TODO Auto-generated method stub
            doGet(request, response);
        }
        
        
        public static void main(String[] args) {
            System.out.println(UUID.randomUUID().toString().replace("-", ""));
            
        }
    
    }
    
    public class ProductService {
        
        
        /*public PageBean<Product> findByPage(int pageNumber, int pageSize) throws SQLException {
            //创建一个即将被返回的对象 PageBean<Product>
            PageBean<Product> pageBean = new PageBean<Product>();
            
            
            ProductDao dao = new ProductDao();
            
            //将pageNumber 转换成startIndex
            int startIndex = (pageNumber - 1) * pageSize;
            
            //查询当前页的2条数据
            List<Product> data = dao.findByPage( startIndex, pageSize);
            
            
            //查询总记录数
            int totalRecord = dao.findRecord();
            
            //计算总页数
            int totalPage = 0;
            if(totalRecord % pageSize == 0 ){
                totalPage = totalRecord / pageSize;
            }else{
                totalPage = totalRecord / pageSize + 1;
            }
            
            //赋值
            pageBean.setData(data);
            pageBean.setPageNumber(pageNumber);
            pageBean.setPageSize(pageSize);
            pageBean.setStartIndex(startIndex);
            pageBean.setTotalPage(totalPage);
            pageBean.setTotalRecord(totalRecord);
            return pageBean;
        }*/
        public PageBean<Product> findByPage(int pageNumber, int pageSize) throws SQLException {
            //创建一个即将被返回的对象 PageBean<Product>
            PageBean<Product> pageBean = new PageBean<Product>( pageNumber , pageSize);
            
            ProductDao dao = new ProductDao();
            
            //查询当前页的2条数据
            List<Product> data = dao.findByPage( pageBean.getStartIndex() , pageSize);
            
            //查询总记录数
            int totalRecord = dao.findRecord();
            
            //赋值
            pageBean.setData(data);
            pageBean.setTotalRecord(totalRecord);
            return pageBean;
        }
    
        public List<Product> findAll() throws SQLException {
            ProductDao dao = new ProductDao();
            return dao.findAll();
        }
    
        public void save(Product product) throws SQLException {
            ProductDao dao = new ProductDao();
             dao.save(product);
        }
    
        public Product findByPid(String pid) throws SQLException {
            ProductDao dao = new ProductDao();
            return  dao.findByPid(pid);
        }
    
        public boolean update(Product product) throws SQLException {
            ProductDao dao = new ProductDao();
            return  dao.update(product);
        }
    
        public int deleteByPid(String pid) throws SQLException {
            ProductDao dao = new ProductDao();
            return dao.deleteByPid(pid);
        }
    
        
    
    }
    
    package com.baidu.domain;
    
    public class Product {
    
         /* 
          `pid` VARCHAR(32) NOT NULL,
          `pname` VARCHAR(50) DEFAULT NULL,        #商品名称
          `market_price` DOUBLE DEFAULT NULL,    #商场价
          
          `shop_price` DOUBLE DEFAULT NULL,        #商城价
          `pimage` VARCHAR(200) DEFAULT NULL,    #商品图片路径
          `pdate` DATE DEFAULT NULL,            #上架时间
          
          `is_hot` INT(11) DEFAULT NULL,        #是否热门:0=不热门,1=热门
          `pdesc` VARCHAR(255) DEFAULT NULL,    #商品描述
          `pflag` INT(11) DEFAULT 0,            #商品标记:0=未下架(默认值),1=已经下架
          
          `cid` VARCHAR(32) DEFAULT NULL,        #分类id*/
        
        private String pid;
        private String pname;
        private double market_price;
        
        private double shop_price;
        private String pimage;
        private String pdate;
        
        private int is_hot;
        private String pdesc;
        private int pflag;
        
        private String cid;
    
        public String getPid() {
            return pid;
        }
    
        public void setPid(String pid) {
            this.pid = pid;
        }
    
        public String getPname() {
            return pname;
        }
    
        public void setPname(String pname) {
            this.pname = pname;
        }
    
        public double getMarket_price() {
            return market_price;
        }
    
        public void setMarket_price(double market_price) {
            this.market_price = market_price;
        }
    
        public double getShop_price() {
            return shop_price;
        }
    
        public void setShop_price(double shop_price) {
            this.shop_price = shop_price;
        }
    
        public String getPimage() {
            return pimage;
        }
    
        public void setPimage(String pimage) {
            this.pimage = pimage;
        }
    
        public String getPdate() {
            return pdate;
        }
    
        public void setPdate(String pdate) {
            this.pdate = pdate;
        }
    
        public int getIs_hot() {
            return is_hot;
        }
    
        public void setIs_hot(int is_hot) {
            this.is_hot = is_hot;
        }
    
        public String getPdesc() {
            return pdesc;
        }
    
        public void setPdesc(String pdesc) {
            this.pdesc = pdesc;
        }
    
        public int getPflag() {
            return pflag;
        }
    
        public void setPflag(int pflag) {
            this.pflag = pflag;
        }
    
        public String getCid() {
            return cid;
        }
    
        public void setCid(String cid) {
            this.cid = cid;
        }
        
        
        
        
    }
    
    public class ProductDao {
        /**
         * 分页的dao
         * @param startIndex
         * @param pageSize
         * @return
         * @throws SQLException 
         */
        public List<Product> findByPage(int startIndex, int pageSize) throws SQLException {
            QueryRunner queryRunner = new QueryRunner(C3P0Utils.getDataSource());
            String sql =" select * from product limit ?,? ";
            Object [] params = {
                    startIndex , pageSize
            };
            return queryRunner.query(sql, new BeanListHandler<Product>(Product.class), params);
        }
        /**
         * 计算总记录数
         * @return
         * @throws SQLException 
         */
        public int findRecord() throws SQLException {
            QueryRunner queryRunner = new QueryRunner(C3P0Utils.getDataSource());
            String sql =" select count(*) from product ";
            Object [] params = {
            };
            Object object = queryRunner.query(sql, new ScalarHandler(), params);
            return Integer.valueOf(object.toString());
        }    
    
        public List<Product> findAll() throws SQLException {
            QueryRunner queryRunner = new QueryRunner(C3P0Utils.getDataSource());
            
            String sql =" select * from product order by pdate desc ";
            
            Object [] params = {};
            
            return queryRunner.query(sql, new BeanListHandler<Product>(Product.class), params);
        }
    
        public void save(Product product) throws SQLException {
            QueryRunner queryRunner = new QueryRunner(C3P0Utils.getDataSource());
            
            String sql =" insert into product values(?,?,?,?,?,?,?,?,?,?) ";
            
            Object [] params = {
                    product.getPid() , product.getPname() , product.getMarket_price() , 
                    product.getShop_price() , product.getPimage() , product.getPdate() , 
                    product.getIs_hot() , product.getPdesc() , product.getPflag() , 
                    product.getCid()
            };
            
            queryRunner.update(sql, params);
        }
    
        public Product findByPid(String pid) throws SQLException {
            QueryRunner queryRunner = new QueryRunner(C3P0Utils.getDataSource());
            
            String sql =" select * from product where pid = ? ";
            
            Object [] params = {pid};
            
            return queryRunner.query(sql, new BeanHandler<Product>(Product.class), params);
        }
    
        public boolean update(Product product) throws SQLException {
            
            QueryRunner queryRunner = new QueryRunner(C3P0Utils.getDataSource());
            
            String  sql = " update product set pname = ? , shop_price = ? , pdesc = ? , cid = ? where pid = ?  ";
            
            Object [] params = {
                    product.getPname() , product.getShop_price() , product.getPdesc() , 
                    product.getCid() , product.getPid()
            };
            
            
            
            return queryRunner.update(sql, params) > 0 ;
        }
    
        public int deleteByPid(String pid) throws SQLException {
    
            QueryRunner queryRunner = new QueryRunner(C3P0Utils.getDataSource());
            
            String  sql = " delete from product where pid = ?  ";
            
            Object [] params = {
                    pid
            };
            
            
            
            return queryRunner.update(sql, params)  ;
        }
        
    /**
     * 处理乱码的工具类
     *
     */
    public class EncodingFilter implements Filter {
    
    
        public void destroy() {
            // TODO Auto-generated method stub
        }
    
        public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
            final HttpServletRequest request = (HttpServletRequest)req;
            HttpServletResponse response = (HttpServletResponse)resp;
            try {
                
                //处理post乱码
                request.setCharacterEncoding("utf-8");
                
                //处理响应
                response.setHeader("content-type", "text/html;charset=utf-8");
                
                //处理get乱码
                HttpServletRequest myRequest = (HttpServletRequest)Proxy.newProxyInstance(
                        EncodingFilter.class.getClassLoader(), 
                        request.getClass().getInterfaces(), 
                        new InvocationHandler() {
                            @Override
                            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                                
                                //可以对getParameter进行增强   get提交方式
                                
                                //1.判断是get请求方式
                                String requestMethod= request.getMethod();
                                if("GET".equalsIgnoreCase(requestMethod)){
                                    //get提交  只对getParameter方法进行拦截
                                    String methodName = method.getName();
                                    if("getParameter".equals(methodName)){
                                        //get方式 并且 调用的getParameter方法
                                        //获得以前乱码 return 不乱码
                                        String tempValue = request.getParameter(args[0].toString());
                                        //如果没有获得数据 防止空指针
                                        if(tempValue == null){
                                            return null;
                                        }
                                        return new String(tempValue.getBytes("iso-8859-1"),"utf-8");
                                        
                                    }
                                }
                                
                                //不需要增强
                                return method.invoke(request, args);
                            }
                        });
                
                //放行
                chain.doFilter(myRequest, response);
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        public void init(FilterConfig fConfig) throws ServletException {
            // TODO Auto-generated method stub
        }
    
    }
    
    jsp代码:
        <%-- 获得数据 并遍历 --%>
                                    <c:forEach items="${pageBean.data}" var="product">
                                        <tr onmouseover="this.style.backgroundColor = '#F5FAFE'"
                                            onmouseout="this.style.backgroundColor = '#fff';">
                                            <td style="CURSOR: hand; HEIGHT: 22px" align="center">
                                                <input type="checkbox" name="" value="" />
                                            </td>
                                            <td style="CURSOR: hand; HEIGHT: 22px" align="center">
                                                <img src="${pageContext.request.contextPath}/${product.pimage}" style="height: 200px;150px" />
                                            </td>
                                            <td style="CURSOR: hand; HEIGHT: 22px" align="center">
                                                ${product.cid}
                                            </td>
                                            <td style="CURSOR: hand; HEIGHT: 22px" align="center">
                                                ${product.pname}
                                            </td>
                                            <td style="CURSOR: hand; HEIGHT: 22px" align="center">
                                                ${product.shop_price}
                                            </td>
                                            <td style="CURSOR: hand; HEIGHT: 22px" align="center">
                                                ${product.pdesc}
                                            </td>
                                            <td align="center" style="HEIGHT: 22px">
                                                <%--编辑 --%>
                                                <a href="${pageContext.request.contextPath}/ProductServlet?pid=${product.pid}&method=findByPid">
                                                    <img src="${pageContext.request.contextPath}/images/i_edit.gif" border="0" style="CURSOR: hand">
                                                </a>
                                            </td>
                                            <td align="center" style="HEIGHT: 22px">
                                                <%--查询 --%>
                                                <a href="../user/view.html?userID=15">
                                                    <img src="${pageContext.request.contextPath}/images/button_view.gif" border="0" style="CURSOR: hand">
                                                </a>
                                            </td>
                                            <td align="center" style="HEIGHT: 22px">
                                                <%--删除  ctrl + q --%>
                                                <a href="${pageContext.request.contextPath}/ProductServlet?method=deleteByPid&pid=${product.pid}">
                                                    <img src="${pageContext.request.contextPath}/images/i_del.gif" width="16" height="16" border="0" style="CURSOR: hand">
                                                </a>
                                                
                                                
                                                <%--提示删除 --%>
                                                <a href="javascript:void(0)" onclick="deleteByPid('${product.pid}')">
                                                    <img src="${pageContext.request.contextPath}/images/i_del.gif" width="16" height="16" border="0" style="CURSOR: hand">
                                                </a>
                                            </td>
                                                
                                        </tr>
                                    </c:forEach>
                                    <%-- 获得数据 并遍历 --%>
                                    <script>
                                        //javascript 需要在写在 header标签中
                                        function deleteByPid(pid){
                                            //alert(pid);
                                            //提示用户 
                                            var flag = confirm("您确定要删除信息吗?");
                                            if(flag){
                                                //确定删除
                                                //访问服务器删除的Servlet
                                                //修改地址栏 跳转路径  等效我们自己点击超链接
                                                location.href="${pageContext.request.contextPath}/ProductServlet?method=deleteByPid&pid="+pid;
                                            }
                                        }
                                    </script>
                            </table>
                        </td>
                    </tr>
                </TBODY>
            </table>
            <!--分页  class="disabled"  class="active"-->
            <div style="1100px;margin:0 auto;margin-top:50px;">
                
                <ul class="pagination" style="text-align:center; margin-top:10px;">
                    
                    <%-- 如果当前页 等于 1 不需要再显示上一页  如果当前不等于1 显示 --%>
                    <c:if test="${pageBean.pageNumber != 1}">
                        <li ><a href="${pageContext.request.contextPath}/ProductServlet?method=findAll&pageNumber=1" aria-label="Previous"><span aria-hidden="true">&laquo;</span></a></li>
                        <li ><a href="${pageContext.request.contextPath}/ProductServlet?method=findAll&pageNumber=${pageBean.pageNumber - 1 }" aria-label="Previous"><span aria-hidden="true">上一页</span></a></li>
                    </c:if>
                    
                    <%-- 循环显示 所有的页数 --%>
                    <c:forEach begin="${pageBean.start}" end="${pageBean.end}" var="num" step="1">
                        <li ${pageBean.pageNumber == num ? " class='active'"  : ""} ><a href="${pageContext.request.contextPath}/ProductServlet?method=findAll&pageNumber=${num}">${num}</a></li>
                    </c:forEach>
                    
                    <%-- 如果当前页小于总页数 显示下一页 --%>
                    <c:if test="${pageBean.pageNumber < pageBean.totalPage}">
                        <li><a href="${pageContext.request.contextPath}/ProductServlet?method=findAll&pageNumber=${pageBean.pageNumber + 1 }" aria-label="Next"><span aria-hidden="true">下一页</span></a></li>
                        <li><a href="${pageContext.request.contextPath}/ProductServlet?method=findAll&pageNumber=${pageBean.totalPage}" aria-label="Next"><span aria-hidden="true">&raquo;</span></a></li>
                    </c:if>
                    
                    
                </ul>
                
            </div>
            <!-- 分页结束=======================        -->
    
    
        
        条件查询:
            1: 先在首页上查询分类数据,并且遍历显示
                分析:
                    select * from product where cid = ? and pname = ?;
                    含有的可能性:
                        1.两者都有.
                        2.两者都没有.
                        3.有cid但没有pname
                        4.没有cid但有pname
                    
                    select count(*) from product where 1=1;
                    伪代码:
                        SQL = " select * from product where 1=1 ";
                        if(cid != null) {
                            SQL += " and cid = ? "
                        }
                        if(pname != null) {
                            SQL += " and pname like ? "
                        }
            1: 修改表单 action属性,method属性,name属性,自定义的method判断逻辑.
            2: 调用Servlet
                a : 获得 cid和pname
                b : 处理 调用service 调用dao(重要)
                c : 响应 - 将数据存到request里,请求转发给product_list.jsp
            3.对jsp页面进行改造
            
        条件查询注意事项:
            1 . Dao的sql部分,拼接的问题,使用 where 1=1 解决了脏读、不可重复读、
            2 . Dao的参数拼接部分,使用List接收数据,最后将list转换成数组,解决.
            3 . 查询完以后将数据返回给页面,但还需要加上,用户传入后台的cid和pname;
        切记:条件查询 不可以 和 分页 同一个项目 但以后 条件查询需要和分页结合
            4 . 如果条件查询和分页需要做到同一个项目,需要处理参数问题.
            5 . PageBean 查询总记录数 --> 如果加入条件查询,查询总记录数时需要加上条件.
        
    案例:代码体现
        public class ProductServlet extends HttpServlet {
        
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
            try {
                //获得页面传递的参数 用来执行某段代码
                String method = request.getParameter("method");
                
                ProductService pService = new ProductService();
                CategoryService cService = new CategoryService();
                //根据页面功能执行某段特殊的代码
                if("findAll".equals(method)){
                    //执行查询所有的代码
                    //1.获得
                    //1.31 获得cid
                    String cid = request.getParameter("cid");
                    //1.2 获得pname
                    String pname = request.getParameter("pname");
                    
                    
                    //2.处理
                    List<Product> pList = pService.findAll( cid , pname );
                    List<Category> cList = cService.findAll();
                    //3.响应
                    //3.1 将数据存到request
                    request.setAttribute("pList", pList);
                    request.setAttribute("cList", cList);
                    
                    request.setAttribute("cid", cid);
                    request.setAttribute("pname", pname);
                    
                    //3.2 请求转发给jsp 
                    request.getRequestDispatcher("/admin/product/product_list.jsp").forward(request, response);
                    return;
                }
    
    public class ProductDao {
        /**
         * 条件查询
         * @param cid
         * @param pname
         * @return
         * @throws SQLException 
         */
        public List<Product> findAll(String cid, String pname) throws SQLException {
            QueryRunner queryRunner = new QueryRunner(C3P0Utils.getDataSource());
            
            String  sql = " select * from product where 1=1 ";
            
            //定义一个List  作用 用来保存参数 
            List<Object> paramList = new ArrayList<Object>();
            //cid判断
            if(cid != null && !"".equals(cid)){
                sql += " and cid = ?  ";
                paramList.add(cid);
            }
            //pname判断
            if(pname != null && !"".equals(pname)){
                sql += " and pname like ?  ";
                paramList.add("%"+pname+"%");
            }
            
            //数组的缺陷 长度固定  集合的长度不固定   集合最后转换成数组
            Object [] params = paramList.toArray();
            
            return queryRunner.query(sql,new BeanListHandler<Product>(Product.class), params);
            
        }
        
        <form action="${pageContext.request.contextPath}/ProductServlet" method="post">
                                <%--隐藏域 --%>
                                <input type="hidden" name="method" value="findAll"/>
                            
                                <table cellpadding="0" cellspacing="0" border="0" width="100%">
                                    <tr>
                                        <td height="22" align="center" bgColor="#f5fafe" class="ta_01" style=" 15%">
                                            分类
                                        </td>
                                        <td class="ta_01" bgColor="#ffffff" style=" 30%">
                                            <select name="cid" class="form-control">
                                                <option value="">请选择</option>
                                                <c:forEach items="${cList}" var="category">
                                                    <option ${category.cid==cid ? "selected" : ""} value="${category.cid}">${category.cname}</option>
                                                </c:forEach>
                                            </select>
                                        </td>
                                        <td height="22" align="center" bgColor="#f5fafe" class="ta_01" style=" 15%">
                                            商品名称:
                                        </td>
                                        <td class="ta_01" bgColor="#ffffff">
                                            <input type="text" name="pname" size="15" value="${pname}" class="form-control"/>
                                        </td>
                
        
        批量删除:
            思想:
                前台两套方法:
                    1 . 表单提交:将所有被选中的数据,的pid传入后台,后台执行批量删除.
                    2 . 修改sql 修改成 sql=" delete from product where pid in (?) " 数据循环拼接 1,2,4
                    3 . 开发中会使用jdbc jdbc当中有批处理,也可以处理批量任务.
            
                事务特性:
                    A : 原子性;
                    C : 一致性;
                    I : 隔离性 : isolation 隔离会产生隔离问题
                    D : 持久性.
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
            try {
                //获得页面传递的参数 用来执行某段代码
                String method = request.getParameter("method");
                
                ProductService pService = new ProductService();
                CategoryService cService = new CategoryService();
                //根据pid删除商品
                if("deleteByPid".equals(method)){
                    //1.获得
                    //获得数组集合
                    String[] pids = request.getParameterValues("pid");
                    //2.处理
                    int count = pService.deleteByPid(pids);
                    //3.响应
                    if(count > 0){
                        response.sendRedirect(request.getContextPath() + "/ProductServlet?method=findAll");
                    }
                    return;
                }
                
        <td align="center" width="6%">
                                        <input type="button" value="删除选中" onclick="deleteAll()">
                                        <script>
                                            function deleteAll(){
                                                //1.提示
                                                var flag = confirm("您确定要删除信息吗?");
                                                if(!flag){
                                                    return ; 
                                                }
                                                //2.获得所有选中的pid 获得所有的数组 最后的格式 pid=1&pid=2&pid3..
                                                var pids = $("input[name='pid']:checked").serialize() ;
                                                //3.发送
                                                location.href="${pageContext.request.contextPath}/ProductServlet?method=deleteByPid&"+pids;
                                            }
                                        </script>
                                    </td>
                                    <td align="center" width="15%">
                                        预览图
                                    </td>
                                    <td align="center" width="12%">
                                        商品分类
                                    </td>
                                    <td align="center" width="25%">
                                        商品名称
                                    </td>
                                    <td align="center" width="8%">
                                        商品价格
                                    </td>
                                    <td width="11%" align="center">
                                        描述
                                    </td>
                                    <td width="7%" align="center">
                                        编辑
                                    </td>
                                    <td width="7%" align="center">
                                        查看
                                    </td>
                                    <td width="7%" align="center">
                                        删除
                                    </td>
                                </tr>
                                    <%-- 获得数据 并遍历 --%>
                                    <c:forEach items="${pList}" var="product">
                                        <tr onmouseover="this.style.backgroundColor = '#F5FAFE'"
                                            onmouseout="this.style.backgroundColor = '#fff';">
                                            <td style="CURSOR: hand; HEIGHT: 22px" align="center">
                                                <input type="checkbox" name="pid" value="${product.pid}" />
                                            </td>
                                            <td style="CURSOR: hand; HEIGHT: 22px" align="center">
                                                <img src="${pageContext.request.contextPath}/${product.pimage}" style="height: 200px;150px" />
                                            </td>
                                            <td style="CURSOR: hand; HEIGHT: 22px" align="center">
                                                ${product.cid}
                                            </td>
                                            <td style="CURSOR: hand; HEIGHT: 22px" align="center">
                                                ${product.pname}
                                            </td>
                                            <td style="CURSOR: hand; HEIGHT: 22px" align="center">
                                                ${product.shop_price}
                                            </td>
                                            <td style="CURSOR: hand; HEIGHT: 22px" align="center">
                                                ${product.pdesc}
                                            </td>
                                            <td align="center" style="HEIGHT: 22px">
                                                <%--编辑 --%>
                                                <a href="${pageContext.request.contextPath}/ProductServlet?pid=${product.pid}&method=findByPid">
                                                    <img src="${pageContext.request.contextPath}/images/i_edit.gif" border="0" style="CURSOR: hand">
                                                </a>
                                            </td>
                                            <td align="center" style="HEIGHT: 22px">
                                                <%--查询 --%>
                                                <a href="../user/view.html?userID=15">
                                                    <img src="${pageContext.request.contextPath}/images/button_view.gif" border="0" style="CURSOR: hand">
                                                </a>
                                            </td>
                                            <td align="center" style="HEIGHT: 22px">
                                                <%--删除  ctrl + q --%>
                                                <a href="${pageContext.request.contextPath}/ProductServlet?method=deleteByPid&pid=${product.pid}">
                                                    <img src="${pageContext.request.contextPath}/images/i_del.gif" width="16" height="16" border="0" style="CURSOR: hand">
                                                </a>
                                                
                                                
                                                <%--提示删除 --%>
                                                <a href="javascript:void(0)" onclick="deleteByPid('${product.pid}')">
                                                    <img src="${pageContext.request.contextPath}/images/i_del.gif" width="16" height="16" border="0" style="CURSOR: hand">
                                                </a>
                                            </td>
                                                
                                        </tr>
                                    </c:forEach>
                                    <%-- 获得数据 并遍历 --%>
                                    <script>
                                        //javascript 需要在写在 header标签中
                                        function deleteByPid(pid){
                                            //alert(pid);
                                            //提示用户 
                                            var flag = confirm("您确定要删除信息吗?");
                                            if(flag){
                                                //确定删除
                                                //访问服务器删除的Servlet
                                                //修改地址栏 跳转路径  等效我们自己点击超链接
                                                location.href="${pageContext.request.contextPath}/ProductServlet?method=deleteByPid&pid="+pid;
                                            }
                                        }
                                    </script>
                            </table>
                        </td>
                    </tr>
                </TBODJY>
            </table>
            
    数据库开启手动提交以后,只要commit以后,会改成自动提交.查一下是否改成了自动提交
  • 相关阅读:
    Docker容器常用操作命令(镜像的上传、下载、导入、导出、创建、删除、修改、启动等)详解
    [20191213]toad 12下BIND_AWARE提示无效.txt
    [20191206]隐含参数_db_always_check_system_ts.txt
    [20191127]表 full Hash Value的计算.txt
    [20191127]探究等待事件的本源4.txt
    [20191126]探究等待事件的本源2.txt
    [20191125]oracel SQL parsing function qcplgte 2.txt
    [20191125]探究等待事件的本源.txt
    [20191122]oracel SQL parsing function qcplgte.txt
    [20191119]探究ipcs命令输出2.txt
  • 原文地址:https://www.cnblogs.com/haizai/p/11442985.html
Copyright © 2020-2023  润新知