需求:
根据两个条件查询。
根据查询的结果分页,并记住查询条件。
大体流程是这样的:
第一次打开时,默认分页显示所有信息,这时候点击末页会取到最后一页数据。
当填写或选择了查询条件时,根据条件取出符合条件的所有数据并分页。这时候点击翻页应该都是这一次查询条件后的数据。
我写的时候思绪挺乱的,来这里写一写,再理一下思路。
建表,只需要一张,还有对应的实体类。
写前台展示页面。
<body>
<form action="" method="post">
姓名:<input type="text" name="name"/>
性别:
<select name="sex" >
<option value="-1">全部option>
<option value="0">男option>
<option value="1">女option>
select>
<input type="submit" value="搜索"/>
<table>
<tr>
<td>序号td>
<td>姓名td>
<td>性别td>
<td>头像td>
<td>职业td>
tr>
<c:forEach items="" var="">
...
c:forEach>
table>
form>
<a href="">首页a>
<a href="">上一页a>
当前页:
<a href="">下一页a>
<a href="">末页a>
body>
刚进入项目要显示所有,所以可以写个带参数的欢迎页面index.jsp,
response.sendRedirect("person?action=getMaxPage&name=&sex=0");
(name=&sex=-1相当于name=空字符串)。把name和sex传到相应的servlet。
现在来写servlet
public String getMaxPage(HttpServletRequest req,HttpServletResponse resp){
resp.setCharacterEncoding("UTF-8");
/* 刚进入项目时index.jsp传来name="" 为空,sex=-1*/
String name = req.getParameter("name");
Integer sex = Integer.valueOf(req.getParameter("sex"));
/*第一步,通过条件得到最大页数。要写一个数据访问的Dao,虚线内是该Dao里获取最大页的方法*/
PersonDao pd = new PersonDao();
Integer maxPage = pd.getCount(name, sex, rowPerPage);
//rowPerPage是每页要显示的记录条数,可以定义一个全局变量
--------------------------------------------------------------------------------------
public Integer getCount(String name,Integer sex,Integer size){
StringBuffer sb = new StringBuffer("select count(*) from person where 1=1 ");
...
if(!(name.equals(null)) && !(name.equals("")) ){
sb.append(" and name like '%"+name+"%' ");
}
if(sex != 0){
sb.append(" and sex = "+sex+" ");
}
...
}
------------------------------------------------------------------------------------------
/*因为还没学Ajax就用session存放条件以记住查询条件*/
HttpSession session = req.getSession();
session.setAttribute("name", name);
session.setAttribute("sex", sex);
session.setAttribute("maxPage", maxPage);
return "person?action=getPerson";
}
public String getPerson(HttpServletRequest req,HttpServletResponse resp){
PersonDao pd = new PersonDao();
HttpSession session = req.getSession();
//得到选择条件后的最大页,姓名,性别。会根据每次选择条件的不同而改变。
Integer maxPage = (Integer)session.getAttribute("maxPage");
String name = (String)session.getAttribute("name");
Integer sex = (Integer)session.getAttribute("sex");
Integer currPage = 0;
//从项目进来后,没有从前台获得currPage,默认为1
if (req.getParameter("currPage") == null) {
currPage =1;
}else{
//点击上下页的时候找到此servlet,得到页数。
------------------------------------------------------------
<a href="person?action=getPerson&currPage=${currPage+1 }">下一页</a>
------------------------------------------------------------
currPage = Integer.valueOf(req.getParameter("currPage"));
}
if(currPage < 1 ){
currPage = 1;
} else if(currPage > maxPage){
currPage = maxPage;
}
//通过name,sex,当前页,每页显示的条数导数据库获取数据。
List<Person> list = pd.getPerson(name, sex, currPage, rowPerPage);
--------------------------------------------------------------------------------
public List<Person> getPerson(String name, Integer sex,Integer currPage,Integer size){
StringBuffer sb = new StringBuffer("select * from person where 1=1 ");
...
//在这里,我们把参数直接传到Dao里面来判断。在我早先写的那篇文章里,是先在servlet判断一次,又到Dao里面判断,实在是多余了。不过"重构代码"不也是一项必须的技能吗。
if(!(name.equals(null)) && !(name.equals("")) ){
sb.append(" and name like '%"+name+"%' ");
}
if(sex != 0){
sb.append(" and sex = "+sex+" ");
}
sb.append(" limit ?,? ");
String sql = sb.toString();//要注意把sql语句转为String类型。
try {
conn = DataBaseUtil.getConnection();
ps = conn.prepareStatement(sql);
//这里就只有两个 ‘?’,不用再判断有几个 ‘?’了。
ps.setInt(1, (currPage-1)*size);
ps.setInt(2, size);
rs = ps.executeQuery();
while(rs.next()){
...
}
--------------------------------------------------------------------------------
//把得到的数据,送到前台显示。
if(list.size() > 0){
req.setAttribute("pList", list);
req.setAttribute("currPage", currPage);
return "showPerson.jsp";
}
早先写的拼接Sql的文章(点我)
Ps:写这篇文章的时候,被打断了了好几次,思路也是断断续续的。不过我会一直更新下去的,在学了Ajax,Jquery后。还有最好是写一个框架来做这些事,不过对接口,反射的理解还不是太深。加油吧!