java编写带过滤分页的通讯录

大家好,我是Java编程路上的小白。最近刚刚教完web基础,于是我便把项目分析了一遍并发表到博客上,请大家多多指点。

这是设计图:



下面便是我制作整个,这个带过滤分页条件的通讯录的流程:







以上程序设计图可能会有很多问题吧,请大家多多指教大笑。如果对于用jdbc操作数据库和善于利用DbUtil查询结果,C3p0进行连接数据库的人来说,上面基础的增删改查就基本能做出来了。下面我便把分页和过滤的功能放一起实现,如下:


1.把页面表单的数据提交到Servlet后,得到参数值。想要获取过滤后的分页,无非在sql就是加上过滤条件。这就是我显示主页的代码。

</pre><pre name="code" class="java">public void list(HttpServletRequest request, HttpServletResponse response)
	{	
		try {
			
		//1.获取jsp页面传递过来的页面参数和最大记录数参数
		String currentPage1 = request.getParameter("currentPage");
		String pageSize1 = request.getParameter("pageSize");
		//2.定义一个类,用来初始化currentPage,pageSize,如果这两个参数为空,那么就用默认值赋值进去
		int currentPage = ServletUtils.getInitialized(currentPage1,1);
		int pageSize = ServletUtils.getInitialized(pageSize1,10);
		
		//3.获取jsp页面传递过来的过滤参数,
		String nameLike = request.getParameter("nameLike");
		String genderLike = request.getParameter("genderLike");
		String phoneLike = request.getParameter("phoneLike");
		String qqLike = request.getParameter("qqLike");
		String emailLike = request.getParameter("emailLike");
		String addressLike = request.getParameter("addressLike");
		
		//4.把过滤参数拼接成字符串,定义一个类,里面两个变量,一个是完成拼接字符串,一个完成参数的存储
		WhereClauseHepler whereClausehepler = new WhereClauseHepler()
		.addWhereCondition(!StringUtils.verdictString(nameLike), "name like ?", "%"+nameLike+"%")
		.addWhereCondition(!StringUtils.verdictString(genderLike), " gender like ?", "%"+genderLike+"%")
		.addWhereCondition(!StringUtils.verdictString(phoneLike), " phone like ?", "%"+phoneLike+"%")
		.addWhereCondition(!StringUtils.verdictString(qqLike), " qq like ?", "%"+qqLike+"%")
		.addWhereCondition(!StringUtils.verdictString(emailLike), " email like ?", "%"+emailLike+"%")
		.addWhereCondition(!StringUtils.verdictString(addressLike), " address like ?", "%"+addressLike+"%");
		
		//5.把这个whereClausehepler传到Service里面去,在调用底层dao实现方法执行查询
		CustomerService service = new CustomerService();
			
		QueryResult queryresult =  service.find(currentPage , pageSize , whereClausehepler);
		//6.把QueryResult对象里面的属性,countNum,list,带过滤的页面总记录数,带过滤的当前页面的联系人集合
		int countNum = queryresult.getCountNum();
		List<Customer> listCust = queryresult.getList();
		//7.把两个属性传递到PageBean 里面。
		PageBean<Customer> pb = new PageBean<>(currentPage, pageSize, countNum, listCust);
		
		//8.把pb放到request域里面
		request.setAttribute("pb", pb);
		
		request.getRequestDispatcher("/WEB-INF/jsp/showList.jsp").forward(request, response);
		
		
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}

下面,详细分析其构造吧:

2.想要判断传递过来的参数是否为空值,定义一个工具类StringUtils类,定义一个isBlank方法,
帮我们判断是否为空值,返回一个boolean类型。
public class StringUtils {
	
	public static boolean verdictString(String str)
	{
		//判断传进来的字符串是否为空或者长度为0的空字符串
		return (str==null||str.trim().length()==0);//如果为空字符串,或者为null都返回true;
	}
	
}


3.定义一个WhereClauseHelper 工具类,定义一个空字符串whereClause,在定义一个List<?> parameters类型的集合。
定义两个addWhereCondition,第一个方法参数为(String conndition , Object[]...args),判断是否第一次调用这个类的方法
通过判断whereClause是否为空,如果为空则是第一次调用这个方法,那么在这个conndition前面加上“where”关键字。
如果不是第一次调用,那么就在conndition前面加上"and"关键字。遍历这个args数组,每次遍历的时候都把它加到parameters
集合里面,最后方法返回当前对象(这样就可以实现多次调用这个方法来拼接字符串了)。第二个方法addWhereCondition,
里面参数为(boolean b , String conndition , Object[]...args),这个方法就是用来判断传递Servlet进来的参数值
是否为空,一个判断条件,如果这个b为true的话,在判断条件里面调用前面的addWhereCondition方法,返回值为
当前对象this,也是方便上一个为空,下一个仍然可以循环调用此方法。(这个类就是帮我们判断是否加where和and关键字)
通过调用这个类的对象,就可以得到要添加的条件,条件对应的参数(例如:条件:where name =? 参数:name值)
public class WhereClauseHepler {
	
	private String whereClause ="";
	
	private List<Object> parameters = new ArrayList<Object>(); 
	
	public WhereClauseHepler addWhereCondition(String conndition , Object...objects)
	{
		//1.判断是否第一次调用此方法,判断whereClause是否为空,如果为空的话,执行sql语句加上where关键字,如果不为空的话,
		//则加上and关键字
		if(whereClause.length()==0)
		{
			whereClause += "where "+conndition;
		}
		else
		{
			whereClause += " and "+conndition;
			
		}
		//当判断完以后,把参数放到集合里面,存储起来
		for(Object o : objects)
		{
			parameters.add(o);
			
		}
		return this;//返回当前对象,方便实现多次循环调用判断
	}
	
	/**
	 * 
	 * @param b 判断条件,看参数是否为空,可以通过工具类StringUtils帮助我们判断
	 * @param conndition 传给上一个方法的sql语句
	 * @param objects	传给上一个方法的参数
	 * @return
	 */
	public WhereClauseHepler addWhereCondition(boolean b ,String conndition , Object...objects)
	{
		//1,如果传进来的字符串不为空,即b为true的时候,就让它调用前面的方法。进行拼接语句
		if(b)
		{
			addWhereCondition(conndition, objects);
		}
		return this;
	}
	
	public String getWhereClause() {
		return whereClause;
	}

	public List<Object> getParameters() {
		return parameters;
	}

	public void setWhereClause(String whereClause) {
		this.whereClause = whereClause;
	}

	public void setParameters(List<Object> parameters) {
		this.parameters = parameters;
	}
	
}


4.在dao实现类里面,定义一个find方法,传入参数为
(int currentPage , int pageSize ,  WhereClauseHelper whereClauseHelper)
此时可以利用当前页面数currentPage ,页面最大记录pageSize,
一个 WhereClauseHelper (用来获取拼接后的sql语句,对应的参数)。
此时通过计算得到页面起始下标startIndex,最大记录数则为pageSize值,可以直接调用。再根据查询sql传入参数,
得到表中总记录数,通过查询得到表中,当前页面记录的全部数据的一个集合。再把这四个参数即(总记录数,集合)
通过构造方法传到一个QueryResult类中(定义的成员变量存 起来)。
	public QueryResult find(int currentPage, int pageSize,
			WhereClauseHepler whereClausehepler) throws Exception {
		
		Connection conn =null;
		ResultSet rs = null;
		PreparedStatement ps = null;
		
		try {
			conn = C3p0Tools.getConnection();
			QueryRunner qr = new QueryRunner();

			// 当前页面值,当前页面最大记录数,一个WhereClauseHepler
			// 1.先把WhereClauseHepler对象里面的sql语句和对应的参数取出来
			String sqlClause = whereClausehepler.getWhereClause();
			List<Object> list = whereClausehepler.getParameters();
			
			// 2。操作底层,进行sql语句的查询
			String sql = "select count(*) from linkman " + sqlClause;
			// 3.得到最大记录数,带过滤条件的
			System.out.println(sql);
			
			Long countNum =  qr.query(conn, sql, new ScalarHandler<Long>(),
					list.toArray());

			String sql1 = "select id, name , gender , phone ,qq ,email , address , createtime from linkman "
					+ sqlClause + " limit ?,? ;";
			//把前面的list变成数组
			//3.1应该获取当前页面的起始下标,当前页面最大记录数
			int max = pageSize;
			int startIndex = (currentPage - 1)*max;
			//3.2把这两个也加到list集合里面,待会赋值的时候可以直接拿出来用,必须按照顺序输入
			list.add(startIndex);
			list.add(max);
			
			List<Customer> list1 = qr.query(conn, sql1,
					new BeanListHandler<Customer>(Customer.class),
					list.toArray());

			QueryResult queryresult = new QueryResult(countNum.intValue(), list1);

			return queryresult;
		} catch (SQLException e) {
			e.printStackTrace();
			throw new Exception("daoImpl查询失败", e);
		}
		finally
		{
			
			C3p0Tools.close(rs, ps, conn);
		}
	}
/**
 * 这个类,用来存储分页过滤查询后的,总记录数 , 页面记录的数据集合
 * @author xingxing
 *
 */
public class QueryResult {
	
	private int countNum ;
	
	private List<Customer> list ;

	public int getCountNum() {
		return countNum;
	}

	public void setCountNum(int countNum) {
		this.countNum = countNum;
	}

	public List<Customer> getList() {
		return list;
	}

	public void setList(List<Customer> list) {
		this.list = list;
	}

	public QueryResult(int countNum, List<Customer> list) {
		super();
		this.countNum = countNum;
		this.list = list;
	}

	public QueryResult() {
		super();
		// TODO Auto-generated constructor stub
	} 
}



5.在Servlet中,想要初始化当前页面值,和当前页面最大记录数。创建一个ServletUtil类,(传入request,参数值,默认值)用一个try,catch块判断是否为空,如果不为空
则把值进行强转为int类型,返回强转后的值。如果有参数为空转换异常,那么就在catch块里面进行,则返回一个默认值。
public class ServletUtils {
	
	/**
	 * 
	 * @param currentPage 当前页面
	 * @param i 默认初始值
	 * @return
	 */
	public static int getInitialized(String currentPage, int i) {

		try{
			String currentpage = currentPage;
			
			return Integer.parseInt(currentpage);
		}catch(Exception e)
		{	//如果有异常的话,捕获并且返回默认值,就是因为传进来的currentPage有可能为空
			return i ;
		}
	}
}




6.在Servlet类中,把获取的过滤参数值,先调用WhereClauseHelper 类,在把这个WhereClauseHelper 对象传递到dao实现类
的find方法中,返回一个QueryResult。再获取QueryResult中的(最大记录数,当前页面联系人集合)。再调用ServletUtils
方法,对当前页面curretPage,当前页面最大记录数pageSize进行初始化。把最大记录数,联系人集合,当前页面,最大记录数
传到PageBean类的构造方法中,得到一个PageBean对象。这样就可以把这个PageBean对象放进域里面,转发到jsp页面
进行显示数据。

public void list(HttpServletRequest request, HttpServletResponse response)
	{	
		try {
			
		//1.获取jsp页面传递过来的页面参数和最大记录数参数
		String currentPage1 = request.getParameter("currentPage");
		String pageSize1 = request.getParameter("pageSize");
		//2.定义一个类,用来初始化currentPage,pageSize,如果这两个参数为空,那么就用默认值赋值进去
		int currentPage = ServletUtils.getInitialized(currentPage1,1);
		int pageSize = ServletUtils.getInitialized(pageSize1,10);
		
		//3.获取jsp页面传递过来的过滤参数,
		String nameLike = request.getParameter("nameLike");
		String genderLike = request.getParameter("genderLike");
		String phoneLike = request.getParameter("phoneLike");
		String qqLike = request.getParameter("qqLike");
		String emailLike = request.getParameter("emailLike");
		String addressLike = request.getParameter("addressLike");
		
		//4.把过滤参数拼接成字符串,定义一个类,里面两个变量,一个是完成拼接字符串,一个完成参数的存储
		WhereClauseHepler whereClausehepler = new WhereClauseHepler()
		.addWhereCondition(!StringUtils.verdictString(nameLike), "name like ?", "%"+nameLike+"%")
		.addWhereCondition(!StringUtils.verdictString(genderLike), " gender like ?", "%"+genderLike+"%")
		.addWhereCondition(!StringUtils.verdictString(phoneLike), " phone like ?", "%"+phoneLike+"%")
		.addWhereCondition(!StringUtils.verdictString(qqLike), " qq like ?", "%"+qqLike+"%")
		.addWhereCondition(!StringUtils.verdictString(emailLike), " email like ?", "%"+emailLike+"%")
		.addWhereCondition(!StringUtils.verdictString(addressLike), " address like ?", "%"+addressLike+"%");
		
		//5.把这个whereClausehepler传到Service里面去,在调用底层dao实现方法执行查询
		CustomerService service = new CustomerService();
			
		QueryResult queryresult =  service.find(currentPage , pageSize , whereClausehepler);
		//6.把QueryResult对象里面的属性,countNum,list,带过滤的页面总记录数,带过滤的当前页面的联系人集合
		int countNum = queryresult.getCountNum();
		List<Customer> listCust = queryresult.getList();
		//7.把两个属性传递到PageBean 里面。
		PageBean<Customer> pb = new PageBean<>(currentPage, pageSize, countNum, listCust);
		
		//8.把pb放到request域里面
		request.setAttribute("pb", pb);
		
		request.getRequestDispatcher("/WEB-INF/jsp/showList.jsp").forward(request, response);
		
		
		} catch (Exception e) {
			e.printStackTrace();
		}
		

以上就是,我做的项目全过程了,有一些底层的增删改查,没有写出来,和jsp页面显示

的代码也没有添加上。请多多指教












评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值