前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >javaWeb核心技术第十二篇之分页和条件

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

作者头像
海仔
发布2019-09-18 14:37:09
8890
发布2019-09-18 14:37:09
举报
文章被收录于专栏:海仔技术驿站海仔技术驿站

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

本文链接:https://cloud.tencent.com/developer/article/1508628

代码语言:javascript
复制
	分页: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以后,会改成自动提交.查一下是否改成了自动提交
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年09月01日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档