JavaWeb综合案例(登录,注册)

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">&nbsp;&nbsp;&nbsp;
            <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>
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值