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="width: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;width: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="width: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="width: 15%">
                                        分类
                                    </td>
                                    <td class="ta_01" bgColor="#ffffff" style="width: 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="width: 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;width: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以后,会改成自动提交.查一下是否改成了自动提交

原文地址:https://www.cnblogs.com/haizai/p/11442985.html

时间: 2024-11-06 12:43:14

javaWeb核心技术第十二篇之分页和条件的相关文章

javaWeb核心技术第十四篇之easyui

网站是分为网站的前台和网站的后台. 前台--给用户看的 例如:商城 后台--给管理员看的 例如:商城后台 目的:用来添加维护数据 BootStrap:jsp 页面显示,效果好,美观,适合作为用户界面. EasyUI : jsp页面,快速开发,格式统一,美观效果一般. EasyUI里面有很多组件(功能模块):有自己的特使,但编写简单,只需固定html代码结构. EasyUI环境搭建: 1.导入css , 需要2个css 2.导入jquery,需要2个js <link rel="stylesh

2016年8月18日 javaweb回顾第十二篇监听器

前言:在web应用中,有时候你想在web应用程序启动或关闭的时候执行一些任务,或者你想见他Session的创建和关闭等你就可以通过监听器来实现.那么Servlet来8个监视器接口,下面一一讲解一下. 1:ServletContextListener和ServletContextAttributeListener 1.1:ServletContextListener主要用于容器的启动和关闭时候进行监听.有2个方法分别用于监听容器启动和关闭.比喻我们在容器启动的时候做数据库连接的初始化.容器关闭时候

Python开发【第二十二篇】:Web框架之Django【进阶】

Python开发[第二十二篇]:Web框架之Django[进阶] 猛击这里:http://www.cnblogs.com/wupeiqi/articles/5246483.html 博客园 首页 新随笔 联系 订阅 管理 随笔-124  文章-127  评论-205 Python之路[第十七篇]:Django[进阶篇 ] Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接数据库,并编写数据访问层代码 业务逻

SaltStack 学习笔记 - 第十二篇: SaltStack Web 界面

SaltStack 有自身的用python开发的web界面halite,好处是基于python,可以跟salt的api无缝配合,确定就比较明显,需要个性化对web界面进行定制的会比较麻烦,如果喜欢体验该界面的可以参考下面的文章  http://rfyiamcool.blog.51cto.com/1030776/1275443/ 我是运用另一个python+php来进行web开发,具体需要的工具有在我的另一篇文章里面介绍过,这里再重新进行整个开发介绍 首先介绍php 跟python通信的工具 pp

第二十二篇:再写Windows驱动,再玩Windbg---NET

2011年到现在,就没再怎么搞过Windows驱动了. 最近, 由于项目需要, 试着改一改一个显卡驱动(KMDOD), 从实践上证明, 我在理论上对一个驱动的架构的正确与否.(USB Display = KMDOD + AVStream). 其中, KMDOD是完成显示的部分功能, 完成其中的VidPN(Video present network), 将驱动中原来的POST物理设备转变为USB物理设备. 而AVStream之所以这样提出, 完成是由于USB Video class的启发, 要不然

SQL Server 索引的图形界面操作 &lt;第十二篇&gt;

一.索引的图形界面操作 SQL Server非常强大的就是图形界面操作.关于索引方面也一样那么强大,很多操作比如说重建索引啊,查看各种统计信息啊,都能够通过图形界面快速查看和操作,下面来看看SQL Server索引方面的GUI操作. 二.索引统计信息的图形界面操作 SQL Server 索引的图形界面操作 <第十二篇>

第二十二篇 信念

第二十二篇  信念 "信念"能带给一个人无穷的力量,这些力量可以支撑自己走过漫长的人生.一个人如果没有信念,就很难找到自己的人生方向,所以"信念"也可以理解为希望. 信念可以给到我们希望,也可以给到我们力量,所以一个人的信念会影响到自己的整个人生.当然信念也有好坏之分,好的信念能让自己积极向上.不畏艰难:坏的信念会让我们不思进取.随波逐流.这两种不同的信念会给到我们两种完全不同的人生,就看亲人们如何作出正确的选择. 一个人活在世上,可以选择走正确的人生道路,依靠好的

解剖SQLSERVER 第十二篇 OrcaMDF 行压缩支持(译)

解剖SQLSERVER 第十二篇   OrcaMDF 行压缩支持(译) http://improve.dk/orcamdf-row-compression-support/ 在这两个月的断断续续的开发工作中,我终于将OrcaMDF 压缩功能分支合并到主分支这意味着OrcaMDF 现在正式支持数据行压缩功能 支持的数据类型实现行压缩需要我修改几乎所有已实现的数据类型以将他们作为压缩存储.integer类型被压缩了,decimal类型变成可变长度,而可变长度类型基本上都被截断了进而用0来填补.所有先

python学习[第十二篇] 数据类型之 集合

python学习[第十二篇] 数据类型之 集合 集合概念 python中集合是一组无序排列的哈希值.集合分为两种可变集合(set)和不可变集合(frozenset) 对可变集合可以修改和删除元素,对于不可变集合不允许.可变集合是不可以哈希的,因此既不能用作字典的键,也不能做其他集合的元素. 集合的增删改查 集合的创建于赋值 集合与列表([]) 和字典({})不同,集合没有特别的语法格式.列表和字典可以通过他们自己的工厂方法创建,这也是集合的唯一的创建方式.set()和frozenset() #创