1、功能介绍
案例功能:
用户登录(账号密码登录)
用户注册(新用户注册账号)
查询所有(查询所有品牌数据)
新增品牌(增加新的品牌数据)
修改品牌(修改品牌数据)
删除品牌(删除品牌数据)
批量删除(删除多条品牌数据)
分页查询(分页展示品牌数据)
条件查询(通过条件精确查询品牌数据)
2、工程准备
2.1 环境
pom.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>studentRoom-demo</artifactId>
<version>Unknown</version>
<packaging>war</packaging>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties>
<dependencies>
<!--Servlet-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<!--jsp-->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
<scope>provided</scope>
</dependency>
<!--jstl-->
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
<!--MyBatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.5</version>
</dependency>
<!--MySQL-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.31</version>
</dependency>
<!--fastjson-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.62</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
</plugin>
</plugins>
</build>
</project>
2.2 工程结构
![在这里插入图片描述](https://img-
3.数据库
3.1tb_student
use db1;
drop table if exists tb_student;
create table tb_student(
-- 主键
id int primary key auto_increment,
-- 寝室楼
roomName varchar(20),
-- 寝室号
roomId int,
-- 班级
className varchar(20),
-- 学号
studentId varchar(20),
-- 姓名
studentName varchar(20),
-- 描述信息
description varchar(100),
-- 查寝状态 :0:不在寝室 1:在寝室
status int
);
-- 添加数据
insert into tb_student(roomName,roomId,className,studentId,studentName,status)
values ('1号楼',101,'奇迹1班','22100001','张三',1),
('2号楼',101,'神奇3班','22101003','李四',1),
('1号楼',101,'奇迹1班','22100005','小王',1),
('1号楼',102,'奇迹1班','22100009','小李',1),
('1号楼',102,'奇迹2班','22100004','小丽',1),
('3号楼',102,'奋进1班','22100011','小美',1);
select * from tb_student;
# 分业查询的条数
# 参数1:开始索引=(当前页码-1)*每页显示条数
# 参数2:查询的条数目数=煤业显示条数
use db1;
# 第一页
select *
from tb_student limit 0,5;
# 第二页
select *
from tb_student limit 5,5;
# 第三页
select *
from tb_student limit 10,5;
3.2 tb_user
use db1;
create table tb_user(
username character(20),
id character(20),
password character(20)
);
insert into tb_user(username,id,password)
values ('王伟','22110001','12345');
select * from tb_user;
3.3 连接数据库配置文件,在resources目录下创建 mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<typeAliases>
<package name="com.itli.pojo"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:///db1?useSSL=false"/>
<property name="username" value="root"/>
<property name="password" value="******"/>
</dataSource>
</environment>
</environments>
<mappers>
<!--扫描mapper-->
<package name="com.itli.mapper"/>
</mappers>
</configuration>
4.用户登录功能
整体流程:
(1) 前端login.jsp页面加载完成后,通过表单发送请求和数据给Web层的LoginServlet
(2) 在LoginServlet中接收请求和数据(用户名和密码)
(3) LoginServlet接收到请求和数据后,调用Service层完成根据用户名和密码查询用户对象
(4) 在Service层需要编写UserService类,在类中实现login方法,方法中调用Dao层的UserMapper
(5) 在UserMapper接口中,声明一个根据用户名和密码查询用户信息的方法
(6) Dao层把数据查询出来以后,将返回数据封装到User对象,将对象交给Service层
(7) Service层将数据返回给Web层
(8) Web层获取到User对象后,判断User对象,如果为Null,则将错误信息响应给登录页面,如果不为Null,则跳转到列表页面,并把当前登录用户的信息存入Session携带到列表页面
4.1 后端实现
dao方法实现:
在java目录下的 com.itli.mapper.UserMapper 接口中定义抽象方法,
在UserMapper.xml书写对应的sql语句
/**
* 根据用户名和密码查询用户对象
* @param username
* @param password
* @return
*/
User select(@Param("username") String username,@Param("id") String id,@Param("password") String password);
<select id="select" resultType="com.itli.pojo.User">
select * from db1.tb_user where username=#{username} and id=#{id} and password=#{password};
</select>
service方法实现:
在java目录下的 com.i.service 下再创建 impl 包;impl 表示是放 service 层接口的实现类的包。 在该包下创建名为 UserServiceImpl 类
public class UserServiceImpl implements UserService {
SqlSessionFactory factory = SqlSessionFactoryUtils.getSqlSessionFactory();
/**
* 登录方法
* @param username
* @param id
* @param password
* @return
*/
public User login(String username,String id, String password){
//2. 获取SqlSession
SqlSession sqlSession = factory.openSession();
//3. 获取UserMapper
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
//4. 调用方法
User user = mapper.select(username,id,password);
//释放资源
sqlSession.close();
return user;
}
在java目录下的 com.itli.service 包下创建 UserService 接口,在该接口中定义登录的抽象方法
public interface UserService {
/**
* 登录方法
* @param username
* @param id
* @param password
* @return
*/
User login(String username, String id,String password);
servlet方法实现:
在java目录下的 com.itli.web.servlet 包下定义名为 LoginServlet 的登录的 servlet
@WebServlet("/loginServlet")
public class LoginServlet extends HttpServlet {
private UserService service = new UserServiceImpl();
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1. 获取用户名,用户名id和密码
request.setCharacterEncoding("utf-8");
String username = request.getParameter("username");
String password = request.getParameter("password");
String id=request.getParameter("id");
System.out.println(username+":"+password+":"+id);
//获取复选框数据
String remember = request.getParameter("remember");
//2. 调用service查询
User user = service.login(username, id,password);
//3. 判断
if(user != null){
//登录成功,跳转到查询所有的BrandServlet
// System.out.println(user);
//判断用户是否勾选记住我
if("1".equals(remember)){
//勾选了,发送Cookie
//1. 创建Cookie对象
Cookie c_username = new Cookie("username",username);
Cookie c_id=new Cookie("id",id);
Cookie c_password = new Cookie("password",password);
// 设置Cookie的存活时间
c_username.setMaxAge( 60 * 60 * 24 * 7);
c_password.setMaxAge( 60 * 60 * 24 * 7);
c_id.setMaxAge( 60 * 60 * 24 * 7);
//2. 发送
response.addCookie(c_username);
response.addCookie(c_password);
response.addCookie(c_id);
}
//将登陆成功后的user对象,存储到session
HttpSession session = request.getSession();
session.setAttribute("user",user);
String contextPath = request.getContextPath();
response.sendRedirect(contextPath+"/student.html");
}else {
// 登录失败,
// 存储错误信息到request
request.setAttribute("login_msg","用户名或密码错误");
// 跳转到login.jsp
request.getRequestDispatcher("/login.jsp").forward(request,response);
}
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
在java目录下的 com.itli.web.filter 包下定义名为 LoginFilter 的过滤器
/**
* 登录验证的过滤器
*/
@WebFilter("/*")
public class LoginFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
HttpServletRequest req = (HttpServletRequest) request;
//判断访问资源路径是否和登录注册相关
String[] urls = {"/login.jsp","/imgs/","/css/","/loginServlet","/register.jsp","/registerServlet","/checkCodeServlet"};
// 获取当前访问的资源路径
String url = req.getRequestURL().toString();
//循环判断
for (String u : urls) {
if(url.contains(u)){
//找到了
//放行
chain.doFilter(request, response);
//break;
return;
}
}
//1. 判断session中是否有user
HttpSession session = req.getSession();
Object user = session.getAttribute("user");
//2. 判断user是否为null
if(user != null){
// 登录过了
//放行
chain.doFilter(request, response);
}else {
// 没有登陆,存储提示信息,跳转到登录页面
req.setAttribute("login_msg","您尚未登陆!");
req.getRequestDispatcher("/login.jsp").forward(req,response);
}
}
public void init(FilterConfig config) throws ServletException {
}
public void destroy() {
}
}
4.2前端实现
login.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>login</title>
<link href="css/login.css" rel="stylesheet">
</head>
<body>
<div id="loginDiv" style="height: 350px">
<form action="/studentRoom-demo/loginServlet" method="post" id="form">
<h1 id="loginMsg">LOGIN IN</h1>
<i class="into"></i>
<div id="errorMsg"></div>
<p>Username:<input id="username" name="username" value="" type="text"></p>
<p>Id:<input id="id" name="id" value="" type="text"></p>
<p>Password:<input id="password" name="password" value="" type="password"></p>
<p>Remember:<input id="remember" name="remember" value="1" type="checkbox"></p>
<div id="subDiv">
<input type="submit" class="button" value="login up">
<input type="reset" class="button" value="reset">
<a href="register.jsp">没有账号?</a>
</div>
</form>
</div>
<style>
#id{
width: 200px;
margin-left: 15px;
border-radius: 5px;
border-style: hidden;
height: 30px;
background-color: rgba(216, 191, 216, 0.5);
outline: none;
color: #f0edf3;
padding-left: 10px;
}
</style>
</body>
</html>
5、用户注册功能
整体流程:
(1) 前端通过表单发送请求和数据给Web层的RegisterServlet
(2) 在RegisterServlet中接收请求和数据(用户名和密码)
(3) RegisterServlet接收到请求和数据后,调用Service层完成用户信息的保存
(4) 在Service层需要编写UserService类,在类中实现register方法,需要判断用户是否已经存在,如果不存在,则完成用户数据的保存
(5) 在UserMapper接口中,声明两个方法,一个是根据用户名查询用户信息方法,另一个是保存用户信息方法
(6) 在UserService类中保存成功则返回true,失败则返回false,将数据返回给Web层
(7) Web层获取到结果后,如果返回的是true,则提示注册成功,并转发到登录页面,如果返回false则提示用户名已存在并转发到注册页面
5.1 后端实现
dao方法实现:
在java目录下的 com.itli.mapper.UserMapper 接口中定义抽象方法
并在UserMapper.xml写sql语句
/**
* 根据用户id查询用户对象
* @param id
* @return
*/
User selectById(String id);
/**
* 添加用户
* @param user
*/
void add(User user);
<select id="selectById" resultType="com.itli.pojo.User">
select * from db1.tb_user where id=#{id}
</select>
<insert id="add">
insert into db1.tb_user values (#{username},#{id},#{password})
</insert>
service方法实现:
在java目录下的 com.itli.service 下再创建 impl 包;impl 表示是放 service 层接口的实现类的包。 在该包下创建名为 UserServiceImpl 类
/**
* 注册方法
* @return
*/
public boolean register(User user){
//2. 获取SqlSession
SqlSession sqlSession = factory.openSession();
//3. 获取UserMapper
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
//4. 判断用户id是否存在
User u = mapper.selectById(user.getId());
if(u == null){
// 用户id不存在,注册
mapper.add(user);
sqlSession.commit();
}
sqlSession.close();
return u == null;
}
在java目录下的 com.itli.service 包下创建 UserService 接口,在该接口中定义注册的抽象方法
/**
* 注册方法
* @return
*/
boolean register(User user);
servlet方法实现:
在java目录下的 com.itli.web.servlet 包下定义名为 RegisterServlet 的登录的 servlet
@WebServlet("/registerServlet")
public class RegisterServlet extends HttpServlet {
private UserService service = new UserServiceImpl();
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1. 获取用户名和密码数据
request.setCharacterEncoding("utf-8");
String username = request.getParameter("username");
String id =request.getParameter("id");
String password = request.getParameter("password");
System.out.println(username+":"+password+":"+id);
User user = new User();
user.setUsername(username);
user.setId(id);
user.setPassword(password);
// 获取用户输入的验证码
String checkCode = request.getParameter("checkCode");
// 程序生成的验证码,从Session获取
HttpSession session = request.getSession();
String checkCodeGen = (String) session.getAttribute("checkCodeGen");
// 比对
if(!checkCodeGen.equalsIgnoreCase(checkCode)){
request.setAttribute("register_msg","验证码错误");
request.getRequestDispatcher("/register.jsp").forward(request,response);
// 不允许注册
return;
}
//2. 调用service 注册
boolean flag = service.register(user);
//3. 判断注册成功与否
if(flag){
//注册功能,跳转登陆页面
request.setAttribute("register_msg","注册成功,请登录");
request.getRequestDispatcher("/login.jsp").forward(request,response);
}else {
//注册失败,跳转到注册页面
request.setAttribute("register_msg","用户id已存在");
request.getRequestDispatcher("/register.jsp").forward(request,response);
}
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
在java目录下的 com.itli.web.servlet 包下定义名为 CheckCodeServlet 的验证码生成的 servlet
@WebServlet("/checkCodeServlet")
public class CheckCodeServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 生成验证码
ServletOutputStream os = response.getOutputStream();
String checkCode = CheckCodeUtil.outputVerifyImage(100, 50, os, 4);
// 存入Session
HttpSession session = request.getSession();
session.setAttribute("checkCodeGen",checkCode);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
5.2前端实现
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>欢迎注册</title>
<link href="css/register.css" rel="stylesheet">
</head>
<body>
<div class="form-div">
<div class="reg-content">
<h1>欢迎注册</h1>
<span>已有帐号?</span> <a href="login.jsp">登录</a>
</div>
<form id="reg-form" action="/studentRoom-demo/registerServlet" method="post">
<table>
<tr>
<td>用户名</td>
<td class="inputs">
<input name="username" type="text" id="username">
<br>
<%-- <span id="username_err" class="err_msg" >${register_msg}</span>--%>
<span id="username_err" class="err_msg" ></span>
</td>
</tr>
<tr>
<td>用户id</td>
<td class="inputs">
<input name="id" type="text" id="id">
<br>
<%-- <span id="id_err" class="err_msg" >${register_msg}</span>--%>
<span id="id_err" class="err_msg" style="display: none" >用户id已存在</span>
</td>
</tr>
<tr>
<td>密码</td>
<td class="inputs">
<input name="password" type="password" id="password">
<br>
<span id="password_err" class="err_msg" style="display: none">密码格式有误</span>
</td>
</tr>
<tr>
<td>验证码</td>
<td class="inputs">
<input name="checkCode" type="text" id="checkCode">
<img id="checkCodeImg" src="/studentRoom-demo/checkCodeServlet">
<a href="#" id="changeImg" >看不清?</a>
</td>
</tr>
</table>
<div class="buttons">
<input value="注 册" type="submit" id="reg_btn">
</div>
<br class="clear">
</form>
</div>
<script>
document.getElementById("changeImg").onclick = function () {
document.getElementById("checkCodeImg").src = "/studentRoom-demo/checkCodeServlet?"+new Date().getMilliseconds();
}
</script>
</body>
</html>