大家好,我是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页面显示
的代码也没有添加上。请多多指教