JavaWeb学习笔记七:利用EL表达式和JSTL表达式实现商品分页

文章目录

      • 1. 分页技术的实现
        • 1.1. 建立pageBean
        • 1.2. web层调用Service层实现PageBean的封装
        • 1.3. 利用EL表达式和JSTL表达式实现前端页面
        • 1.4. web层接收jsp传来的参数
        • 1.5. 分页技术总结。

1. 分页技术的实现

1.1. 建立pageBean

  1. 可以这样想,如果要建立分页,前端页面要从request域里面获取什么?1)获取当前页数2)获取从数据库查询的商品信息product 3)获取总页数totalPage.这些东西都要通过request.setAttribute()传递到request域,为了方便简写我们可以将这些东西封装成一个对象PageBean
public class PageBean<T> {
     
	// 当前页
	private int currentPage;
	// 当前页显示的条数
	private int currentCount;
	// 总条数
	private int totalCount;
	// 总页数
	private int totalPage;
	// 每页显示的数据,初始化
	private List<T> productList=new ArrayList<T>();

1.2. web层调用Service层实现PageBean的封装

  1. 调用Service层,该层目的就是实现PageBean的封装,一方面从数据库中获取商品信息,一方面进行对web层传来的数据进行处理。

  2. service层要对上面5个属性进行获取封装。

第一个: currentPage是当前页,当前页是多少来源于前端,是从前端获取的。在开发时可以先模拟预设一个,模拟为1。

pageBean.setCurrentPage(currentPage);

第二个: currentCount是当前页显示的条数,自然也是来自前端,在开发时先模拟你一个,这里模拟为12.

pageBean.setCurrentCount(currentCount);

第三个: totalCount是总条数,也就是商品总记录数,这个来源于数据库的查找,可以调用dao去操作数据库。

int totalCount= dao.getTotalCount();
public int getTotalCount() throws SQLException {
     
    QueryRunner runner =new QueryRunner(DataSourceUtils.getDataSource());
    String sql="select count(*) from product";
    Long query=(Long)runner.query(sql, new ScalarHandler());
    return query.intValue();
}
  • 注意 ScalarHandler返回的是Long型,query.intValue()是将Long型转化为int型。

第四个: totalPage是总页数,也就是这么多记录数能占多少页,这个需要计算一下,总页数=总记录数/每页记录数。

int totalPage=(int)Math.ceil(1.0*totalCount/currentCount);
  • 注意: Math.ceil(x);返回的是大于或等于参数x的最小整数。用1.0相乘是将其变化为double型。

第五个: productList返回的是每页显示的数据,需要传递当前页的起始值,当前页显示的条数,通过sql语句获取product然后再返回结果。并将结果封装到pageBean中。

//service层
List<Product> productList=dao.findProductListForPageBean(index,currentCount);
pageBean.setProductList(productList);
//获得分页的商品数据
public List<Product> findProductListForPageBean(int index,int currentCount) throws SQLException {
     
	QueryRunner runner=new QueryRunner(DataSourceUtils.getDataSource());
	String sql="select * from product limit ?,?";
	return runner.query(sql, new BeanListHandler<Product(Product.class),index,currentCount);
}
  • 注意sql语句的书写,limit 是从哪到哪。总之,后台的操作就完成了。剩下的是前端如何从中取值了。

1.3. 利用EL表达式和JSTL表达式实现前端页面

  1. 首先是从request域中获取pageBean中的productList,由于productList是List集合,因此需要用到JSTL表达式的

    

${product.pname }

商城价:¥${product.shop_price }

  • 通过EL表达式获取productList中的值。
  1. 还需要解决页面序号问题

页码

第一: 通过forEach实现页面序号

第二: 判断是否是当前页,如果不是就跳转,是就不能跳转


    
        
  • ${page }
  • ${page }
  • 第三: 判断是否是第一页,如果是不能点击前一页,判断是否是最后一页,如果是不能点击后一页。

    
    	
  • 
    	
  • 1.4. web层接收jsp传来的参数

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
         
    		//调用service层
    		ProductService service=new ProductService();
    		//从web层获取当前页,刚开始肯定为空,如果为空就设置当前页为第一页。
    		String currentPageStr=request.getParameter("currentPage");
    		if(currentPageStr==null) 
    			currentPageStr="1";
        	//用包装类Integer将字符串设置为int类型
    		int currentPage=Integer.parseInt(currentPageStr);
    		//设置每页显示多少条
    		int currentCount=12;
    		PageBean<Product> pageBean=null;
    		try {
         
    			pageBean=service.findPageBean(currentPage,currentCount);
    		} catch (Exception e) {
         
    			e.printStackTrace();
    		}
        	//转发到product_list.jsp页面
    		request.setAttribute("pageBean", pageBean);
    		request.getRequestDispatcher("/product_list.jsp").forward(request, response);	
    	}
    

    1.5. 分页技术总结。

    1. 首先要建立一个分页Bean对象,这个对象包含5个属性,分别是:1)当前页。2)当前页的条数。3)总记录数。4)总页数。5)当前页的内容。
    2. 其中1)当前页的值是从前端传过来的。2)当前页的记录数是设定的,这里在web层设定了。3)总记录数是通过数据库查询得到的。4)总页数是经过计算得到的。5)当前页的内容也是通过数据库获得的。将这些值获取后封装到Bean对象。后台代码基本就完成了。
    3. 然后就是前端页面了,前端页面要通过EL表达式和JSTL表达式获取每个product的信息。
    4. 分页时先通过forEach的begin和end将页码写出来,然后判断当前页是否是选中的页,是不跳转,不是就跳转到选取的页。
    5. 针对前一页后一页进行操作,当为第一页时,无法点击前一页,当为最后一页时,后一页无法操作。
    6. 最后将web层的当前页修改成动态的,即从request域中获取参数,因为跳转的时候是get提交,可以通过request.getParameter()获取当前页,注意一点当第一次访问时是没有当前页的,那么就要默认设置为1.

    你可能感兴趣的:(javaWeb笔记,分页技术,商品分页,EL表达式,JSTL表达式)