《黑马旅游网》综合案例
1 前言 为了巩固web基础知识,提升综合运用能力.
2 项目导入 点击绿色+按钮
选择travel项目的pom.xml文件,点击ok,完成项目导入。需要等待一小会,项目初始化完成。
3 启动项目 3.1 方式一:
3.2 方式二:配置maven快捷启动
4 技术选型 4.1 Web层 a) Servlet:前端控制器
b) html:视图
c) Filter:过滤器
d) BeanUtils:数据封装
e) Jackson:json序列化工具
4.2 Service层 f) Javamail:java发送邮件工具
g) Redis:nosql内存数据库
h) Jedis:java的redis客户端
4.3 Dao层 i) Mysql:数据库
j) Druid:数据库连接池
k) JdbcTemplate:jdbc的工具
5 创建数据库 – 创建数据库
CREATE DATABASE travel;
– 使用数据库
USE travel;
–创建表
复制提供好的sql
6 注册功能 6.1 页面效果
6.2 功能分析
6.3 代码实现 6.3.1 前台代码实现 6.3.2 表单校验 提升用户体验,并减轻服务器压力。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 //校验用户名 //单词字符,长度8到20位 **function** *checkUsername*() { //1.获取用户名值 **var** username = **$**(**"#username"**).val(); //2.定义正则 **var** reg_username = /^\w{8,20}$/; //3.判断,给出提示信息 **var** flag = reg_username.test(username); **if**(flag){ //用户名合法 **$**(**"#username"**).css(**"border"**,**""**); }**else**{ //用户名非法,加一个红色边框 **$**(**"#username"**).css(**"border"**,**"1px solid red"**); } **return** flag; } //校验密码 **function** *checkPassword*() { //1.获取密码值 **var** password = **$**(**"#password"**).val(); //2.定义正则 **var** reg_password = /^\w{8,20}$/; //3.判断,给出提示信息 **var** flag = reg_password.test(password); **if**(flag){ //密码合法 **$**(**"#password"**).css(**"border"**,**""**); }**else**{ //密码非法,加一个红色边框 **$**(**"#password"**).css(**"border"**,**"1px solid red"**); } **return** flag; } //校验邮箱 **function** *checkEmail*(){ //1.获取邮箱 **var** email = **$**(**"#email"**).val(); //2.定义正则 [email protected] **var** reg_email = /^\w+@\w+\.\w+$/; //3.判断 **var** flag = reg_email.test(email); **if**(flag){ **$**(**"#email"**).css(**"border"**,**""**); }**else**{ **$**(**"#email"**).css(**"border"**,**"1px solid red"**); } **return** flag; } **$**(**function** () { //当表单提交时,调用所有的校验方法 **$**(**"#registerForm"**).submit(**function**(){ **return** *checkUsername*() && *checkPassword*() && *checkEmail*(); //如果这个方法没有返回值,或者返回为true,则表单提交,如果返回为false,则表单不提交 }); //当某一个组件失去焦点是,调用对应的校验方法 **$**(**"#username"**).blur(*checkUsername*); **$**(**"#password"**).blur(*checkPassword*); **$**(**"#email"**).blur(*checkEmail*); });
6.3.3 异步(ajax)提交表单 在此使用异步提交表单是为了获取服务器响应的数据。因为我们前台使用的是html作为视图层,不能够直接从servlet相关的域对象获取值,只能通过ajax获取响应数据
6.3.4 后台代码实现 6.3.5 编写RegistUserServlet 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 @WebServlet("/registUserServlet") public class RegistUserServlet extends HttpServlet { protected void doPost (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String check = request.getParameter("check" ); HttpSession session = request.getSession(); String checkcode_server = (String) session.getAttribute("CHECKCODE_SERVER" ); session.removeAttribute("CHECKCODE_SERVER" ); if (checkcode_server == null || !checkcode_server.equalsIgnoreCase(check)){ ResultInfo info = new ResultInfo(); info.setFlag(false ); info.setErrorMsg("验证码错误" ); ObjectMapper mapper = new ObjectMapper(); String json = mapper.writeValueAsString(info); response.setContentType("application/json;charset=utf-8" ); response.getWriter().write(json); return ; } Map<String, String[]> map = request.getParameterMap(); User user = new User(); try { BeanUtils.populate(user,map); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } UserService service = new UserServiceImpl(); boolean flag = service.regist(user); ResultInfo info = new ResultInfo(); if (flag){ info.setFlag(true ); }else { info.setFlag(false ); info.setErrorMsg("注册失败!" ); } ObjectMapper mapper = new ObjectMapper(); String json = mapper.writeValueAsString(info); response.setContentType("application/json;charset=utf-8" ); response.getWriter().write(json); } protected void doGet (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this .doPost(request, response); } }
6.3.6 编写UserService以及UserServiceImpl 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 public class UserServiceImpl implements UserService { private UserDao userDao = new UserDaoImpl(); @Override public boolean regist (User user) { User u = userDao.findByUsername(user.getUsername()); if (u != null ){ return false ; } userDao.save(user); return true ; } }
6.3.7 编写UserDao以及UserDaoImpl 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 public class UserDaoImpl implements UserDao { private JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource()); @Override public User findByUsername (String username) { User user = null ; try { String sql = "select * from tab_user where username = ?" ; user = template.queryForObject(sql, new BeanPropertyRowMapper<User>(User.class), username); } catch (Exception e) { } return user; } @Override public void save (User user) { String sql = "insert into tab_user(username,password,name,birthday,sex,telephone,email) values(?,?,?,?,?,?,?)" ; template.update(sql,user.getUsername(), user.getPassword(), user.getName(), user.getBirthday(), user.getSex(), user.getTelephone(), user.getEmail()); } }
6.3.8 邮件激活 为什么要进行邮件激活?为了保证用户填写的邮箱是正确的。将来可以推广一些宣传信息,到用户邮箱中。
6.3.9 发送邮件 \1. 申请邮箱
\2. 开启授权码
\3. 在MailUtils中设置自己的邮箱账号和密码(授权码)
1 2 邮件工具类:MailUtils,调用其中sendMail方法可以完成邮件发送
6.3.10 用户点击邮件激活 经过分析,发现,用户激活其实就是修改用户表中的status为‘Y’
分析:
发送邮件代码:
修改保存Dao代码,加上存储status和code 的代码逻辑
激活代码实现:
ActiveUserServlet
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 String code = request.getParameter("code" ); if (code != null ){ UserService service = new UserServiceImpl(); boolean flag = service.active(code); String msg = null ; if (flag){ msg = "激活成功,请<a href='login.html'>登录</a>" ; }else { msg = "激活失败,请联系管理员!" ; } response.setContentType("text/html;charset=utf-8" ); response.getWriter().write(msg);
UserService:active
1 2 3 4 5 6 7 8 9 10 11 12 13 @Override public boolean active (String code) { User user = userDao.findByCode(code); if (user != null ){ userDao.updateStatus(user); return true ; }else { return false ; } }
UserDao:findByCode updateStatus
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 @Override public User findByCode (String code) { User user = null ; try { String sql = "select * from tab_user where code = ?" ; user = template.queryForObject(sql,new BeanPropertyRowMapper<User>(User.class),code); } catch (DataAccessException e) { e.printStackTrace(); } return user; } @Override public void updateStatus (User user) { String sql = " update tab_user set status = 'Y' where uid=?" ; template.update(sql,user.getUid()); }
7 登录 7.1 分析
7.2 代码实现 7.2.1 前台代码
7.2.2 后台代码 LoginServlet
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 Map<String, String[]> map = request.getParameterMap(); User user = new User(); try { BeanUtils.populate(user,map); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } UserService service = new UserServiceImpl(); User u = service.login(user); ResultInfo info = new ResultInfo(); if (u == null ){ info.setFlag(false ); info.setErrorMsg("用户名密码或错误" ); } if (u != null && !"Y" .equals(u.getStatus())){ info.setFlag(false ); info.setErrorMsg("您尚未激活,请激活" ); } if (u != null && "Y" .equals(u.getStatus())){ info.setFlag(true ); } ObjectMapper mapper = new ObjectMapper(); response.setContentType("application/json;charset=utf-8" ); mapper.writeValue(response.getOutputStream(),info);
UserService
1 2 3 public User login (User user) { return userDao.findByUsernameAndPassword(user.getUsername(),user.getPassword()); }
UserDao
1 2 3 4 5 6 7 8 9 10 11 12 13 public User findByUsernameAndPassword (String username, String password) { User user = null ; try { String sql = "select * from tab_user where username = ? and password = ?" ; user = template.queryForObject(sql, new BeanPropertyRowMapper<User>(User.class), username,password); } catch (Exception e) { } return user; }
7.2.3 index页面中用户姓名的提示信息功能 效果:
header.html代码
Servlet代码
1 2 3 4 5 6 7 Object user = request.getSession().getAttribute("user" ); ObjectMapper mapper = new ObjectMapper(); response.setContentType("application/json;charset=utf-8" ); mapper.writeValue(response.getOutputStream(),user);
8 退出 什么叫做登录了?session中有user对象。
实现步骤:
\1. 访问servlet,将session销毁
\2. 跳转到登录页面
代码实现:
Header.html
Servlet:
1 2 3 4 5 request.getSession().invalidate(); response.sendRedirect(request.getContextPath()+"/login.html" );
9 优化Servlet 9.1 目的 减少Servlet的数量,现在是一个功能一个Servlet,将其优化为一个模块一个Servlet,相当于在数据库中一张表对应一个Servlet,在Servlet中提供不同的方法,完成用户的请求。
Idea控制台中文乱码解决:-Dfile.encoding=gb2312
9.2 BaseServlet编写: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 public class BaseServlet extends HttpServlet { @Override protected void service (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String uri = req.getRequestURI(); System.out.println("请求uri:" +uri); String methodName = uri.substring(uri.lastIndexOf('/' ) + 1 ); System.out.println("方法名称:" +methodName); System.out.println(this ); try { Method method = this .getClass().getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class); method.invoke(this ,req,resp); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } } }
9.3 UserServlet改写 将之前的Servlet实现的功能,抽取到UserServlet中的不同方法中实现,并且将UserService创建抽取到成员变量位置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 @WebServlet("/user/*") public class UserServlet extends BaseServlet { private UserService service = new UserServiceImpl(); public void regist (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String check = request.getParameter("check" ); HttpSession session = request.getSession(); String checkcode_server = (String) session.getAttribute("CHECKCODE_SERVER" ); session.removeAttribute("CHECKCODE_SERVER" ); if (checkcode_server == null || !checkcode_server.equalsIgnoreCase(check)){ ResultInfo info = new ResultInfo(); info.setFlag(false ); info.setErrorMsg("验证码错误" ); ObjectMapper mapper = new ObjectMapper(); String json = mapper.writeValueAsString(info); response.setContentType("application/json;charset=utf-8" ); response.getWriter().write(json); return ; } Map<String, String[]> map = request.getParameterMap(); User user = new User(); try { BeanUtils.populate(user,map); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } boolean flag = service.regist(user); ResultInfo info = new ResultInfo(); if (flag){ info.setFlag(true ); }else { info.setFlag(false ); info.setErrorMsg("注册失败!" ); } ObjectMapper mapper = new ObjectMapper(); String json = mapper.writeValueAsString(info); response.setContentType("application/json;charset=utf-8" ); response.getWriter().write(json); } public void login (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Map<String, String[]> map = request.getParameterMap(); User user = new User(); try { BeanUtils.populate(user,map); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } User u = service.login(user); ResultInfo info = new ResultInfo(); if (u == null ){ info.setFlag(false ); info.setErrorMsg("用户名密码或错误" ); } if (u != null && !"Y" .equals(u.getStatus())){ info.setFlag(false ); info.setErrorMsg("您尚未激活,请激活" ); } if (u != null && "Y" .equals(u.getStatus())){ request.getSession().setAttribute("user" ,u); info.setFlag(true ); } ObjectMapper mapper = new ObjectMapper(); response.setContentType("application/json;charset=utf-8" ); mapper.writeValue(response.getOutputStream(),info); } public void findOne (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Object user = request.getSession().getAttribute("user" ); ObjectMapper mapper = new ObjectMapper(); response.setContentType("application/json;charset=utf-8" ); mapper.writeValue(response.getOutputStream(),user); } public void exit (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.getSession().invalidate(); response.sendRedirect(request.getContextPath()+"/login.html" ); } public void active (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String code = request.getParameter("code" ); if (code != null ){ boolean flag = service.active(code); String msg = null ; if (flag){ msg = "激活成功,请<a href='login.html'>登录</a>" ; }else { msg = "激活失败,请联系管理员!" ; } response.setContentType("text/html;charset=utf-8" ); response.getWriter().write(msg); } } }
9.4 页面路径改写 register.html
login.html
header.html
UserServiceImpl发送邮件
10 分类数据展示 10.1 效果:
10.2 分析:
10.3 代码实现: 10.3.1 后台代码 CategoryServlet
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 @WebServlet("/category/*") public class CategoryServlet extends BaseServlet { private CategoryService service = new CategoryServiceImpl(); public void findAll (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { List<Category> cs = service.findAll(); writeValue(cs,response); } }
CategoryService java
1 2 3 4 5 6 7 8 9 public class CategoryServiceImpl implements CategoryService { private CategoryDao categoryDao = new CategoryDaoImpl(); @Override public List<Category> findAll () { return categoryDao.findAll(); } }
CategoryDao
1 2 3 4 5 6 7 8 9 10 public class CategoryDaoImpl implements CategoryDao { private JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource()); @Override public List<Category> findAll () { String sql = "select * from tab_category " ; return template.query(sql,new BeanPropertyRowMapper<Category>(Category.class)); } }
在BaseServlet中封装了序列化json的方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 public void writeValue (Object obj,HttpServletResponse response) throws IOException { ObjectMapper mapper = new ObjectMapper(); response.setContentType("application/json;charset=utf-8" ); mapper.writeValue(response.getOutputStream(),obj); } public String writeValueAsString (Object obj) throws JsonProcessingException { ObjectMapper mapper = new ObjectMapper(); return mapper.writeValueAsString(obj); }
10.3.2 前台代码 hader.html加载后,发送ajax请求,请求category/findAll
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 $.get("category/findAll" ,{},function (data) { var lis = '<li class="nav-active"><a href="index.html">首页</a></li>' ; for (var i = 0 ; i < data.length; i++) { var li = '<li><a href="route_list.html">' +data[i].cname+'</a></li>' ; lis += li; } lis+= '<li><a href="favoriterank.html">收藏排行榜</a></li>' ; $("#category" ).html(lis); });
10.4 对分类数据进行缓存优化 分析发现,分类的数据在每一次页面加载后都会重新请求数据库来加载,对数据库的压力比较大,而且分类的数据不会经常产生变化,所有可以使用redis来缓存这个数据。
分析:
10.5 优化代码实现 期望数据中存储的顺序就是将来展示的顺序,使用redis的sortedset
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 @Override public List<Category> findAll () { Jedis jedis = JedisUtil.getJedis(); Set<String> categorys = jedis.zrange("category" , 0 , -1 ); List<Category> cs = null ; if (categorys == null || categorys.size() == 0 ) { System.out.println("从数据库查询...." ); cs = categoryDao.findAll(); for (int i = 0 ; i < cs.size(); i++) { jedis.zadd("category" , cs.get(i).getCid(), cs.get(i).getCname()); } } else { System.out.println("从redis中查询....." ); cs = new ArrayList<Category>(); for (String name : categorys) { Category category = new Category(); category.setCname(name); cs.add(category); } } return cs; }
11 旅游线路的分页展示 点击了不同的分类后,将来看到的旅游线路不一样的。通过分析数据库表结构,发现,旅游线路表和分类表时一个多对一的关系
查询不同分类的旅游线路sql
Select * from tab_route where cid = ?;
11.1 类别id的传递 Redis中查询score(cid)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 public class CategoryServiceImpl implements CategoryService { private CategoryDao categoryDao = new CategoryDaoImpl(); @Override public List<Category> findAll () { Jedis jedis = JedisUtil.getJedis(); Set<Tuple> categorys = jedis.zrangeWithScores("category" , 0 , -1 ); List<Category> cs = null ; if (categorys == null || categorys.size() == 0 ) { System.out.println("从数据库查询...." ); cs = categoryDao.findAll(); for (int i = 0 ; i < cs.size(); i++) { jedis.zadd("category" , cs.get(i).getCid(), cs.get(i).getCname()); } } else { System.out.println("从redis中查询....." ); cs = new ArrayList<Category>(); for (Tuple tuple : categorys) { Category category = new Category(); category.setCname(tuple.getElement()); category.setCid((int )tuple.getScore()); cs.add(category); } } return cs; } }
页面传递cid
header.html传递cid
1 var li = '<li><a href="route_list.html?cid=' +data[i].cid+'">' +data[i].cname+'</a></li>' ;
获取cid
1 2 3 4 5 6 $(function () { var search = location.search; var cid = search.split("=" )[1 ]; });
11.2 根据id查询不同类别的旅游线路数据 分页展示旅游线路数据:
11.2.1 分析
11.2.2 编码 \1. 客户端代码编写
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 $(function () { var search = location.search; var cid = search.split("=" )[1 ]; load(cid); }); function load (cid ,currentPage) { $.get("route/pageQuery" ,{cid:cid,currentPage:currentPage},function (pb) { $("#totalPage" ).html(pb.totalPage); $("#totalCount" ).html(pb.totalCount); var lis = "" ; var fristPage = '<li onclick="javascipt:load(' +cid+')"><a href="javascript:void(0)">首页</a></li>' ; var beforeNum = pb.currentPage - 1 ; if (beforeNum <= 0 ){ beforeNum = 1 ; } var beforePage = '<li onclick="javascipt:load(' +cid+',' +beforeNum+')" class="threeword"><a href="javascript:void(0)">上一页</a></li>' ; lis += fristPage; lis += beforePage; var begin; var end ; if (pb.totalPage < 10 ){ begin = 1 ; end = pb.totalPage; }else { begin = pb.currentPage - 5 ; end = pb.currentPage + 4 ; if (begin < 1 ){ begin = 1 ; end = begin + 9 ; } if (end > pb.totalPage){ end = pb.totalPage; begin = end - 9 ; } } for (var i = begin; i <= end ; i++) { var li; if (pb.currentPage == i){ li = '<li class="curPage" onclick="javascipt:load(' +cid+',' +i+')"><a href="javascript:void(0)">' +i+'</a></li>' ; }else { li = '<li onclick="javascipt:load(' +cid+',' +i+')"><a href="javascript:void(0)">' +i+'</a></li>' ; } lis += li; } var lastPage = '<li class="threeword"><a href="javascript:;">末页</a></li>' ; var nextPage = '<li class="threeword"><a href="javascript:;">下一页</a></li>' ; lis += nextPage; lis += lastPage; $("#pageNum" ).html(lis); var route_lis = "" ; for (var i = 0 ; i < pb.list.length; i++) { var route = pb.list[i]; var li = '<li>\n' + ' <div class="img"><img src="' +route.rimage+'" style="width: 299px;"></div>\n' + ' <div class="text1">\n' + ' <p>' +route.rname+'</p>\n' + ' <br/>\n' + ' <p>' +route.routeIntroduce+'</p>\n' + ' </div>\n' + ' <div class="price">\n' + ' <p class="price_num">\n' + ' <span>¥</span>\n' + ' <span>' +route.price+'</span>\n' + ' <span>起</span>\n' + ' </p>\n' + ' <p><a href="route_detail.html">查看详情</a></p>\n' + ' </div>\n' + ' </li>' ; route_lis += li; } $("#route" ).html(route_lis); window.scrollTo(0 ,0 ); }); }
\2. 服务器端代码编写
a) 创建PageBean对象
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 public class PageBean <T > { private int totalCount; private int totalPage; private int currentPage; private int pageSize; private List<T> list; public int getTotalCount () { return totalCount; } public void setTotalCount (int totalCount) { this .totalCount = totalCount; } public int getTotalPage () { return totalPage; } public void setTotalPage (int totalPage) { this .totalPage = totalPage; } public int getCurrentPage () { return currentPage; } public void setCurrentPage (int currentPage) { this .currentPage = currentPage; } public int getPageSize () { return pageSize; } public void setPageSize (int pageSize) { this .pageSize = pageSize; } public List<T> getList () { return list; } public void setList (List<T> list) { this .list = list; } }
b) RouteServlet
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 @WebServlet("/route/*") public class RouteServlet extends BaseServlet { private RouteService routeService = new RouteServiceImpl(); public void pageQuery (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String currentPageStr = request.getParameter("currentPage" ); String pageSizeStr = request.getParameter("pageSize" ); String cidStr = request.getParameter("cid" ); int cid = 0 ; 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 ; } PageBean<Route> pb = routeService.pageQuery(cid, currentPage, pageSize); writeValue(pb,response); } }
c) RouteService
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 public class RouteServiceImpl implements RouteService { private RouteDao routeDao = new RouteDaoImpl(); @Override public PageBean<Route> pageQuery (int cid, int currentPage, int pageSize) { PageBean<Route> pb = new PageBean<Route>(); pb.setCurrentPage(currentPage); pb.setPageSize(pageSize); int totalCount = routeDao.findTotalCount(cid); pb.setTotalCount(totalCount); int start = (currentPage - 1 ) * pageSize; List<Route> list = routeDao.findByPage(cid,start,pageSize); pb.setList(list); int totalPage = totalCount % pageSize == 0 ? totalCount / pageSize :(totalCount / pageSize) + 1 ; pb.setTotalPage(totalPage); return pb; } }
d) RouteDao
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 public class RouteDaoImpl implements RouteDao { private JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource()); @Override public int findTotalCount (int cid) { String sql = "select count(*) from tab_route where cid = ?" ; return template.queryForObject(sql,Integer.class,cid); } @Override public List<Route> findByPage (int cid, int start, int pageSize) { String sql = "select * from tab_route where cid = ? limit ? , ?" ; return template.query(sql,new BeanPropertyRowMapper<Route>(Route.class),cid,start,pageSize); } }