javaee之用户信息增删改查案例

之前页面是这样的

我们要做更多,更复杂的功能,所以把页面变更了一下

 

我们可以去一个前端框架里面找我们需要的代码

比如这个部分

我们可以用这个部分的代码:

 

 下面把添加联系人与删除选中,放到右上方去

然后在最下面我们插入一个分页的动作,我们也可以直接从Bootstrap中提取源代码

仔细看一下上面,还有一个复选框没做

在表头上面添加一个新列,复选框的列 

 

上面的页面就改造如下了 

 

 下面我们就要来完成功能

第一个登录功能

里面有一个login.html,我们还是要变成jsp页面

无非就是加一个这个语句

<%@ page contentType="text/html;charset=UTF-8" language="java" %>

先直观的看一下这个页面

是不是有一个输入验证码,需要一个验证码图片,其实就是一个输出文件

我就拿过去,放在相应的位置

这个位置的src是不是要相应的变一下

 

这个位置就是插入了一张验证码

把这个验证码的源代码直接放入:
 

package web.servlet;

import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;

/**
 * 验证码
 */
@WebServlet("/checkCodeServlet")
public class CheckCodeServlet extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
		
		//服务器通知浏览器不要缓存
		response.setHeader("pragma","no-cache");
		response.setHeader("cache-control","no-cache");
		response.setHeader("expires","0");
		
		//在内存中创建一个长80,宽30的图片,默认黑色背景
		//参数一:长
		//参数二:宽
		//参数三:颜色
		int width = 80;
		int height = 30;
		BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
		
		//获取画笔
		Graphics g = image.getGraphics();
		//设置画笔颜色为灰色
		g.setColor(Color.GRAY);
		//填充图片
		g.fillRect(0,0, width,height);
		
		//产生4个随机验证码,12Ey
		String checkCode = getCheckCode();
		//将验证码放入HttpSession中
		request.getSession().setAttribute("CHECKCODE_SERVER",checkCode);
		
		//设置画笔颜色为黄色
		g.setColor(Color.YELLOW);
		//设置字体的小大
		g.setFont(new Font("黑体",Font.BOLD,24));
		//向图片上写入验证码
		g.drawString(checkCode,15,25);
		
		//将内存中的图片输出到浏览器
		//参数一:图片对象
		//参数二:图片的格式,如PNG,JPG,GIF
		//参数三:图片输出到哪里去
		ImageIO.write(image,"PNG",response.getOutputStream());
	}
	/**
	 * 产生4位随机字符串 
	 */
	private String getCheckCode() {
		String base = "0123456789ABCDEFGabcdefg";
		int size = base.length();
		Random r = new Random();
		StringBuffer sb = new StringBuffer();
		for(int i=1;i<=4;i++){
			//产生0到size-1的随机值
			int index = r.nextInt(size);
			//在base字符串中获取下标为index的字符
			char c = base.charAt(index);
			//将c放入到StringBuffer中去
			sb.append(c);
		}
		return sb.toString();
	}
	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		this.doGet(request,response);
	}
}



 然后重启服务器,页面就变成了

这个时候我们去完成js里面一个函数,点击验证码刷新功能

也就是在这个页面去完成上面这个refreshCode()这个函数
这里说一下切换验证码的原理

在img的src中,如果src的地址栏不变,就会从缓存中取出数据,从而不会发生一次服务器请求,这样,页面就不会刷新,从而得到新的验证码。

我们只要每次点击改变img里面src连接不就可以,也就是连接不一样,就相当于重新生成了一次验证码 ,要使连接不一样,我们后面就跟一个时间戳,时间戳永远不会重复嘛

function refreshCode() {
			var date = new Date();
			var verfiCode = document.getElementById("vcode");
			verfiCode.src = "${pageContext.request.contextPath}/checkCodeServlet?time=" + date.getTime();
		}

这里插入一个题外话,我们在使用EL表达式的时候,你不是说有内置对象可以使用嘛,为什么我在获取虚拟目录的时候,需要${pageContext.request.contextPath},而不直接${request.contextPath}呢,为什么不直接引用这个request这个对象,那么我们来看一下el的是一个内置隐式对象,我们可以拿来使用的

我们可以清楚的看到,对于request来说,确实是有一个相关的隐式对象,但这个对象是,RequestScope这个的含义是,获取request域里面 设置的值,上面我们基本可以看到获取的都是相关对象里面设置的值,而不是这个对象。所以,获取对象还是要借助PageContext这个域来做。

它可以来获取jsp内置的9个对象

下面我们来做一个登录的功能

也就是拿到用户的输入然后与数据库中的数据进行匹配

我们先来看一下之前的表

这个表里面并没有关于用户名与密码的数据,所以,我们要对表进行改造一下

加一个用户名与密码的字段

查询一下这张表,发现为空表

 

那么向表里插入两条数据

 

 当然,也可以用sqlyog客户端直接修改,这里用代码,也是熟悉sql语句代码

我们在User.java里面也要把这两条字段给加上,同时要生成相应的set与get方法

然后我们就要写一个LoginServlet页面,来处理登录信息,调动service,service去调用dao层来进行一个数据的处理

下面说一个问题:为什么我们经常把一个数据表里面东西做成一个类来处理

这样可以比如我们根据用户名与密码查询了某个信息,然后可以通过Utils直接返回这个类对象给我们操作,他会自动封装我们需要的数据。

下面我们依次从servlet->service->dao去定义然后实现相应的方法

话不多说,上代码:

先来看两个前端页面

login.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<!-- 网页使用的语言 -->
<html lang="zh-CN">
<head>
    <!-- 指定字符集 -->
    <meta charset="utf-8">
    <!-- 使用Edge最新的浏览器的渲染方式 -->
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <!-- viewport视口:网页可以根据设置的宽度自动进行适配,在浏览器的内部虚拟一个容器,容器的宽度与设备的宽度相同。
    width: 默认宽度与设备的宽度相同
    initial-scale: 初始的缩放比,为1:1 -->
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! -->
    <title>用户信息管理系统</title>

    <!-- 1. 导入CSS的全局样式 -->
    <link href="css/bootstrap.min.css" rel="stylesheet">
    <!-- 2. jQuery导入,建议使用1.9以上的版本 -->
    <script src="js/jquery-2.1.0.min.js"></script>
    <!-- 3. 导入bootstrap的js文件 -->
    <script src="js/bootstrap.min.js"></script>
    <style type="text/css">
        td, th {
            text-align: center;
        }
    </style>
</head>
<body>
<div class="container">
    <h3 style="text-align: center">用户信息列表</h3>
    <div style="float:left">
    <form class="form-inline">
        <div class="form-group">
            <label for="exampleInputName2">姓名</label>
            <input type="text" class="form-control" id="exampleInputName2" placeholder="">
        </div>
        <div class="form-group">
            <label for="exampleInputAddress2">籍贯</label>
            <input type="email" class="form-control" id="exampleInputAddress2" placeholder="">
        </div>
        <div class="form-group">
            <label for="exampleInputEmail2">邮箱</label>
            <input type="email" class="form-control" id="exampleInputEmail2" placeholder="">
        </div>
        <button type="submit" class="btn btn-default">查询</button>
    </form>
    </div>
    <div style="float: right;margin-bottom:5px;">
        <a class="btn btn-primary" href="add.html">添加联系人</a>
        <a class="btn btn-primary" href="add.html">删除选中</a>
    </div>
    <table border="1" class="table table-bordered table-hover">
        <tr class="success">
            <th><input type="checkbox"/></th>
            <th>编号</th>
            <th>姓名</th>
            <th>性别</th>
            <th>年龄</th>
            <th>籍贯</th>
            <th>QQ</th>
            <th>邮箱</th>
            <th>操作</th>
        </tr>
        <!--
        利用jstl标签把这里面的东西简化
        -->
        <c:forEach items="${users}" varStatus="s" var="user">
            <tr>
                <td><input type="checkbox"/></td>
                <td>${s.count}</td>
                <td>${user.name}</td>
                <td>${user.gender}</td>
                <td>${user.age}</td>
                <td>${user.address}</td>
                <td>${user.qq}</td>
                <td>${user.email}</td>
                <td>
                    <a class="btn btn-default btn-sm" href="update.html">修改</a>
                    <a class="btn btn-default btn-sm" href="">删除</a>
                </td>
            </tr>
        </c:forEach>
    </table>

    <div>
        <nav>
            <ul class="pagination">
                <li>
                    <a href="#" aria-label="Previous">
                        <span aria-hidden="true">&laquo;</span>
                    </a>
                </li>
                <li><a href="#">1</a></li>
                <li><a href="#">2</a></li>
                <li><a href="#">3</a></li>
                <li><a href="#">4</a></li>
                <li><a href="#">5</a></li>
                <li>
                    <a href="#" aria-label="Next">
                        <span aria-hidden="true">&raquo;</span>
                    </a>
                </li>
                <span style="font-size:25px;margin-left: 4px;">
                    共16条记录,共4页
                </span>
            </ul>
        </nav>
    </div>
</div>
</body>
</html>

index.jsp

<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2022/3/21
  Time: 16:35
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="utf-8"/>
  <meta http-equiv="X-UA-Compatible" content="IE=edge"/>
  <meta name="viewport" content="width=device-width, initial-scale=1"/>
  <title>首页</title>

  <!-- 1. 导入CSS的全局样式 -->
  <link href="css/bootstrap.min.css" rel="stylesheet">
  <!-- 2. jQuery导入,建议使用1.9以上的版本 -->
  <script src="js/jquery-2.1.0.min.js"></script>
  <!-- 3. 导入bootstrap的js文件 -->
  <script src="js/bootstrap.min.js"></script>
  <script type="text/javascript">
  </script>
</head>
<body>
<!--
这个位置接收从LoginServlet页面传过来的对象
-->
<div>
  <c:if test="${user.username != null}">
      欢迎你,${user.username},查询用户信吧!
  </c:if>
</div>
<div align="center">
  <a
          href="${pageContext.request.contextPath}/userListServlet" style="text-decoration:none;font-size:33px">查询所有用户信息
  </a>
</div>
</body>
</html>

LoginServlet

package web.servlet;

import domain.User;
import org.apache.commons.beanutils.BeanUtils;
import service.UserService;
import service.impl.UserServiceImpl;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.Map;

@WebServlet("/loginServlet")
public class LoginServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置数据编码
        request.setCharacterEncoding("utf-8");
        //拿到用户名与密码,我们用beanutils来进行处理
        //拿到所有参数,参数拿到的都是字符串信息
        Map<String,String[]>  map = request.getParameterMap();
        //然后利用utils中的populate给她封装到一个对象里面去
        User loginUser = new User();
        try {
            BeanUtils.populate(loginUser,map);//这个只会把我们找到匹配的值放进去,其他属性不会被赋值进去
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
        UserService userService = new UserServiceImpl();
        //下面我们要去到验证码的字符串信息
        //先获取用户输入的信息
        String verfiStr = request.getParameter("verifycode");
        //然后这个验证码是被我们放到session里面去了,获取session对象拿到属性信息
        String checkCodeStr = (String)request.getSession().getAttribute("CHECKCODE_SERVER");
        //然后先来判断一下验证码是否正确
        if(checkCodeStr != null && verfiStr.equalsIgnoreCase(checkCodeStr)) {
            //这条路才是合理的
            //合理就要来判断用户名与密码
            //调用UserService里面的方法进行判断,当然他会去调用dao层更具体的方法
            //这里会返回了实际查找到的数据
            User user = userService.login(loginUser);
            if(user == null) {
                //跳转到login.jsp页面
                request.setAttribute("loginMsg","username is error or password error");
                //然后实现页面分发
                request.getRequestDispatcher("/login.jsp").forward(request,response);
            } else {
                //这个就是成功了,直接跳转到首页,首页接收用户名
                request.setAttribute("user",user);
                //然后实现页面分发,跳转到首页
                request.getRequestDispatcher("/index.jsp").forward(request,response);
            }
        } else {
            //这个就是验证码错误
            request.setAttribute("loginMsg","verify code is error");
            //然后还是跳转到登录页面
            request.getRequestDispatcher("/login.jsp").forward(request,response);
        }
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

再去service层面看看

UserService

import domain.User;

import java.util.List;

//用户管理的业务接口
//这里面方法命名尽可能大一点,比如登录,查找,添加
//而在dao层里面命名的方法尽可能细节一点,比如登录对应findByUsernameAndPassword这样的方法
public interface UserService {

    //查询所有用户信息
    public List<User> findAll();

    //判断登录
    public User login(User loginUser);
}

UserServiceImpl

package service.impl;

import dao.UserDao;
import dao.impl.UserDaoImpl;
import domain.User;
import service.UserService;

import java.util.List;

public class UserServiceImpl implements UserService {
    //内部调用dao层的方法来进行查询,不要写到方法里面去
    //不然每次都要来实现这个方法
    UserDao userDao = new UserDaoImpl();
    @Override
    public List<User> findAll() {
        //内部调用dao层的方法来进行查询
        return userDao.findAll();
    }

    @Override
    public User login(User loginUser) {
        return userDao.findByUsernameAndPassword(loginUser);
    }
}

再去dao层看看

UserDao

package dao;

import domain.User;

import java.util.List;

/**
 * 用户来操作的Dao
 */
public interface UserDao {
   //查找所有用户
   public List<User> findAll();
   //根据用户名与密码查找某个用户
   public User findByUsernameAndPassword(User loginUser);
}

UserDaoImpl

package dao.impl;

import dao.UserDao;
import domain.User;
import org.apache.commons.beanutils.BeanUtils;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import util.JDBCUtils;

import java.util.List;

public class UserDaoImpl implements UserDao {

    //创建一个JdbcTemplate模板对象,内部只需要传入一个数据源就ok
    private JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDs());
    @Override
    public List<User> findAll() {
        //这个就是使用JDBCTemplate来做
        //直接可以调用jdbcTemplate里面的一些方法操作
        //这里是查询
        String sql = "select * from user";//查询这张表的信息
        //我们想的干的是啥?
        //把数据库中每一行数据抽离出来,变成一个对象装载集合返回
        List<User> list = jdbcTemplate.query(sql,new BeanPropertyRowMapper<User>(User.class));
        return list;
    }

    @Override
    public User findByUsernameAndPassword(User loginUser) {
        //这里是具体的业务逻辑
        String sql = "select * from user where username = ? and password = ?";
        System.out.println(loginUser.getUsername() + " " + loginUser.getPassword());
        //这里要返回一个对象,我们还是用JdbcTemplate来实行查询
        //这个方法会给我们返回一个对象,这个方法如果没有找到实际
        //就会给我们抛出一个异常,并不会直接给我们返回一个null
        //所以必须把这个异常给捕获,然后返回一个null
        try {
            User user = jdbcTemplate.queryForObject(sql,new BeanPropertyRowMapper<User>(User.class),loginUser.getUsername(),loginUser.getPassword());
            return  user;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}

下面我们测试一下登录功能

先把验证码输错,就会提示,

验证码正确,用户或者密码输错

下面全部输入,然后进入index.jsp

 

 

 下面来做一个添加联系人页面

还是按照上面来分析把一个html页面变成jsp页面

点击添加联系人,进入add.jsp页面,然后jsp页面就会跳转到一个servlet页面进行处理,service去调用dao层,然后完成之后,我们肯定要重新查询,展示在list.jsp中,所以,我们还要重新访问userListServlet页面,因为是这个页面给我们完成的查询,然后跳转到list.jsp的动作。

先把index.jsp里面修改一下

有人就说了,为什么不加${pageContext.request.contextPath}/add.jsp,因为这个是服务器内部的一个href的静态资源链接跳转,没有数据提交,也就没有请求。

 

现在就可以去实现addUserServlet

 这个页面作用就是去调用servcie层的方法去把数据添加到数据库中,然后返回一个对象传过来,然后调用用户展示页面去展示。

话不多说,直接上代码

先来看add.jsp页面代码:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<!-- 网页使用的语言 -->
<html lang="zh-CN">
<head>
    <!-- 指定字符集 -->
    <meta charset="utf-8">
    <!-- 使用Edge最新的浏览器的渲染方式 -->
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <!-- viewport视口:网页可以根据设置的宽度自动进行适配,在浏览器的内部虚拟一个容器,容器的宽度与设备的宽度相同。
    width: 默认宽度与设备的宽度相同
    initial-scale: 初始的缩放比,为1:1 -->
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! -->
    <title>添加用户</title>

    <!-- 1. 导入CSS的全局样式 -->
    <link href="css/bootstrap.min.css" rel="stylesheet">
    <!-- 2. jQuery导入,建议使用1.9以上的版本 -->
    <script src="js/jquery-2.1.0.min.js"></script>
    <!-- 3. 导入bootstrap的js文件 -->
    <script src="js/bootstrap.min.js"></script>
</head>
<body>
<div class="container">
    <center><h3>添加联系人页面</h3></center>
    <!--
    这是往服务器提交资源了。。。
    那么必须向服务器请求,提交到一个servlet
    然后调用service,然后调用dao
    -->
    <form action="${pageContext.request.contextPath}/addUserServlet" method="post">
        <div class="form-group">
            <label for="name">姓名:</label>
            <input type="text" class="form-control" id="name" name="name" placeholder="请输入姓名">
        </div>

        <div class="form-group">
            <label>性别:</label>
            <input type="radio" name="gender" value="男" checked="checked"/>男
            <input type="radio" name="gender" value="女"/>女
        </div>

        <div class="form-group">
            <label for="age">年龄:</label>
            <input type="text" class="form-control" id="age" name="age" placeholder="请输入年龄">
        </div>

        <div class="form-group">
            <label for="address">籍贯:</label>
            <select name="address" class="form-control" id="address">
                <option value="广东">广东</option>
                <option value="广西">广西</option>
                <option value="湖南">湖南</option>
            </select>
        </div>

        <div class="form-group">
            <label for="qq">QQ:</label>
            <input type="text" class="form-control" name="qq"  id = "qq" placeholder="请输入QQ号码"/>
        </div>

        <div class="form-group">
            <label for="email">Email:</label>
            <input type="text" class="form-control" id = "email" name="email" placeholder="请输入邮箱地址"/>
        </div>

        <div class="form-group" style="text-align: center">
            <input class="btn btn-primary" type="submit" value="提交" />
            <input class="btn btn-default" type="reset" value="重置" />
            <input class="btn btn-default" type="button" value="返回" />
        </div>
    </form>
</div>
</body>
</html>

 下面来看AddUserServlet

package web.servlet;

import domain.User;
import org.apache.commons.beanutils.BeanUtils;
import service.UserService;
import service.impl.UserServiceImpl;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.Map;

@WebServlet("/addUserServlet")
public class AddUserServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置一下请求字符集,避免乱码
        request.setCharacterEncoding("utf-8");
        UserService userService = new UserServiceImpl();
        User user = new User();
        //拿到add.jsp页面传过来的数据
        //封装到一个对象里面
        Map<String,String[]> map = request.getParameterMap();
        //调用BeanUtils来进行封装
        try {
            BeanUtils.populate(user,map);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
        //下面就要调用service里面的方法,把user添加进去
        userService.add(user);
        //这个时候再来处理一下页面分发
        request.getRequestDispatcher("/userListServlet").forward(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

下面去看service层实现的方法 

下面去看dao层的具体实现方法

@Override
    public void addUser(User user) {
        //说白了就是向数据库增加一条记录
        String sql = "INSERT INTO USER" +
                "(name,gender,age,address,qq,email)" +
                "VALUES" +
                "(?,?,?,?,?,?)";
        //用template模板来执行sql语句
        //这里不是query
        //得用update执行
        jdbcTemplate.update(sql,user.getName(),user.getGender(),user.getAge(),user.getAddress(),user.getQq(),user.getEmail());
    }

 下面我们来做这其中的一个删除角标

分析:

删除肯定还是提交到一个servlet里面,然后调用service ,service调用dao层来实现删除

这里删除里面的href连接肯定是去访问一个delUserServlet页面,然后传一个id过去,但是这样做我们一点击删除就直接删除了,所以,这里我们调用一个javascript函数来做,当我们删除的时候给我们弹出一个确认框

看一下js代码:

 function delUser(id) {
            //给用户一个安全提示
            if(conifrm("确定删除吗?")) {
                //改变访问地址
                //这里必须要注意把id给传过去
                location.href = "${pageContext.request.contextPath}/delUserServlet?id=" + id;
            }
        }

 然后我们在web层的servlet下面写DelUserServlet页面

package web.servlet;

import service.UserService;
import service.impl.UserServiceImpl;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/delUserServlet")
public class DelUserServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //删除不用设置字符集
        //获取参数id
        String id = request.getParameter("id");
        //我们调用service里面delete来进行删除
        UserService userService = new UserServiceImpl();
        userService.delete(Integer.parseInt(id));
        //然后我们需要跳转到首页去,这个是服务器内部内部跳转
        //这个不会产生新请求,服务器内部跳转
       // request.getRequestDispatcher("/userListServlet").forward(request,response);
        //我们还可以用sendRedirect来实现跳转,这个会产生一个新请求
        response.sendRedirect(request.getContextPath()+"/userListServlet");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

下面看service层

然后来看dao层

 

好了,继续下一个功能

上面做了删除,下面来做修改

既然要修改信息,那么点击修改的时候,这个页面就必须回显全部的信息 

1.我们先要查询一个用户的信息,根据id来进行查询

2.根据id查询用户信息,然后返回一个User 对象

3.将User对象存到request中,然后转发到update.jsp页面,然后在这个页面用el 表达式来回显信息

4.然后用户,点提交,又会进入一个servlet页面,然后获取表单数据,然后封装user对象,然后修改页面,最后跳转到查询所有用户的页面

但是你要想我们要修改,就必获得某个用户的Id啊,根据id名字才能修改,我们有一个做法是在update.jsp页面设置一个隐藏域提交id

好了,直接上代码

先看一下list.jsp这个位置的跳转

在来看update.jsp页面 

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<!-- 网页使用的语言 -->
<html lang="zh-CN">
    <head>
        <!-- 指定字符集 -->
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>修改用户</title>

        <link href="css/bootstrap.min.css" rel="stylesheet">
        <script src="js/jquery-2.1.0.min.js"></script>
        <script src="js/bootstrap.min.js"></script>
        
    </head>
    <body>
        <div class="container" style="width: 400px;">
        <h3 style="text-align: center;">修改联系人</h3>
        <form action="" method="post">
          <div class="form-group">
            <label for="name">姓名:</label>
            <!--这里面的数据从服务器过来,然后回显,也就是
            利用el表达式设置一些默认的值
            -->

            <input type="text" class="form-control" id="name" name="name"  value = "${user.name}" readonly="readonly" placeholder="请输入姓名" />
          </div>

          <div class="form-group">
            <label>性别:</label>
              <!--
              关于性别回显,是要给某个框设置一个checked才是选中
              这里采用jstl标签来判断数据库里面保存的值是男还是女
              然后在设置checked属性
              -->
              <c:if test = "${user.gender == '男'}">
                  <input type="radio" name="gender" value="男"  checked/>男
                  <input type="radio" name="gender" value="女"  />女
              </c:if>
              <c:if test = "${user.gender == '女'}">
                  <input type="radio" name="gender" value="男" />男
                  <input type="radio" name="gender" value="女"  checked>女
              </c:if>
          </div>

          <div class="form-group">
            <label for="age">年龄:</label>
            <input type="text" class="form-control" id="age"  name="age" value ="${user.age}" placeholder="请输入年龄" />
          </div>

          <div class="form-group">
            <label for="address">籍贯:</label>
              <!--
              对于下拉选择框来说,就是给某一个标签设置一个selected属性,这个下拉框就默认选中了
              -->
             <select name="address" id = "address"class="form-control" >
                 <c:if test = "${user.address == '广东'}">
                     <option value="广东" selected>广东</option>
                     <option value="广西">广西</option>
                     <option value="湖南">湖南</option>
                 </c:if>
                 <c:if test = "${user.address == '广西'}">
                     <option value="广东">广东</option>
                     <option value="广西" selected>广西</option>
                     <option value="湖南">湖南</option>
                 </c:if>
                 <c:if test = "${user.address == '湖南'}">
                     <option value="广东">广东</option>
                     <option value="广西">广西</option>
                     <option value="湖南" selected>湖南</option>
                 </c:if>
            </select>
          </div>

          <div class="form-group">
            <label for="qq">QQ:</label>
            <input type="text" class="form-control" name="qq" id = "qq" value = "${user.qq}"placeholder="请输入QQ号码"/>
          </div>

          <div class="form-group">
            <label for="email">Email:</label>
            <input type="text" class="form-control" name="email"  value = "${user.email}" id = "email" placeholder="请输入邮箱地址"/>
          </div>

             <div class="form-group" style="text-align: center">
                <input class="btn btn-primary" type="submit" value="提交" />
                <input class="btn btn-default" type="reset" value="重置" />
                <input class="btn btn-default" type="button" value="返回"/>
             </div>
        </form>
        </div>
    </body>
</html>

再来看FindUserServlet

package web.servlet;

import domain.User;
import service.UserService;
import service.impl.UserServiceImpl;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/findUserServlet")
public class FindUserServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置字符键编码
        //获取数据查询id
        String id = request.getParameter("id");
        //调用service
        UserService userservice = new UserServiceImpl();
        User user = userservice.findUser(Integer.parseInt(id));
        //将User对象存到request里面
        request.setAttribute("user",user);
        //将页面转发到update.jsp中
        request.getRequestDispatcher("/update.jsp").forward(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

再去看service层

 再来看dao层

然后看结果

 

上面数据的修改回显就成功了,下面我们就要来在update页面,在写一个servlet来提交修改数据

,首先在update页面传递一个隐藏域,把id给这个修改数据的servlet传过去

 

 话不多说,直接上代码:UpdateUserServlet

package web.servlet;

import domain.User;
import org.apache.commons.beanutils.BeanUtils;
import service.UserService;
import service.impl.UserServiceImpl;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.Map;

@WebServlet("/updateUserServlet")
public class UpdateUserServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置字符集编码,当我们需要处理数据的时候
        //就要设置数据的字符集,不然放回数据的数据就会出现乱码
        request.setCharacterEncoding("utf-8");
        UserService userService = new UserServiceImpl();
        User user = new User();
        //把所有修改的数据全部收集起来做成一个map集合
        Map<String,String[]> map = request.getParameterMap();
        try {
            //会封装与类相对应的字段
            BeanUtils.populate(user,map);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
        //然后调用service层,实现数据数据修改,最后,返回调用userListServlet展示修改后的页面
        userService.update(user);
        response.sendRedirect(request.getContextPath() + "/userListServlet");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

再来看service

再来看dao

 @Override
    public void updateUser(User user) {
        String sql = "UPDATE USER SET NAME = ?,gender = ?,age = ?,address = ?,qq = ?,email = ? WHERE id = ?";
        jdbcTemplate.update(sql,user.getName(),user.getGender(),user.getAge(),user.getAddress(),user.getQq(),user.getEmail(),user.getId());
    }

 然后可以直接修改结果提交。

下面来做这个删除选中的功能

 删除选中分析思路,删除选中,主要还是在于如何大量提交用户的id,然后交给servlet,然后调用servcie,循环删除所有选中的id.

这里有一个小贴士就是,复选框本身我们提交的时候,就会把我们选中的值,也就说,就会把我们勾选的值进行提交,所以,如果它本身就可以帮我们把选中的值提交,那我用一个form表单把这些复选框包裹起来,然后提交就好了。而且当你选中了一个复选框,那么它的checked属性也就被自动选中了。

这里又会出现一个问题,在我们点击删除选中的时候,肯定要判断一下,你有没有选中的条目,有才提交,没有我们就啥也不做。

我们先来写前端代码,获取选中的id,然后进行提交。

先来看list.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<!-- 网页使用的语言 -->
<html lang="zh-CN">
<head>
    <!-- 指定字符集 -->
    <meta charset="utf-8">
    <!-- 使用Edge最新的浏览器的渲染方式 -->
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <!-- viewport视口:网页可以根据设置的宽度自动进行适配,在浏览器的内部虚拟一个容器,容器的宽度与设备的宽度相同。
    width: 默认宽度与设备的宽度相同
    initial-scale: 初始的缩放比,为1:1 -->
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! -->
    <title>用户信息管理系统</title>

    <!-- 1. 导入CSS的全局样式 -->
    <link href="css/bootstrap.min.css" rel="stylesheet">
    <!-- 2. jQuery导入,建议使用1.9以上的版本 -->
    <script src="js/jquery-2.1.0.min.js"></script>
    <!-- 3. 导入bootstrap的js文件 -->
    <script src="js/bootstrap.min.js"></script>
    <style type="text/css">
        td, th {
            text-align: center;
        }
    </style>
    <script>
        function delUser(id) {
            //给用户一个安全提示
            if(confirm("确定删除吗?")) {
                //改变访问地址
                //这里必须要注意把id给传过去
                location.href = "${pageContext.request.contextPath}/delUserServlet?id=" + id;
            }
        }

        //给删除选中绑定一个点击事件
        //这个删除选中是在页面完成之后才能获取
        //所以我们设置页面加载之后获取
        window.onload = function() {
            document.getElementById("delSelected").onclick = function () {
                if (confirm("是否要删选所有选中?")) {
                    //如果点击是就会进来
                    //进来之后,我们要判断一下有没有选中的条目
                    //那么这里怎么判断有没有选中条目,如果选中
                    //那么就会有一个checked属性存在

                    var flag = false;//有没有被选中的标识
                    //有多少个uid都会被获取到,获取所有
                    var checkBoxs = document.getElementsByName("uid");
                    for (var i = 0; i < checkBoxs.length; i++) {
                        //如果有选中的条目
                        if (checkBoxs[i].checked) {
                            flag = true;
                            break;
                        }
                    }

                    if (flag == true) {
                        //通过js提交表单
                        //form对象有一个submit可以帮助我们提交表单
                        document.getElementById("form").submit();
                    }

                }
            }

            //另外我们还要做的一个js功能就是
            //点击表头的复选框,然后实现数据框全选
            /**
             * 这个原理也简单,先获取到表头的复选框,然后让表头复选框的状态赋值给下面每一个复选框
             *
             */
            document.getElementById("firstCheckBox").onclick = function () {
                //获取所有需要提交的复选框
                var checkBoxs = document.getElementsByName("uid");
                //循环,让checked状态变为true
                for (var i = 0; i < checkBoxs.length; i++) {
                    checkBoxs[i].checked = true;//等于调用者的checked状态
                }
            }
        }
    </script>
</head>
<div class="container">
    <h3 style="text-align: center">用户信息列表</h3>
    <div style="float:left">
    <form class="form-inline">
        <div class="form-group">
            <label for="exampleInputName2">姓名</label>
            <input type="text" class="form-control" id="exampleInputName2" placeholder="">
        </div>
        <div class="form-group">
            <label for="exampleInputAddress2">籍贯</label>
            <input type="email" class="form-control" id="exampleInputAddress2" placeholder="">
        </div>
        <div class="form-group">
            <label for="exampleInputEmail2">邮箱</label>
            <input type="email" class="form-control" id="exampleInputEmail2" placeholder="">
        </div>
        <button type="submit" class="btn btn-default">查询</button>
    </form>
    </div>
    <div style="float: right;margin-bottom:5px;">
        <a class="btn btn-primary" href="add.jsp">添加联系人</a>
        <!--
        我们这给删除选中通过id设置一个点击事件
       这个事件就是当我们点击删除选中之后,就会把表单给我们提交到相应的页面上
        -->
        <a class="btn btn-primary" href="javascript:void(0);" id ="delSelected">删除选中</a>
    </div>
    <!--
        这个form表单的任务是帮助我们进行复选框的id提交
        既然要提交选中的复选框,那么我们就要先给复选框name与value
        才可进行提交
    -->
    <form id = "form" action = "${pageContext.request.contextPath}/delSelectServlet" method = "post">
        <table border="1" class="table table-bordered table-hover">
        <tr class="success">
            <th><input id = "firstCheckBox" type="checkbox"/></th>
            <th>编号</th>
            <th>姓名</th>
            <th>性别</th>
            <th>年龄</th>
            <th>籍贯</th>
            <th>QQ</th>
            <th>邮箱</th>
            <th>操作</th>
        </tr>
        <!--
        利用jstl标签把这里面的东西简化
        -->
        <c:forEach items="${users}" varStatus="s" var="user">
            <tr>
                <!--
                    这个位置的value就是把真正的id值给提交了过去
                -->
                <td><input type="checkbox" name="uid" value = "${user.id}"/></td>
                <td>${s.count}</td>
                <td>${user.name}</td>
                <td>${user.gender}</td>
                <td>${user.age}</td>
                <td>${user.address}</td>
                <td>${user.qq}</td>
                <td>${user.email}</td>
                <td>
                    <!--先跳转到一个findUserServlet页面-->
                    <a class="btn btn-default btn-sm" href="${pageContext.request.contextPath}/findUserServlet?id=${user.id}">修改</a>
                    <a class="btn btn-default btn-sm" href="javascript:delUser(${user.id});">删除</a>
                </td>
            </tr>
        </c:forEach>
    </table>
    </form>
    <div>
        <nav>
            <ul class="pagination">
                <li>
                    <a href="#" aria-label="Previous">
                        <span aria-hidden="true">&laquo;</span>
                    </a>
                </li>
                <li><a href="#">1</a></li>
                <li><a href="#">2</a></li>
                <li><a href="#">3</a></li>
                <li><a href="#">4</a></li>
                <li><a href="#">5</a></li>
                <li>
                    <a href="#" aria-label="Next">
                        <span aria-hidden="true">&raquo;</span>
                    </a>
                </li>
                <span style="font-size:25px;margin-left: 4px;">
                    共16条记录,共4页
                </span>
            </ul>
        </nav>
    </div>
</div>
</body>
</html>

再来看delSelectServlet

package web.servlet;

import service.UserService;
import service.impl.UserServiceImpl;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/delUserServlet")
public class DelUserServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //删除不用设置字符集
        //获取参数id
        String id = request.getParameter("id");
        //我们调用service里面delete来进行删除
        UserService userService = new UserServiceImpl();
        userService.delete(Integer.parseInt(id));
        //然后我们需要跳转到首页去,这个是服务器内部内部跳转
        //这个不会产生新请求,服务器内部跳转
       // request.getRequestDispatcher("/userListServlet").forward(request,response);
        //我们还可以用sendRedirect来实现跳转,这个会产生一个新请求
        response.sendRedirect(request.getContextPath()+"/userListServlet");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

下面实现分页功能

这玩意实现起来相对有些复杂

说一下大致思考:

要进行分页,就要从两个层面来看,第一个层面服务器要给我们静态页面提供什么?第二个层面就是客户端要给服务器提供什么?

因为分页这个操作,可能肯定很多页面都会来进行调用,所以,我们这里,最好封装成一个分页对象PageBean,这个对象里面应该包含如下的一些信息

然后我们必须知道页面处理问题

 通过点击页码会给服务器传递一个currentPage与rows这两个值,然后依旧是提交到一个servlet,假如就叫这个servlet页面为FindUserByPageServlet,通过分页查找用户界面,那么这个界面又做什么操作

然后上面第二步,就会去调用service层的一个方法,比如叫findUserByPage,然后内部大致干嘛呢?

 

在dao层,就是具体的调用数据库的逻辑

 

下面就来一层一层写代码:

我们先来写一个PageBean的类:

package domain;

import java.util.List;

//分页对象
public class PageBean<T> {
    private int totalCount;
    private int totalPage;
    //因为可能很多页面用到这个对象,所以,不同页面不同数据对象类型
    List<T> list;//用来保存每页数据的集合
    int currentPage;
    int rows;//每一页展示多少数据

    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 List<T> getList() {
        return list;
    }

    public void setList(List<T> list) {
        this.list = list;
    }

    public int getCurrentPage() {
        return currentPage;
    }

    public void setCurrentPage(int currentPage) {
        this.currentPage = currentPage;
    }

    public int getRows() {
        return rows;
    }

    public void setRows(int rows) {
        this.rows = rows;
    }

    @Override
    public String toString() {
        return "PageBean{" +
                "totalCount=" + totalCount +
                ", totalPage=" + totalPage +
                ", list=" + list +
                ", currentPage=" + currentPage +
                ", rows=" + rows +
                '}';
    }
}

 下面来写客户端要请求的Servlet页面

FindUserByPageServlet

package web.servlet;

import domain.PageBean;
import domain.User;
import service.UserService;
import service.impl.UserServiceImpl;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/findUserByPageServlet")
public class FindUserByPageServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        //获取参数,客户机传递过来的参数
        //一个是当前页码,一个是每页显示的记录数目
        String currentPage = request.getParameter("currentPage");
        String rows = request.getParameter("rows");

        //做个安全判断,可能传入的参数为空,或者不存在
        //我们不能让它报错
        if(currentPage == null || "".equals(currentPage)) {
            currentPage = "1";//这个是字符串表示的值,所以得加字符串
        }

        if(rows == null || "".equals(rows)) {
            rows = "5";
        }


        //2.调用service查询
        UserService service = new UserServiceImpl();
        //调用方法并且传递两个参数
        //这个方法返回一个PageBean对象
        PageBean<User> pb = service.findUserByPage(currentPage,rows);
        System.out.println(pb);

        //将数据存放到request中,然后转发到list.jsp页面中
        request.setAttribute("pb",pb);
        request.getRequestDispatcher("/list.jsp").forward(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

然后去看service页面

@Override
    public PageBean<User> findUserByPage(String _currentPage, String _rows) {
        PageBean<User> pb = new PageBean<User>();
        //设置参数
        //传过来的是字符串参数
        //因此我们要转换一把
        int currentPage = Integer.parseInt(_currentPage);
        int rows = Integer.parseInt(_rows);

        //这个位置来做一个判断上下页角标
        if(currentPage <= 0) {
            currentPage = 1;
        }

        //调用dao层查询总记录数目
        int totalCount = userDao.findTotalCount();
        pb.setTotalCount(totalCount);

        //查询list集合
        //计算一下开始索引,每次都不一样
        int start = (currentPage - 1) * rows;
        List<User> list = userDao.findByPage(start,rows);
        pb.setList(list);

        //计算总页码
        int totalPage = totalCount % rows == 0 ? totalCount/rows : (totalCount/rows) + 1;
        pb.setTotalPage(totalPage);

        //这里来设置尾页
        if(currentPage >= totalPage) {
            currentPage = totalPage;
        }

        //设置参数
        pb.setCurrentPage(currentPage);
        pb.setRows(rows);
        return pb;
    }

然后去到dao层:

@Override
    public int findTotalCount() {
        String sql = "select count(*) from user";
        //如果这样来做,会直接返回基本类型
        return jdbcTemplate.queryForObject(sql,Integer.class);
    }

    @Override
    public List<User> findByPage(int start, int rows) {
        String sql = "select * from user limit ?,?";
        //会返回这个数据的List集合,集合里面是我们想要的类
        List<User> user = jdbcTemplate.query(sql,new BeanPropertyRowMapper<User>(User.class),start,rows);
        return  user;
    }

然后去看修改前端之后list.jsp与index.jsp页面

list.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<!-- 网页使用的语言 -->
<html lang="zh-CN">
<head>
    <!-- 指定字符集 -->
    <meta charset="utf-8">
    <!-- 使用Edge最新的浏览器的渲染方式 -->
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <!-- viewport视口:网页可以根据设置的宽度自动进行适配,在浏览器的内部虚拟一个容器,容器的宽度与设备的宽度相同。
    width: 默认宽度与设备的宽度相同
    initial-scale: 初始的缩放比,为1:1 -->
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! -->
    <title>用户信息管理系统</title>

    <!-- 1. 导入CSS的全局样式 -->
    <link href="css/bootstrap.min.css" rel="stylesheet">
    <!-- 2. jQuery导入,建议使用1.9以上的版本 -->
    <script src="js/jquery-2.1.0.min.js"></script>
    <!-- 3. 导入bootstrap的js文件 -->
    <script src="js/bootstrap.min.js"></script>
    <style type="text/css">
        td, th {
            text-align: center;
        }
    </style>
    <script>
        function delUser(id) {
            //给用户一个安全提示
            if(confirm("确定删除吗?")) {
                //改变访问地址
                //这里必须要注意把id给传过去
                location.href = "${pageContext.request.contextPath}/delUserServlet?id=" + id;
            }
        }

        //给删除选中绑定一个点击事件
        //这个删除选中是在页面完成之后才能获取
        //所以我们设置页面加载之后获取
        window.onload = function() {
            document.getElementById("delSelected").onclick = function () {
                if (confirm("是否要删选所有选中?")) {
                    //如果点击是就会进来
                    //进来之后,我们要判断一下有没有选中的条目
                    //那么这里怎么判断有没有选中条目,如果选中
                    //那么就会有一个checked属性存在

                    var flag = false;//有没有被选中的标识
                    //有多少个uid都会被获取到,获取所有
                    var checkBoxs = document.getElementsByName("uid");
                    for (var i = 0; i < checkBoxs.length; i++) {
                        //如果有选中的条目
                        if (checkBoxs[i].checked) {
                            flag = true;
                            break;
                        }
                    }

                    if (flag == true) {
                        //通过js提交表单
                        //form对象有一个submit可以帮助我们提交表单
                        document.getElementById("form").submit();
                    }

                }
            }

            //另外我们还要做的一个js功能就是
            //点击表头的复选框,然后实现数据框全选
            /**
             * 这个原理也简单,先获取到表头的复选框,然后让表头复选框的状态赋值给下面每一个复选框
             *
             */
            document.getElementById("firstCheckBox").onclick = function () {
                //获取所有需要提交的复选框
                var checkBoxs = document.getElementsByName("uid");
                //循环,让checked状态变为true
                for (var i = 0; i < checkBoxs.length; i++) {
                    checkBoxs[i].checked = true;//等于调用者的checked状态
                }
            }
        }
    </script>
</head>
<div class="container">
    <h3 style="text-align: center">用户信息列表</h3>
    <div style="float:left">
    <form class="form-inline">
        <div class="form-group">
            <label for="exampleInputName2">姓名</label>
            <input type="text" class="form-control" id="exampleInputName2" placeholder="">
        </div>
        <div class="form-group">
            <label for="exampleInputAddress2">籍贯</label>
            <input type="email" class="form-control" id="exampleInputAddress2" placeholder="">
        </div>
        <div class="form-group">
            <label for="exampleInputEmail2">邮箱</label>
            <input type="email" class="form-control" id="exampleInputEmail2" placeholder="">
        </div>
        <button type="submit" class="btn btn-default">查询</button>
    </form>
    </div>
    <div style="float: right;margin-bottom:5px;">
        <a class="btn btn-primary" href="add.jsp">添加联系人</a>
        <!--
        我们这给删除选中通过id设置一个点击事件
       这个事件就是当我们点击删除选中之后,就会把表单给我们提交到相应的页面上
        -->
        <a class="btn btn-primary" href="javascript:void(0);" id ="delSelected">删除选中</a>
    </div>
    <!--
        这个form表单的任务是帮助我们进行复选框的id提交
        既然要提交选中的复选框,那么我们就要先给复选框name与value
        才可进行提交
    -->
    <form id = "form" action = "${pageContext.request.contextPath}/delSelectServlet" method = "post">
        <table border="1" class="table table-bordered table-hover">
        <tr class="success">
            <th><input id = "firstCheckBox" type="checkbox"/></th>
            <th>编号</th>
            <th>姓名</th>
            <th>性别</th>
            <th>年龄</th>
            <th>籍贯</th>
            <th>QQ</th>
            <th>邮箱</th>
            <th>操作</th>
        </tr>
        <!--
        利用jstl标签把这里面的东西简化
        -->

         <!--分页操作
            这里获取就不能一下获取users
            得获取pb.list,每次根据数据多少来展示数据
         -->
        <c:forEach items="${pb.list}" varStatus="s" var="user">
            <tr>
                <!--
                    这个位置的value就是把真正的id值给提交了过去
                -->
                <td><input type="checkbox" name="uid" value = "${user.id}"/></td>
                <td>${s.count}</td>
                <td>${user.name}</td>
                <td>${user.gender}</td>
                <td>${user.age}</td>
                <td>${user.address}</td>
                <td>${user.qq}</td>
                <td>${user.email}</td>
                <td>
                    <!--先跳转到一个findUserServlet页面-->
                    <a class="btn btn-default btn-sm" href="${pageContext.request.contextPath}/findUserServlet?id=${user.id}">修改</a>
                    <a class="btn btn-default btn-sm" href="javascript:delUser(${user.id});">删除</a>
                </td>
            </tr>
        </c:forEach>
    </table>
    </form>
    <div>
        <nav>
            <ul class="pagination">
                <!--
                注意,我们对上一页,下一页也要进行处理
                处理思想就是
                上一页,如果当前页码是第一页,就上一页处于一个禁止的状态
                也是利用bootstarp来做
                但是虽然有了禁止点击这种状态,但是还是可以点击
                因此,我们在做的时候,如果当前页码处于第一页
                那么上一页就等于1
                -->
                <c:if test = "${pb.currentPage == 1}">
                    <li class="disabled">
                </c:if>
                <c:if test="${pb.currentPage != 1}">
                    <li>
                </c:if>
                    <a href="${pageContext.request.contextPath}/findUserByPageServlet?currentPage=${pb.currentPage - 1}&rows=5" aria-label="Previous">
                        <span aria-hidden="true">&laquo;</span>
                    </a>
                </li>
               <!--
                针对于这里的页码,我们也要重新进行修改
                应该用一种动态循环来实现页码的展示
               -->
                <c:forEach begin="1" end="${pb.totalPage}" var = "i">
                    <!--
                    i这个值就是从begin到end的一个循环值
                    注意要用el表达式获取
                    并且我们要动态的设置每一个页码,记得传递页码参数与每一页显示的数据个数
                    -->
                    <!--
                    分页
                    现在要做的就是设置每一个页码被点击之后的激活状态
                    这个利用bootstrap来做就行
                    -->
                    <c:if test = "${pb.currentPage == i}">
                        <li class="active"><a href="${pageContext.request.contextPath}/findUserByPageServlet?currentPage=${i}&rows=5">${i}</a></li>
                    </c:if>
                    <c:if test = "${pb.currentPage != i}">
                        <li><a href="${pageContext.request.contextPath}/findUserByPageServlet?currentPage=${i}&rows=5">${i}</a></li>
                    </c:if>
                </c:forEach>

                    <!--
                        与下一页同理操作
                    -->
                <c:if test = "${pb.currentPage == pb.totalPage}">
                    <li class="disabled">
                </c:if>
                <c:if test = "${pb.currentPage != pb.totalPage}">
                    <li>
                </c:if>
                    <a href="${pageContext.request.contextPath}/findUserByPageServlet?currentPage=${pb.currentPage + 1}&rows=5" aria-label="Next">
                        <span aria-hidden="true">&raquo;</span>
                    </a>
                </li>
                <span style="font-size:25px;margin-left: 4px;">
                    <!--
                    分页,把总的记录数,总的页数这两个属性传进来就行
                    -->
                    共${pb.totalCount}条记录,共${pb.totalPage}页
                </span>
            </ul>
        </nav>
    </div>
</div>
</body>
</html>

index.jsp

<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2022/3/21
  Time: 16:35
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="utf-8"/>
  <meta http-equiv="X-UA-Compatible" content="IE=edge"/>
  <meta name="viewport" content="width=device-width, initial-scale=1"/>
  <title>首页</title>

  <!-- 1. 导入CSS的全局样式 -->
  <link href="css/bootstrap.min.css" rel="stylesheet">
  <!-- 2. jQuery导入,建议使用1.9以上的版本 -->
  <script src="js/jquery-2.1.0.min.js"></script>
  <!-- 3. 导入bootstrap的js文件 -->
  <script src="js/bootstrap.min.js"></script>
  <script type="text/javascript">
  </script>
</head>
<body>
<!--
这个位置接收从LoginServlet页面传过来的对象
-->
<div>
  <c:if test="${user.username != null}">
      欢迎你,${user.username},查询用户信吧!
  </c:if>
</div>
<div align="center">

          <!--
          href="\${pageContext.request.contextPath}/userListServlet" style="text-decoration:none;font-size:33px">查询所有用户信息
          -->
          <!--
            做了分页之后,路径就要修改一下
            不是直接去展示全部页面,而是分页之后的页面
            这里我们必须考虑传参为空或者不存在的情况
            去findUserByPageServlet做个安全检查
          -->
          <a href="${pageContext.request.contextPath}/findUserByPageServlet"></a>
</div>
</body>
</html>

  • 21
    点赞
  • 115
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值