typora-copy-images-to: img

综合练习

学习目标

  • 能够完成添加联系人案例
  • 能够完成删除联系人案例
  • 能够理解PageBean分页数据的封装
  • 掌握limit关键字的使用
  • 能够完成分页展示联系人案例

案例一-显示所有联系人案例

一,案例需求

Web综合练习 - 图1

  • 查询数据库里面所有的用户, 展示在页面

二,技术分析

  1. 传统方式的开发一个请求对应一个Servlet:这样的话会导致一个模块的Servlet过多,导致整个项目的Servlet都会很多. 能不能做一个处理?让一个**模块**用一个Servlet处理请求. 当前是**联系人模块**, 就创建一个LinkManServlet
  1. @WebServlet("/linkman")
  2. public class LinkManServlet extends HttpServlet {
  3. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  4. doGet(request, response);
  5. }
  6. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  7. //1.获得method请求参数
  8. String action = request.getParameter("action");
  9. //2.判断
  10. if("findAll".equals(action)){
  11. findAll(request,response);
  12. }
  13. if("add".equals(action)){
  14. add(request,response);
  15. }
  16. if("delete".equals(action)){
  17. delete(request,response);
  18. }
  19. }
  20. //删除联系人
  21. public void delete(HttpServletRequest request,HttpServletResponse response){
  22. }
  23. //查询所有的联系人
  24. public void findAll(HttpServletRequest request,HttpServletResponse response){
  25. }
  26. //添加联系人
  27. public void add(HttpServletRequest request,HttpServletResponse response){
  28. }
  29. }

三, 思路分析

Web综合练习 - 图3

四, 代码实现

1.准备工作

  • 数据库的创建
  1. CREATE TABLE linkman (
  2. id int primary key auto_increment,
  3. name varchar(50),
  4. sex varchar(50),
  5. age int,
  6. address varchar(50),
  7. qq varchar(50),
  8. email varchar(50)
  9. );
  10. INSERT INTO `linkman` (`id`, `name`, `sex`, `age`, `address`, `qq`, `email`) VALUES
  11. (null, '张三', '男', 11, '广东', '766335435', '766335435@qq.com'),
  12. (null, '李四', '男', 12, '广东', '243424242', '243424242@qq.com'),
  13. (null, '王五', '女', 13, '广东', '474574574', '474574574@qq.com'),
  14. (null, '赵六', '女', 18, '广东', '77777777', '77777777@qq.com'),
  15. (null, '钱七', '女', 15, '湖南', '412132145', '412132145@qq.com'),
  16. (null, '王八', '男', 25, '广西', '412132775', '412132995@qq.com');
  • JavaBean的创建
  1. package com.itheima.pojo;
  2. import java.io.Serializable;
  3. /**
  4. * 包名:com.itheima.pojo
  5. *
  6. * @author Leevi
  7. * 日期2020-07-18 09:14
  8. */
  9. public class LinkMan implements Serializable {
  10. private Integer id;
  11. private String name;
  12. private String sex;
  13. private Integer age;
  14. private String address;
  15. private String qq;
  16. private String email;
  17. @Override
  18. public String toString() {
  19. return "LinkMan{" +
  20. "id=" + id +
  21. ", name='" + name + '\'' +
  22. ", sex='" + sex + '\'' +
  23. ", age=" + age +
  24. ", address='" + address + '\'' +
  25. ", qq='" + qq + '\'' +
  26. ", email='" + email + '\'' +
  27. '}';
  28. }
  29. public Integer getId() {
  30. return id;
  31. }
  32. public void setId(Integer id) {
  33. this.id = id;
  34. }
  35. public String getName() {
  36. return name;
  37. }
  38. public void setName(String name) {
  39. this.name = name;
  40. }
  41. public String getSex() {
  42. return sex;
  43. }
  44. public void setSex(String sex) {
  45. this.sex = sex;
  46. }
  47. public Integer getAge() {
  48. return age;
  49. }
  50. public void setAge(Integer age) {
  51. this.age = age;
  52. }
  53. public String getAddress() {
  54. return address;
  55. }
  56. public void setAddress(String address) {
  57. this.address = address;
  58. }
  59. public String getQq() {
  60. return qq;
  61. }
  62. public void setQq(String qq) {
  63. this.qq = qq;
  64. }
  65. public String getEmail() {
  66. return email;
  67. }
  68. public void setEmail(String email) {
  69. this.email = email;
  70. }
  71. }
  • jar包
  • 工具类
  • 解决乱码的过滤器
  • 配置文件
  • 页面

2.代码

  • index.jsp页面
  1. <a href="/linkman?action=findAll">查询所有的联系人</a>
  • LinkManServlet
  1. package com.itheima.web.servlet;
  2. import com.itheima.entry.PageBean;
  3. import com.itheima.pojo.LinkMan;
  4. import com.itheima.service.LinkManService;
  5. import org.apache.commons.beanutils.BeanUtils;
  6. import javax.servlet.ServletException;
  7. import javax.servlet.annotation.WebServlet;
  8. import javax.servlet.http.HttpServlet;
  9. import javax.servlet.http.HttpServletRequest;
  10. import javax.servlet.http.HttpServletResponse;
  11. import java.io.IOException;
  12. import java.lang.reflect.Method;
  13. import java.util.List;
  14. import java.util.Map;
  15. /**
  16. * 包名:${PACKAGE_NAME}
  17. *
  18. * @author Leevi
  19. * 日期2020-07-18 08:53
  20. * LinkManServlet负责处理联系人模块的所有请求
  21. */
  22. @WebServlet("/linkman")
  23. public class LinkManServlet extends HttpServlet {
  24. private LinkManService linkManService = new LinkManService();
  25. @Override
  26. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  27. doGet(request, response);
  28. }
  29. @Override
  30. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  31. //1. 获取请求参数action的值
  32. String action = request.getParameter("action");
  33. //2. 判断action的值
  34. if ("findAll".equals(action)) {
  35. //调用findAll()方法查询所有
  36. findAll(request,response);
  37. }
  38. }
  39. /**
  40. * 查询所有联系人
  41. */
  42. private void findAll(HttpServletRequest request,HttpServletResponse response) throws IOException {
  43. try {
  44. //1. 调用业务层的方法,查询所有联系人
  45. List<LinkMan> linkManList = linkManService.findAll();
  46. //2. 将 linkManList存储到request域对象中
  47. request.setAttribute("list",linkManList);
  48. //3. 请求转发跳转到list.jsp页面
  49. request.getRequestDispatcher("/list.jsp").forward(request, response);
  50. } catch (Exception e) {
  51. e.printStackTrace();
  52. //查询失败
  53. response.getWriter().write("查询所有联系人失败");
  54. }
  55. }
  56. }
  • LinkManService
  1. package com.itheima.service;
  2. import com.itheima.dao.LinkManDao;
  3. import com.itheima.entry.PageBean;
  4. import com.itheima.pojo.LinkMan;
  5. import java.sql.SQLException;
  6. import java.util.List;
  7. /**
  8. * 包名:com.itheima.service
  9. *
  10. * @author Leevi
  11. * 日期2020-07-18 09:17
  12. */
  13. public class LinkManService {
  14. private LinkManDao linkManDao = new LinkManDao();
  15. public List<LinkMan> findAll() throws SQLException {
  16. return linkManDao.findAll();
  17. }
  18. }
  • LinkManDao
  1. package com.itheima.dao;
  2. import com.itheima.pojo.LinkMan;
  3. import com.itheima.utils.DruidUtil;
  4. import org.apache.commons.dbutils.QueryRunner;
  5. import org.apache.commons.dbutils.handlers.BeanHandler;
  6. import org.apache.commons.dbutils.handlers.BeanListHandler;
  7. import org.apache.commons.dbutils.handlers.ScalarHandler;
  8. import java.sql.SQLException;
  9. import java.util.List;
  10. /**
  11. * 包名:com.itheima.dao
  12. *
  13. * @author Leevi
  14. * 日期2020-07-18 09:18
  15. */
  16. public class LinkManDao {
  17. private QueryRunner runner = new QueryRunner(DruidUtil.getDataSource());
  18. public List<LinkMan> findAll() throws SQLException {
  19. String sql = "select * from linkman";
  20. List<LinkMan> linkManList = runner.query(sql, new BeanListHandler<>(LinkMan.class));
  21. return linkManList;
  22. }
  23. }
  • list.jsp
  1. <%--使用forEach标签遍历--%>
  2. <c:forEach items="${list}" var="linkman" varStatus="vst">
  3. <tr>
  4. <td>${vst.count}</td>
  5. <td>${linkman.name}</td>
  6. <td>${linkman.sex}</td>
  7. <td>${linkman.age}</td>
  8. <td>${linkman.address}</td>
  9. <td>${linkman.qq}</td>
  10. <td>${linkman.email}</td>
  11. <td><a class="btn btn-default btn-sm" href="/linkman?action=findOne&id=${linkman.id}">修改</a>&nbsp;
  12. <a class="btn btn-default btn-sm" href="javascript:;" onclick="deleteLinkMan('${linkman.name}','${linkman.id}')">删除</a></td>
  13. </tr>
  14. </c:forEach>

五,小结

  1. 浏览器 请求LinkManServlet, 携带action=findAll
  2. 在LinkManServlet里面创建findAll()方法
  1. //1.调用业务 获得所有的联系人List<LinkMan> list
  2. //2.把list存到request里面, 转发list.jsp
  1. 创建LinkManService
  1. public List<LinkMan> findAll(){
  2. //1.调用Dao 获得List
  3. //2.返回List
  4. }
  1. 创建LinkManDao
  1. public List<LinkMan> findAll(){
  2. //1.使用DBUtils查询所有的联系人(BeanListHandler)
  3. }

案例二:添加联系人

一,案例需求

  1. 点击添加联系人跳转添加联系人页面
    Web综合练习 - 图4

  2. 在添加联系人页面,点击提交按钮,把数据提交到服务器,保存到数据库
    Web综合练习 - 图5

  3. 在添加完成,可以查看到新建的联系人信息
    Web综合练习 - 图6

二,思路分析

Web综合练习 - 图7

三代码实现

  • LinkManServlet
  1. package com.itheima.web.servlet;
  2. import com.itheima.entry.PageBean;
  3. import com.itheima.pojo.LinkMan;
  4. import com.itheima.service.LinkManService;
  5. import org.apache.commons.beanutils.BeanUtils;
  6. import javax.servlet.ServletException;
  7. import javax.servlet.annotation.WebServlet;
  8. import javax.servlet.http.HttpServlet;
  9. import javax.servlet.http.HttpServletRequest;
  10. import javax.servlet.http.HttpServletResponse;
  11. import java.io.IOException;
  12. import java.lang.reflect.Method;
  13. import java.util.List;
  14. import java.util.Map;
  15. /**
  16. * 包名:${PACKAGE_NAME}
  17. *
  18. * @author Leevi
  19. * 日期2020-07-18 08:53
  20. * LinkManServlet负责处理联系人模块的所有请求
  21. */
  22. @WebServlet("/linkman")
  23. public class LinkManServlet extends HttpServlet {
  24. private LinkManService linkManService = new LinkManService();
  25. @Override
  26. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  27. doGet(request, response);
  28. }
  29. @Override
  30. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  31. //1. 获取请求参数action的值
  32. String action = request.getParameter("action");
  33. //2. 判断action的值
  34. if ("findAll".equals(action)) {
  35. //调用findAll()方法查询所有
  36. findAll(request,response);
  37. }
  38. if ("add".equals(action)){
  39. add(request,response);
  40. }
  41. }
  42. /**
  43. * 添加联系人
  44. * @param request
  45. * @param response
  46. * @throws IOException
  47. */
  48. private void add(HttpServletRequest request,HttpServletResponse response) throws IOException {
  49. try {
  50. //1. 获取所有请求参数
  51. Map<String, String[]> parameterMap = request.getParameterMap();
  52. //2. 将请求参数封装到LinkMan对象中
  53. LinkMan linkMan = new LinkMan();
  54. BeanUtils.populate(linkMan,parameterMap);
  55. //3. 调用业务层的方法添加联系人
  56. linkManService.add(linkMan);
  57. //4. 添加成功
  58. //跳转到查询所有
  59. response.sendRedirect("/linkman?action=findAll");
  60. } catch (Exception e) {
  61. e.printStackTrace();
  62. //添加失败
  63. response.getWriter().write("添加失败");
  64. }
  65. }
  66. }
  • LinkManService
  1. package com.itheima.service;
  2. import com.itheima.dao.LinkManDao;
  3. import com.itheima.entry.PageBean;
  4. import com.itheima.pojo.LinkMan;
  5. import java.sql.SQLException;
  6. import java.util.List;
  7. /**
  8. * 包名:com.itheima.service
  9. *
  10. * @author Leevi
  11. * 日期2020-07-18 09:17
  12. */
  13. public class LinkManService {
  14. private LinkManDao linkManDao = new LinkManDao();
  15. public void add(LinkMan linkMan) throws SQLException {
  16. //调用dao层的方法,添加联系人
  17. linkManDao.add(linkMan);
  18. }
  19. }
  • LinkManDao
  1. package com.itheima.dao;
  2. import com.itheima.pojo.LinkMan;
  3. import com.itheima.utils.DruidUtil;
  4. import org.apache.commons.dbutils.QueryRunner;
  5. import org.apache.commons.dbutils.handlers.BeanHandler;
  6. import org.apache.commons.dbutils.handlers.BeanListHandler;
  7. import org.apache.commons.dbutils.handlers.ScalarHandler;
  8. import java.sql.SQLException;
  9. import java.util.List;
  10. /**
  11. * 包名:com.itheima.dao
  12. *
  13. * @author Leevi
  14. * 日期2020-07-18 09:18
  15. */
  16. public class LinkManDao {
  17. private QueryRunner runner = new QueryRunner(DruidUtil.getDataSource());
  18. public void add(LinkMan linkMan) throws SQLException {
  19. String sql = "insert into linkman values (null,?,?,?,?,?,?)";
  20. runner.update(sql,linkMan.getName(),linkMan.getSex(),linkMan.getAge(),linkMan.getAddress(),linkMan.getQq(),linkMan.getEmail());
  21. }
  22. }

四,小结

  1. 新增联系人说白了就是向数据库里面插入一条记录

  2. 思路

    • 浏览器 点击提交 把数据提交到LinkManServlet(action=add, 联系人的基本信息)
    • 在LinkManServlet创建add()方法

      1. //1.获得请求参数(联系人的基本信息), 封装成LinkMan对象
      2. //2.调用业务新增联系人
      3. //3.再查询所有展示【建议使用重定向】
    • 在LinkManService创建add()方法

      1. public void add(LinkMan linkMan){
      2. //1.调用Dao 保存
      3. }
    • 在LinkManDao创建save()方法

      1. public void save(LinkMan linkMan){
      2. //1.使用DBUtils保存
      3. }

案例三:删除联系人

一,案例需求

Web综合练习 - 图8

  1. 点击确定删除之后, 再重新查询所有全部展示,

二,思路分析

Web综合练习 - 图9

三,代码实现

  • LinkManServlet
  1. package com.itheima.web.servlet;
  2. import com.itheima.entry.PageBean;
  3. import com.itheima.pojo.LinkMan;
  4. import com.itheima.service.LinkManService;
  5. import org.apache.commons.beanutils.BeanUtils;
  6. import javax.servlet.ServletException;
  7. import javax.servlet.annotation.WebServlet;
  8. import javax.servlet.http.HttpServlet;
  9. import javax.servlet.http.HttpServletRequest;
  10. import javax.servlet.http.HttpServletResponse;
  11. import java.io.IOException;
  12. import java.lang.reflect.Method;
  13. import java.util.List;
  14. import java.util.Map;
  15. /**
  16. * 包名:${PACKAGE_NAME}
  17. *
  18. * @author Leevi
  19. * 日期2020-07-18 08:53
  20. * LinkManServlet负责处理联系人模块的所有请求
  21. */
  22. @WebServlet("/linkman")
  23. public class LinkManServlet extends HttpServlet {
  24. private LinkManService linkManService = new LinkManService();
  25. @Override
  26. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  27. doGet(request, response);
  28. }
  29. @Override
  30. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  31. //1. 获取请求参数action的值
  32. String action = request.getParameter("action");
  33. //2. 判断action的值
  34. if ("findAll".equals(action)) {
  35. //调用findAll()方法查询所有
  36. findAll(request,response);
  37. }
  38. if ("add".equals(action)){
  39. add(request,response);
  40. }
  41. if ("delete".equals(action)){
  42. delete(request,response);
  43. }
  44. }
  45. /**
  46. * 删除联系人
  47. * @param request
  48. * @param response
  49. * @throws IOException
  50. */
  51. private void delete(HttpServletRequest request,HttpServletResponse response) throws IOException {
  52. try {
  53. //1. 获取要删除的联系人的id
  54. Integer id = Integer.valueOf(request.getParameter("id"));
  55. //2. 调用业务层的方法,根据id删除联系人
  56. linkManService.deleteById(id);
  57. //3. 删除成功,则跳转到查询所有
  58. response.sendRedirect("/linkman?action=findAll");
  59. } catch (Exception e) {
  60. e.printStackTrace();
  61. response.getWriter().write("删除失败");
  62. }
  63. }
  64. }
  • LinkManService
  1. public class linkManService {
  2. /**
  3. * 根据id删除联系人
  4. * @param id
  5. */
  6. public void deleteById(Integer id) throws SQLException {
  7. //调用dao层的方法,根据id删除联系人
  8. linkManDao.deleteById(id);
  9. }
  10. }
  • LinkManDao
  1. public void deleteById(Integer id) throws SQLException {
  2. String sql = "delete from linkman where id=?";
  3. runner.update(sql,id);
  4. }

四,小结

  1. 点击了确定之后请求服务器删除, 用到location.href请求
  1. Location.href="linkMan?action=delete&id="+id;
  1. 思路

    • 浏览器点击了确定之后, 请求LinkManServlet, 携带action=delete,id
    • 在LinkManServlet里面创建delete()方法

      1. //1.获得请求参数id
      2. //2.调用业务 根据id删除
      3. //3.再查询所有展示
    • 在LinkManService里面创建deleteById()

      1. public void deleteById(int id){
      2. //1.调用Dao 根据id删除
      3. }
    • 在LinkDao里面创建deleteById()

      1. public void deleteById(int id){
      2. //1.使用DBUtils根据id删除
      3. }

案例四:修改联系人

一、案例需求

1. 修改前的数据回显

Web综合练习 - 图10

2. 完成点击提交修改联系人的信息

二、案例流程分析

Web综合练习 - 图11

三、代码实现

1. 数据回显代码实现

list.jsp代码

  1. <td><a class="btn btn-default btn-sm" href="/linkman?action=findOne&id=${linkman.id}">修改</a>&nbsp;
  2. <a class="btn btn-default btn-sm" href="javascript:;" onclick="deleteLinkMan('${linkman.name}','${linkman.id}')">删除</a></td>

LinkManServlet代码

  1. package com.itheima.web.servlet;
  2. import com.itheima.entry.PageBean;
  3. import com.itheima.pojo.LinkMan;
  4. import com.itheima.service.LinkManService;
  5. import org.apache.commons.beanutils.BeanUtils;
  6. import javax.servlet.ServletException;
  7. import javax.servlet.annotation.WebServlet;
  8. import javax.servlet.http.HttpServlet;
  9. import javax.servlet.http.HttpServletRequest;
  10. import javax.servlet.http.HttpServletResponse;
  11. import java.io.IOException;
  12. import java.lang.reflect.Method;
  13. import java.util.List;
  14. import java.util.Map;
  15. /**
  16. * 包名:${PACKAGE_NAME}
  17. *
  18. * @author Leevi
  19. * 日期2020-07-18 08:53
  20. * LinkManServlet负责处理联系人模块的所有请求
  21. */
  22. @WebServlet("/linkman")
  23. public class LinkManServlet extends HttpServlet {
  24. private LinkManService linkManService = new LinkManService();
  25. @Override
  26. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  27. doGet(request, response);
  28. }
  29. @Override
  30. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  31. //1. 获取请求参数action的值
  32. String action = request.getParameter("action");
  33. //2. 判断action的值
  34. if ("findAll".equals(action)) {
  35. //调用findAll()方法查询所有
  36. findAll(request,response);
  37. }
  38. if ("add".equals(action)){
  39. add(request,response);
  40. }
  41. if ("delete".equals(action)){
  42. delete(request,response);
  43. }
  44. if("findOne".equals(action)){
  45. findOne(request,response);
  46. }
  47. }
  48. /**
  49. * 根据id查询联系人
  50. * @param request
  51. * @param response
  52. */
  53. private void findOne(HttpServletRequest request, HttpServletResponse response) throws IOException {
  54. try {
  55. //1. 获取要查询的联系人的id
  56. Integer id = Integer.valueOf(request.getParameter("id"));
  57. //2. 调用业务层的方法,根据id查询联系人
  58. LinkMan linkMan = linkManService.findById(id);
  59. //3. 将查询到的linkman对象存储到request域对象中
  60. request.setAttribute("linkman",linkMan);
  61. //4. 跳转到update.jsp页面
  62. request.getRequestDispatcher("/update.jsp").forward(request, response);
  63. } catch (Exception e) {
  64. e.printStackTrace();
  65. response.getWriter().write("数据回显失败");
  66. }
  67. }
  68. }

LinkManService代码

  1. package com.itheima.service;
  2. import com.itheima.dao.LinkManDao;
  3. import com.itheima.entry.PageBean;
  4. import com.itheima.pojo.LinkMan;
  5. import java.sql.SQLException;
  6. import java.util.List;
  7. /**
  8. * 包名:com.itheima.service
  9. *
  10. * @author Leevi
  11. * 日期2020-07-18 09:17
  12. */
  13. public class LinkManService {
  14. private LinkManDao linkManDao = new LinkManDao();
  15. public LinkMan findById(Integer id) throws SQLException {
  16. //调用dao层的方法,根据id查询联系人
  17. return linkManDao.findById(id);
  18. }
  19. }

LinkManDao代码

  1. package com.itheima.dao;
  2. import com.itheima.pojo.LinkMan;
  3. import com.itheima.utils.DruidUtil;
  4. import org.apache.commons.dbutils.QueryRunner;
  5. import org.apache.commons.dbutils.handlers.BeanHandler;
  6. import org.apache.commons.dbutils.handlers.BeanListHandler;
  7. import org.apache.commons.dbutils.handlers.ScalarHandler;
  8. import java.sql.SQLException;
  9. import java.util.List;
  10. /**
  11. * 包名:com.itheima.dao
  12. *
  13. * @author Leevi
  14. * 日期2020-07-18 09:18
  15. */
  16. public class LinkManDao {
  17. private QueryRunner runner = new QueryRunner(DruidUtil.getDataSource());
  18. public LinkMan findById(Integer id) throws SQLException {
  19. String sql = "select * from linkman where id=?";
  20. LinkMan linkMan = runner.query(sql, new BeanHandler<>(LinkMan.class), id);
  21. return linkMan;
  22. }
  23. }

update.jsp代码

  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
  2. <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
  3. <%
  4. String path = request.getContextPath();
  5. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
  6. %>
  7. <!DOCTYPE html>
  8. <!-- 网页使用的语言 -->
  9. <html lang="zh-CN">
  10. <head>
  11. <base href="<%=basePath%>"/>
  12. <!-- 指定字符集 -->
  13. <meta charset="utf-8">
  14. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  15. <meta name="viewport" content="width=device-width, initial-scale=1">
  16. <title>修改联系人</title>
  17. <link href="css/bootstrap.min.css" rel="stylesheet">
  18. <script src="js/jquery-2.1.0.min.js"></script>
  19. <script src="js/bootstrap.min.js"></script>
  20. </head>
  21. <body>
  22. <div class="container" style="width: 400px;">
  23. <h3 style="text-align: center;">修改联系人</h3>
  24. <form action="/linkman" method="post">
  25. <%--使用隐藏域携带id--%>
  26. <input type="hidden" name="id" value="${linkman.id}">
  27. <%--使用隐藏域携带action--%>
  28. <input type="hidden" name="action" value="update">
  29. <div class="form-group">
  30. <label for="name">姓名:</label>
  31. <input type="text" class="form-control" id="name" name="name"
  32. value="${linkman.name}" placeholder="请输入姓名" />
  33. </div>
  34. <div class="form-group">
  35. <label>性别:</label>
  36. <c:if test="${linkman.sex == '男'}">
  37. <input type="radio" name="sex" value="男" checked/>
  38. <input type="radio" name="sex" value="女" />
  39. </c:if>
  40. <c:if test="${linkman.sex == '女'}">
  41. <input type="radio" name="sex" value="男" />
  42. <input type="radio" name="sex" value="女" checked/>
  43. </c:if>
  44. </div>
  45. <div class="form-group">
  46. <label for="age">年龄:</label>
  47. <input type="text" class="form-control" value="${linkman.age}" id="age" name="age" placeholder="请输入年龄" />
  48. </div>
  49. <div class="form-group">
  50. <label for="address">籍贯:</label>
  51. <select name="address" id="address" class="form-control" >
  52. <c:if test="${linkman.address == '广东'}">
  53. <option value="广东" selected>广东</option>
  54. <option value="广西">广西</option>
  55. <option value="湖南">湖南</option>
  56. </c:if>
  57. <c:if test="${linkman.address == '广西'}">
  58. <option value="广东">广东</option>
  59. <option value="广西" selected>广西</option>
  60. <option value="湖南">湖南</option>
  61. </c:if>
  62. <c:if test="${linkman.address == '湖南'}">
  63. <option value="广东">广东</option>
  64. <option value="广西">广西</option>
  65. <option value="湖南" selected>湖南</option>
  66. </c:if>
  67. </select>
  68. </div>
  69. <div class="form-group">
  70. <label for="qq">QQ:</label>
  71. <input type="text" id="qq" value="${linkman.qq}" class="form-control" name="qq" placeholder="请输入QQ号码"/>
  72. </div>
  73. <div class="form-group">
  74. <label for="email">Email:</label>
  75. <input type="text" id="email" value="${linkman.email}" class="form-control" name="email" placeholder="请输入邮箱地址"/>
  76. </div>
  77. <div class="form-group" style="text-align: center">
  78. <input class="btn btn-primary" type="submit" value="提交" />
  79. <input class="btn btn-default" type="reset" value="重置" />
  80. <input class="btn btn-default" type="button" value="返回"/>
  81. </div>
  82. </form>
  83. </div>
  84. </body>
  85. </html>

2. 修改联系人代码实现

LinkManServlet代码

  1. package com.itheima.web.servlet;
  2. import com.itheima.entry.PageBean;
  3. import com.itheima.pojo.LinkMan;
  4. import com.itheima.service.LinkManService;
  5. import org.apache.commons.beanutils.BeanUtils;
  6. import javax.servlet.ServletException;
  7. import javax.servlet.annotation.WebServlet;
  8. import javax.servlet.http.HttpServlet;
  9. import javax.servlet.http.HttpServletRequest;
  10. import javax.servlet.http.HttpServletResponse;
  11. import java.io.IOException;
  12. import java.lang.reflect.Method;
  13. import java.util.List;
  14. import java.util.Map;
  15. /**
  16. * 包名:${PACKAGE_NAME}
  17. *
  18. * @author Leevi
  19. * 日期2020-07-18 08:53
  20. * LinkManServlet负责处理联系人模块的所有请求
  21. */
  22. @WebServlet("/linkman")
  23. public class LinkManServlet extends HttpServlet {
  24. private LinkManService linkManService = new LinkManService();
  25. @Override
  26. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  27. doGet(request, response);
  28. }
  29. @Override
  30. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  31. //1. 获取请求参数action的值
  32. String action = request.getParameter("action");
  33. //2. 判断action的值
  34. if ("findAll".equals(action)) {
  35. //调用findAll()方法查询所有
  36. findAll(request,response);
  37. }
  38. if ("add".equals(action)){
  39. add(request,response);
  40. }
  41. if ("delete".equals(action)){
  42. delete(request,response);
  43. }
  44. if("findOne".equals(action)){
  45. findOne(request,response);
  46. }
  47. if ("update".equals(action)){
  48. update(request,response);
  49. }
  50. }
  51. /**
  52. * 修改联系人的方法
  53. * @param request
  54. * @param response
  55. */
  56. private void update(HttpServletRequest request, HttpServletResponse response) throws IOException {
  57. try {
  58. //1. 获取所有请求参数封装到LinkMan对象中
  59. Map<String, String[]> parameterMap = request.getParameterMap();
  60. LinkMan linkMan = new LinkMan();
  61. BeanUtils.populate(linkMan,parameterMap);
  62. //2. 调用业务层的方法,修改联系人信息
  63. linkManService.update(linkMan);
  64. //3. 如果修改成功,则跳转到查询所有
  65. response.sendRedirect("/linkman?action=findAll");
  66. } catch (Exception e) {
  67. e.printStackTrace();
  68. response.getWriter().write("修改失败");
  69. }
  70. }
  71. }

LinkManService代码

  1. package com.itheima.service;
  2. import com.itheima.dao.LinkManDao;
  3. import com.itheima.entry.PageBean;
  4. import com.itheima.pojo.LinkMan;
  5. import java.sql.SQLException;
  6. import java.util.List;
  7. /**
  8. * 包名:com.itheima.service
  9. *
  10. * @author Leevi
  11. * 日期2020-07-18 09:17
  12. */
  13. public class LinkManService {
  14. private LinkManDao linkManDao = new LinkManDao();
  15. public void update(LinkMan linkMan) throws SQLException {
  16. //调用dao层的方法,修改联系人信息
  17. linkManDao.update(linkMan);
  18. }
  19. }

LinkManDao代码

  1. package com.itheima.dao;
  2. import com.itheima.pojo.LinkMan;
  3. import com.itheima.utils.DruidUtil;
  4. import org.apache.commons.dbutils.QueryRunner;
  5. import org.apache.commons.dbutils.handlers.BeanHandler;
  6. import org.apache.commons.dbutils.handlers.BeanListHandler;
  7. import org.apache.commons.dbutils.handlers.ScalarHandler;
  8. import java.sql.SQLException;
  9. import java.util.List;
  10. /**
  11. * 包名:com.itheima.dao
  12. *
  13. * @author Leevi
  14. * 日期2020-07-18 09:18
  15. */
  16. public class LinkManDao {
  17. private QueryRunner runner = new QueryRunner(DruidUtil.getDataSource());
  18. public void update(LinkMan linkMan) throws SQLException {
  19. String sql = "update linkman set name=?,age=?,sex=?,address=?,qq=?,email=? where id=?"; runner.update(sql,linkMan.getName(),linkMan.getAge(),linkMan.getSex(),linkMan.getAddress(),linkMan.getQq(),linkMan.getEmail(),linkMan.getId());
  20. }
  21. }

案例四:分页展示联系人

一,案例需求

Web综合练习 - 图12

  • 分页查询出联系人信息

二,技术分析

1,数据库操作 limit

  1. SELECT * FROM linkman LIMIT offset,length;
  2. -- 一, 解释limit
  3. -- offset: 跳过多少条数据 offset=(currentPage-1)*length
  4. -- length: 查询多少条数据(每页数据条数) 【自定义的】
  5. -- 二, 例子 分页查询联系人, 一页展示5
  6. -- 第一页 a=0 , b=5;
  7. -- 第二页 a=5 , b=5;
  8. -- 第三页 a=10 , b=5;

2. 分页需要的数据的封装

  1. //封装分页的数据的
  2. public class PageBean{
  3. //一页显示的联系人的集合 List<linkMan> list
  4. //当前页码 int curPage;
  5. //总页数 int sumPage;
  6. //联系人的总数 int count;
  7. //一页显示的数量 int curSize;
  8. }
  9. ----------
  10. 一共有10条, 一页显2条, 总页数sumPage = 5
  11. 一共有10条, 一页显3条, 总页数sumPage = 4
  12. 一共有11条, 一页显3条, 总页数sumPage = 4
  13. if(count % curSize == 0){
  14. sumPage = count/curSize;
  15. }else{
  16. sumPage = count/curSize+1;
  17. }

三,思路分析

详情请见分页分析图

四,代码实现

  • PageBean
  1. public class PageBean implements Serializable {
  2. //总条数
  3. private Long totalSize;
  4. //总页数
  5. private Long totalPage;
  6. //当前页数
  7. private Long currentPage;
  8. //每页条数
  9. private Integer pageSize;
  10. //当前页的数据集合
  11. private List<LinkMan> list;
  12. @Override
  13. public String toString() {
  14. return "PageBean{" +
  15. "totalSize=" + totalSize +
  16. ", totalPage=" + totalPage +
  17. ", currentPage=" + currentPage +
  18. ", pageSize=" + pageSize +
  19. ", list=" + list +
  20. '}';
  21. }
  22. public Long getTotalSize() {
  23. return totalSize;
  24. }
  25. public void setTotalSize(Long totalSize) {
  26. this.totalSize = totalSize;
  27. }
  28. public Long getTotalPage() {
  29. return totalPage;
  30. }
  31. public void setTotalPage(Long totalPage) {
  32. this.totalPage = totalPage;
  33. }
  34. public Long getCurrentPage() {
  35. return currentPage;
  36. }
  37. public void setCurrentPage(Long currentPage) {
  38. this.currentPage = currentPage;
  39. }
  40. public Integer getPageSize() {
  41. return pageSize;
  42. }
  43. public void setPageSize(Integer pageSize) {
  44. this.pageSize = pageSize;
  45. }
  46. public List<LinkMan> getList() {
  47. return list;
  48. }
  49. public void setList(List<LinkMan> list) {
  50. this.list = list;
  51. }
  52. }
  • LinkManServlet
  1. package com.itheima.web.servlet;
  2. import com.itheima.entry.PageBean;
  3. import com.itheima.pojo.LinkMan;
  4. import com.itheima.service.LinkManService;
  5. import org.apache.commons.beanutils.BeanUtils;
  6. import javax.servlet.ServletException;
  7. import javax.servlet.annotation.WebServlet;
  8. import javax.servlet.http.HttpServlet;
  9. import javax.servlet.http.HttpServletRequest;
  10. import javax.servlet.http.HttpServletResponse;
  11. import java.io.IOException;
  12. import java.lang.reflect.Method;
  13. import java.util.List;
  14. import java.util.Map;
  15. /**
  16. * 包名:${PACKAGE_NAME}
  17. *
  18. * @author Leevi
  19. * 日期2020-07-18 08:53
  20. * LinkManServlet负责处理联系人模块的所有请求
  21. */
  22. @WebServlet("/linkman")
  23. public class LinkManServlet extends HttpServlet {
  24. private LinkManService linkManService = new LinkManService();
  25. @Override
  26. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  27. doGet(request, response);
  28. }
  29. @Override
  30. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  31. //1. 获取请求参数action的值
  32. String action = request.getParameter("action");
  33. //2. 判断action的值
  34. if ("findAll".equals(action)) {
  35. //调用findAll()方法查询所有
  36. findAll(request,response);
  37. }
  38. if ("add".equals(action)){
  39. add(request,response);
  40. }
  41. if ("delete".equals(action)){
  42. delete(request,response);
  43. }
  44. if("findOne".equals(action)){
  45. findOne(request,response);
  46. }
  47. if ("update".equals(action)){
  48. update(request,response);
  49. }
  50. if ("findByPage".equals(action)){
  51. findByPage(request,response);
  52. }
  53. }
  54. private void findByPage(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
  55. try {
  56. //1. 获取请求参数currentPage和pageSize的值
  57. Long currentPage = Long.valueOf(request.getParameter("currentPage"));
  58. Integer pageSize = Integer.valueOf(request.getParameter("pageSize"));
  59. //2. 调用业务层的方法,查询当前页的pageBean
  60. PageBean<LinkMan> pageBean = linkManService.findByPage(currentPage,pageSize);
  61. //3. 将pageBean对象存储进request域对象
  62. request.setAttribute("page",pageBean);
  63. //4. 跳转到list_page.jsp页面
  64. request.getRequestDispatcher("/list_page.jsp").forward(request, response);
  65. } catch (Exception e) {
  66. e.printStackTrace();
  67. //分页查询失败
  68. response.getWriter().write("分页查询失败");
  69. }
  70. }
  71. }
  • LinkManService
  1. public PageBean findByPage(Long currentPage, Integer pageSize) throws SQLException {
  2. //1. 创建PageBean对象
  3. PageBean pageBean = new PageBean();
  4. //2. 设置pageBean中的五个属性
  5. //2.1 设置currentPage
  6. pageBean.setCurrentPage(currentPage);
  7. //2.2 设置pageSize
  8. pageBean.setPageSize(pageSize);
  9. //2.3 设置totalSize 总条数,先要调用dao层的方法,获取联系人的总条数
  10. Long totalSize = linkManDao.findTotalSize();
  11. pageBean.setTotalSize(totalSize);
  12. //2.4 设置totalPage,总页数等于总条数除以每页条数,但是如果除不尽则 +1
  13. Long totalPage = totalSize % pageSize == 0 ? totalSize / pageSize : (totalSize / pageSize) + 1;
  14. pageBean.setTotalPage(totalPage);
  15. //2.5 设置list
  16. List<LinkMan> list = linkManDao.findPageList(currentPage,pageSize);
  17. pageBean.setList(list);
  18. //3. 将pageBean返回
  19. return pageBean;
  20. }
  • LinkManDao
  1. public class linkManDao {
  2. /**
  3. * 查询总联系人的条数
  4. * @return
  5. */
  6. public Long findTotalSize() throws SQLException {
  7. String sql = "select count(*) from linkman";
  8. Long totalSize = (Long) runner.query(sql, new ScalarHandler());
  9. return totalSize;
  10. }
  11. /**
  12. * 查询当前页的联系人集合
  13. * @return
  14. */
  15. public List<LinkMan> findPageList(Long currentPage, Integer pageSize) throws SQLException {
  16. String sql = "select * from linkman limit ?,?";
  17. List<LinkMan> linkManList = runner.query(sql, new BeanListHandler<>(LinkMan.class), (currentPage - 1) * pageSize, pageSize);
  18. return linkManList;
  19. }
  20. }
  • list_page.jsp
  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  2. <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
  3. <!DOCTYPE html>
  4. <!-- 网页使用的语言 -->
  5. <html lang="zh-CN">
  6. <head>
  7. <!-- 指定字符集 -->
  8. <meta charset="utf-8">
  9. <!-- 使用Edge最新的浏览器的渲染方式 -->
  10. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  11. <!-- viewport视口:网页可以根据设置的宽度自动进行适配,在浏览器的内部虚拟一个容器,容器的宽度与设备的宽度相同。
  12. width: 默认宽度与设备的宽度相同
  13. initial-scale: 初始的缩放比,为1:1 -->
  14. <meta name="viewport" content="width=device-width, initial-scale=1">
  15. <!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! -->
  16. <title>Bootstrap模板</title>
  17. <!-- 1. 导入CSS的全局样式 -->
  18. <link href="css/bootstrap.min.css" rel="stylesheet">
  19. <!-- 2. jQuery导入,建议使用1.9以上的版本 -->
  20. <script src="js/jquery-2.1.0.min.js"></script>
  21. <!-- 3. 导入bootstrap的js文件 -->
  22. <script src="js/bootstrap.min.js"></script>
  23. <style type="text/css">
  24. td, th {
  25. text-align: center;
  26. }
  27. </style>
  28. </head>
  29. <body>
  30. <div class="container">
  31. <h3 style="text-align: center">显示所有联系人</h3>
  32. <table border="1" class="table table-bordered table-hover">
  33. <tr class="success">
  34. <th>编号</th>
  35. <th>姓名</th>
  36. <th>性别</th>
  37. <th>年龄</th>
  38. <th>籍贯</th>
  39. <th>QQ</th>
  40. <th>邮箱</th>
  41. <th>操作</th>
  42. </tr>
  43. <%--遍历当前页的联系人集合--%>
  44. <c:forEach items="${page.list}" var="linkman" varStatus="vst">
  45. <tr>
  46. <td>${vst.count}</td>
  47. <td>${linkman.name}</td>
  48. <td>${linkman.sex}</td>
  49. <td>${linkman.age}</td>
  50. <td>${linkman.address}</td>
  51. <td>${linkman.qq}</td>
  52. <td>${linkman.email}</td>
  53. <td><a class="btn btn-default btn-sm" href="修改联系人.html">修改</a>&nbsp;<a class="btn btn-default btn-sm" href="修改联系人.html">删除</a></td>
  54. </tr>
  55. </c:forEach>
  56. <tr>
  57. <td colspan="8" align="center">
  58. 总共有${page.totalPage}页,每页显示${page.pageSize}条
  59. <ul class="pagination success">
  60. <%--
  61. 如果当前不是第一页则显示上一页
  62. --%>
  63. <c:if test="${page.currentPage > 1}">
  64. <li><a href="/linkman?action=findByPage&pageSize=${page.pageSize}&currentPage=${page.currentPage-1}" aria-label="Previous">
  65. <span aria-hidden="true">&laquo;</span></a>
  66. </li>
  67. </c:if>
  68. <%--总共有多少页,就添加多少个li--%>
  69. <c:forEach begin="1" end="${page.totalPage}" var="i">
  70. <%--判断i是否是当前页,如果是则高亮显示,如果不是则不高亮--%>
  71. <c:if test="${i == page.currentPage}">
  72. <li class="active"><a href="javascript:;">${i}</a></li>
  73. </c:if>
  74. <c:if test="${i != page.currentPage}">
  75. <li><a href="/linkman?action=findByPage&pageSize=${page.pageSize}&currentPage=${i}">${i}</a></li>
  76. </c:if>
  77. </c:forEach>
  78. <%--
  79. 如果当前不是最后一页才显示下一页
  80. --%>
  81. <c:if test="${page.currentPage != page.totalPage}">
  82. <li><a href="/linkman?action=findByPage&pageSize=${page.pageSize}&currentPage=${page.currentPage+1}" aria-label="Next">
  83. <span aria-hidden="true">&raquo;</span></a>
  84. </li>
  85. </c:if>
  86. </ul>
  87. </td>
  88. </tr>
  89. </table>
  90. </div>
  91. </body>
  92. </html>

五,小结

扩展

1.PageBean优化

  1. package com.itheima.entry;
  2. import java.io.Serializable;
  3. import java.util.List;
  4. /**
  5. * 包名:com.itheima.entry
  6. *
  7. * @author Leevi
  8. * 日期2020-07-18 12:03
  9. */
  10. public class PageBean<T> implements Serializable {
  11. //总条数
  12. private Long totalSize;
  13. //总页数
  14. private Long totalPage;
  15. //当前页数
  16. private Long currentPage;
  17. //每页条数
  18. private Integer pageSize;
  19. //当前页的数据集合
  20. private List<T> list;
  21. @Override
  22. public String toString() {
  23. return "PageBean{" +
  24. "totalSize=" + totalSize +
  25. ", totalPage=" + totalPage +
  26. ", currentPage=" + currentPage +
  27. ", pageSize=" + pageSize +
  28. ", list=" + list +
  29. '}';
  30. }
  31. public Long getTotalSize() {
  32. return totalSize;
  33. }
  34. public void setTotalSize(Long totalSize) {
  35. this.totalSize = totalSize;
  36. }
  37. public Long getTotalPage() {
  38. return totalPage;
  39. }
  40. public void setTotalPage(Long totalPage) {
  41. this.totalPage = totalPage;
  42. }
  43. public Long getCurrentPage() {
  44. return currentPage;
  45. }
  46. public void setCurrentPage(Long currentPage) {
  47. this.currentPage = currentPage;
  48. }
  49. public Integer getPageSize() {
  50. return pageSize;
  51. }
  52. public void setPageSize(Integer pageSize) {
  53. this.pageSize = pageSize;
  54. }
  55. public List<T> getList() {
  56. return list;
  57. }
  58. public void setList(List<T> list) {
  59. this.list = list;
  60. }
  61. }

2,模块Servlet优化

  1. 问题:
    Web综合练习 - 图13

    • doGet()方法里面的 if 太多, 可读性很差
    • doGet()方法里面, 每加一个请求, 都需要添加一个if, 维护麻烦
  2. 解决: 反射

    • 一个if都不要
    • 优化之后, 代码就不变了, 不会随着请求的增加而增加if

      1. @WebServlet("/linkMan")
      2. public class LinkManServlet extends HttpServlet {
      3. private LinkManService linkManService = new LinkManService();
      4. @Override
      5. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      6. //1. 获取请求参数action的值
      7. String action = request.getParameter("action");
      8. //已知方法名,找到并且调用方法,可以使用反射技术
      9. //获取当前类的字节码对象
      10. try {
      11. Class clazz = this.getClass();
      12. //根据方法名获取方法
      13. Method method = clazz.getDeclaredMethod(action, HttpServletRequest.class, HttpServletResponse.class);
      14. //调用方法
      15. method.invoke(this,request,response);
      16. } catch (Exception e) {
      17. e.printStackTrace();
      18. }
      19. }
      20. }