­

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

  • 2019 年 10 月 5 日
  • 笔记

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/zhao1299002788/article/details/100185351

	分页: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  											//修改地址栏 跳转路径  等效我们自己点击超链接  											kk="${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.发送  											kk="${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  											//修改地址栏 跳转路径  等效我们自己点击超链接  											kk="${pageContext.request.contextPath}/ProductServlet?method=deleteByPid&pid="+pid;  										}  									}  								</script>  						</table>  					</td>  				</tr>  			</TBODJY>  		</table>    数据库开启手动提交以后,只要commit以后,会改成自动提交.查一下是否改成了自动提交