之前页面是这样的

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

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

比如这个部分

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

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

然后在最下面我们插入一个分页的动作,我们也可以直接从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个随机验证码,12EyString 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: AdministratorDate: 2022/3/21Time: 16:35To 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"><ahref="${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();@Overridepublic List<User> findAll() {//内部调用dao层的方法来进行查询return userDao.findAll();}@Overridepublic 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模板对象,内部只需要传入一个数据源就okprivate JdbcTemplate jdbcTemplate = new JdbcTemplate(JDBCUtils.getDs());@Overridepublic List<User> findAll() {//这个就是使用JDBCTemplate来做//直接可以调用jdbcTemplate里面的一些方法操作//这里是查询String sql = "select * from user";//查询这张表的信息//我们想的干的是啥?//把数据库中每一行数据抽离出来,变成一个对象装载集合返回List<User> list = jdbcTemplate.query(sql,new BeanPropertyRowMapper<User>(User.class));return list;}@Overridepublic User findByUsernameAndPassword(User loginUser) {//这里是具体的业务逻辑String sql = "select * from user where username = ? and password = ?";System.out.println(loginUser.getUsername() + " " + loginUser.getPassword());//这里要返回一个对象,我们还是用JdbcTemplate来实行查询//这个方法会给我们返回一个对象,这个方法如果没有找到实际//就会给我们抛出一个异常,并不会直接给我们返回一个null//所以必须把这个异常给捕获,然后返回一个nulltry {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层的具体实现方法

@Overridepublic 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 {//删除不用设置字符集//获取参数idString 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 {//设置字符键编码//获取数据查询idString id = request.getParameter("id");//调用serviceUserService 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

 @Overridepublic 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状态变为truefor (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 {//删除不用设置字符集//获取参数idString 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;}@Overridepublic 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页面

@Overridepublic 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层:

@Overridepublic int findTotalCount() {String sql = "select count(*) from user";//如果这样来做,会直接返回基本类型return jdbcTemplate.queryForObject(sql,Integer.class);}@Overridepublic 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状态变为truefor (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: AdministratorDate: 2022/3/21Time: 16:35To 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>

javaee之用户信息增删改查案例相关推荐

  1. 仿抖音短视频用户业务模块----完成用户信息增删改查并通过接口文档联调(模拟工作环境)

    仿抖音项目持续更新中: 仿抖音短视频APP专栏 练习: 目录 1.根据nickname或者mobile来查询用户信息 2.根据用户id删除用户信息 3.根据用户id修改用户信息 1.根据nicknam ...

  2. 品牌增删改查案例,登录以及注册

    环境导入E:\课程\javaweb资料\day10-JSP\资料\2. 品牌增删改查案例素材(师生共用) 查询所有(使用JSP脚本展示品牌数据) 1,在数据访问层的mapper接口中定义查询所有的sq ...

  3. Python中用户管理(用户的登陆、用户的增删改查)

    一.用户登陆 题目要求: 1.系统里面有多个用户,用户的信息目前保存在列表里面 users = ['root','westos'] passwd = ['123','456'] 2.用户登陆(判断用户 ...

  4. JDBC+MySQL入门增删改查案例

    目录 前言 案例分析 核心思路拆解 案例涉及知识点 第一关 创建数据库和项目 创建数据库 创建项目 第二关 JDBC插入和查询 预备工作 单个插入 批量插入 查询数据 JDBC修改和删除 修改数据 删 ...

  5. VS2019 C# MySQL 学生信息增删改查(二、改查(续前节))

    VS2019 C# MySQL 学生信息增删改查 六.改 1.在FormXiuGai界面中拖入控件,更改相应的属性,如下图所示. 思路:先查找,再将查找到的数据显示在TextBox上,再进行修改.我这 ...

  6. 5分钟做一个php的增删改查案例

    增删改查案例 PHP基础入门完成了,自己做了一个签到系统,用于可活动考勤,班级考勤等,主要是在校园中自己有时候需要使用,最近刚好学了PHP+MySQL的知识,于是自己构建了一个简单的考勤签到系统.这个 ...

  7. 基于 spring boot 实现用户的增删改查

    基于登录实现后 在此我们更深一步地实现用户的增删改查(用户登录的实现在我的另一篇文章中) 其实从整体上来说,用户的增删改查和用户登录大同小异 主要是处理好各个层之间的关系 这里源码奉上 实体类 bea ...

  8. Java中的sqlsession_java相关:MyBatis中SqlSession实现增删改查案例

    java相关:MyBatis中SqlSession实现增删改查案例 发布于 2020-6-13| 复制链接 摘记: 前言     开博客这是第一次写系列文章,从内心上讲是有点担心自己写不好,写不全,毕 ...

  9. java springboot+mybaits 实现数据库增删改查案例

    springboot是java中最实用,当前也是最流行的框架,mybaits对应dao层.想要做项目springboot和mybaits是必须的.今天就教大家怎么简单搭建一个用springboot的增 ...

  10. android 增删改查 源码_学生信息增删改查小程序案例(springboot服务端)

    项目描述: 该小程序实现了简单的管理员登录,学生信息添加,修改,删除,列表显示等功能,服务器端采用springboot框架提供接口,数据传输格式为json,适合新手学习小程序与服务端的交互,以及增删改 ...

最新文章

  1. AI领域3种典型的深度学习算法
  2. android 属性动画 弧形,CSS分层动画可以让元素沿弧形路径运动
  3. html 字符串最后加空格,html space空格符
  4. 【转】.net框架读书笔记---CLR内存管理\垃圾收集(四)
  5. docker-compose下载慢_编写Docker Compose时要注意的五大常见错误
  6. 二、PHP框架Laravel学习笔记——路由的定义和控制器
  7. 前端 datatable 居中_Midway Serverless 如何让阿里前端提效 50%?
  8. python定义一个1xn矩阵_Python实现的矩阵类实例
  9. python怎么画简单图-Python | 用matplotlib画些简单的图
  10. 原型和原型链的理解(通俗易懂)
  11. Apizza 在线Api接口测试工具
  12. C语言为内存分配空间(代码段、数据段、bss段、存储类、变量的生命周期)
  13. 正态分布的应用——基于偏度系数解释发展水平
  14. 如果忘记Mac密码该怎么办
  15. 求1至10乘阶的总和及求任意数乘阶
  16. Word2010去除页眉上的横线
  17. TED-4-美好人生的定义
  18. 鸽哒im即时通讯源码加教程
  19. win10系统 如何设置定时开关机?
  20. 唯品会狂飙突进的去向

热门文章

  1. viper12a电源电路图_VIPER22A VIPER12A工作原理引脚功能应用电路图纸与分析
  2. php的md5(),PHP中MD5函数效率
  3. 雷达多普勒频率计算公式_雷达导论PART-III.5 脉冲雷达的工作机理
  4. 软件安全测试都有哪些内容,如何选择软件安全测评机构
  5. centos本地yum源配置
  6. Java的keytool命令
  7. 使用PGP加密软件实现电子邮件的安全传输
  8. 启动Apache时提示缺少vcruntime140.dll怎么解
  9. 《程序员修炼之道--从小工到专家》读书笔记
  10. bs4.BeautifulSoup获取outerHTML和innerHTML