黑马旅游网学习笔记之旅游线路查询(七)
程序员文章站
2022-04-03 19:50:41
...
概述
(一)参数传递
(二)后台代码
第一步,加上rname字段
然后分三种情况:
第一种,直接在首页查询 只有rname 没有cid
第二种,进去之后在搜索框搜索 有rname和cid
第三种,进去之后不搜索 只有cid 没有rname
我们可以写一个sql的模板,应对以上三种情况
RouteServlet:
package cn.itcast.travel.web.servlet;
import cn.itcast.travel.domain.PageBean;
import cn.itcast.travel.domain.Route;
import cn.itcast.travel.service.RouteService;
import cn.itcast.travel.service.impl.RouteServiceImpl;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/route/*")
public class RouteServlet extends BaseServlet {
private RouteService routeService = new RouteServiceImpl();
/**
* 分页查询
*
* @param request
* @param response
* @throws ServletException
* @throws IOException
*/
public void pageQuery(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.接受参数
String currentPageStr = request.getParameter("currentPage");
String pageSizeStr = request.getParameter("pageSize");
String cidStr = request.getParameter("cid");
//接受rname 线路名称
String rname = request.getParameter("rname");
//2.处理参数
int cid = 0;//类别的id
if (cidStr != null && cidStr.length() > 0) {
cid = Integer.parseInt(cidStr);
}
int currentPage = 0;//当前页码
if (currentPageStr != null && currentPageStr.length() > 0) {
currentPage = Integer.parseInt(currentPageStr);
} else {
currentPage = 1;//如果不传递,则默认为第一页
}
int pageSize = 0;//每页显示条数
if (pageSizeStr != null && pageSizeStr.length() > 0) {
pageSize = Integer.parseInt(pageSizeStr);
} else {
pageSize = 5;//如果不传递,则默认一页显示5条记录
}
//3. 调用service查询PageBean对象
PageBean<Route> pb = routeService.pageQuery(cid, currentPage, pageSize, rname);
//4. 将pageBean对象序列化为json,返回
writeValue(pb, response);
}
}
RouteServiceImpl:
package cn.itcast.travel.service.impl;
import cn.itcast.travel.dao.RouteDao;
import cn.itcast.travel.dao.impl.RouteDaoImpl;
import cn.itcast.travel.domain.PageBean;
import cn.itcast.travel.domain.Route;
import cn.itcast.travel.service.RouteService;
import java.util.List;
public class RouteServiceImpl implements RouteService {
private RouteDao routeDao = new RouteDaoImpl();
/**
* 分页查询
* 根据cid,start,pageSize查询当前页的数据集合
* start为查询结果的索引值(默认从0开始)
* pageSize为查询结果返回的数量
*
* @param cid
* @param currentPage
* @param pageSize
* @return
*/
@Override
public PageBean<Route> pageQuery(int cid, int currentPage, int pageSize, String rname) {
//封装PageBean
PageBean<Route> pb = new PageBean<Route>();
//设置当前页码
pb.setCurrentPage(currentPage);
//设置每页显示条数
pb.setPageSize(pageSize);
//设置总记录数
int totalCount = routeDao.findTotalCount(cid, rname);
pb.setTotalCount(totalCount);
//设置当前页显示的数据集合
int start = (currentPage - 1) * pageSize;//开始的记录数(已知当前处于第几页,一页显示多少条) 公式:(当前页码 - 1)* 每页显示的记录数
List<Route> list = routeDao.findByPage(cid, start, pageSize, rname);
pb.setList(list);
//设置总页数(总页数 = 总记录数 / 每页显示条数)注意判断能否除得尽,如果除不尽就加1
int totalPage = totalCount % pageSize == 0 ? totalCount / pageSize : (totalCount / pageSize) + 1;
pb.setTotalPage(totalPage);
return pb;
}
}
RouteDaoImpl:
package cn.itcast.travel.dao.impl;
import cn.itcast.travel.dao.RouteDao;
import cn.itcast.travel.domain.Route;
import cn.itcast.travel.util.JDBCUtils;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import java.util.ArrayList;
import java.util.List;
public class RouteDaoImpl implements RouteDao {
private JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());
/**
* 根据cid查询总记录数
*
* @param cid
* @return
*/
@Override
public int findTotalCount(int cid, String rname) {
//1.定义sql模板
String sql = "select count(*) from tab_route where 1=1 ";
StringBuilder sb = new StringBuilder(sql);
List params = new ArrayList();//条件们
//2.判断参数是否有值
if (cid != 0) {
sb.append(" and cid = ?");//要注意空格
params.add(cid);//添加?对应的值
}
if (rname != null && rname.length() > 0) {
sb.append(" and rname like ?");
params.add("%" + rname + "%");
}
sql = sb.toString();
return template.queryForObject(sql, Integer.class, params.toArray());
}
/**
* 根据cid,start,pageSize查询当前页的数据集合
* start为查询结果的索引值(默认从0开始)
* pageSize为查询结果返回的数量
*/
@Override
public List<Route> findByPage(int cid, int start, int pageSize, String rname) {
String sql = "select * from tab_route where 1=1 ";
StringBuilder sb = new StringBuilder(sql);
List params = new ArrayList();//条件们
//2.判断参数是否有值
if (cid != 0) {
sb.append(" and cid = ?");//要注意空格
params.add(cid);//添加?对应的值
}
if (rname != null && rname.length() > 0) {
sb.append(" and rname like ?");
params.add("%" + rname + "%");
}
sb.append(" limit ? , ? ");//分页条件
sql = sb.toString();
params.add(start);
params.add(pageSize);
return template.query(sql, new BeanPropertyRowMapper<Route>(Route.class), params.toArray());
}
}
我们测试发现使用tomcat7的话,get请求中文会乱码
访问:http://localhost/travel/route/pageQuery?cid=5&rname=西安
设置断点,然后step over
解决方法:
rname = new String(rname.getBytes("iso-8859-1"), "utf-8");
如果不这样解决,也可以换成tomcat8
效果:
(三)前台代码
后台加多一个条件,因为前台可能会传一个“null”字符串
前台代码略