目录

  • 环境搭建
    • 数据库
  • 用户登录
    • 需求分析
    • 代码实现
      • 编写UserMapper类
      • 编写User类
      • 编写loginServlet类
      • 编写login.html
      • 编写login.css
  • 用户注册
    • 需求分析
    • 代码编写
      • 编写UserMapper类
      • 编写registerServlet类
      • 编写register.html
      • 编写register.css
  • 编写SqlSessionFactory工具类
  • 项目总体架构
  • 运行展示
  • 案例图片

环境搭建

在编写代码之前,在pom.xml导入servlet、mybatis的依赖,导入tomcat插件。

数据库

用户登录

需求分析

  1. 在前端页面输入用户名和密码,点击登录,将数据提交给servlet。
  2. 在servlet中编写程序,实现接收前端提交的用户名和密码。
  3. 在servlet中通过Mybatis框架调用Mapper查询,返回结果封装成一个User对象并返回
  4. 判断User对象是否为null,是null登录失败、不是null登录成功。

代码实现

编写UserMapper类

编写UserMapper提供根据用户名、密码查询用户数据方法方法

public interface UserMapper {/***根据用户名 密码 查询用户* @param username* @param password* @return*/@Select("select* from tb_user where username =#{username} and password = #{password}")User select(@Param("username") String username, @Param("password") String password);}

编写User类

编写User类

public class User {private Integer id;private String username;private String password;public void setId(Integer id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}@Overridepublic String toString() {return "User{" +"id=" + id +", username='" + username + '\'' +", password='" + password + '\'' +'}';}}

编写loginServlet类

编写loginServlet类

@WebServlet("/loginServlet")
public class loginServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//第一步:接收用户名、密码String username;username= req.getParameter("username");String password;password= req.getParameter("password");byte[] bytes = username.getBytes(StandardCharsets.ISO_8859_1);username = new String(bytes, StandardCharsets.UTF_8);byte[] bytes1 = password.getBytes(StandardCharsets.ISO_8859_1);password = new String(bytes1, StandardCharsets.UTF_8);//第二步:调用Mybatis查询用户//工具类SqlSessionFactoryUtil调用方法返回sqlSessionFactorySqlSessionFactory sqlSessionFactory = SqlSessionFactoryUtil.getSqlSessionFactory();//  获取sqlSession对象,执行sqlSqlSession sqlSession = sqlSessionFactory.openSession();//获取UserMapper接口的代理对象UserMapper mapper = sqlSession.getMapper(UserMapper.class);//获取方法User user = mapper.select(username, password);sqlSession.close();//获取字符的输出流 设置content-typeresp.setContentType("text/html;charset=utf-8");PrintWriter writer = resp.getWriter();//第三步:判断if(user!=null){//登陆成功writer.write("登录成功");}else {//登录失败writer.write("登录失败");}}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doGet(req, resp);}
}

编写login.html

编写login.html

<!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"><form action="/Web-Demo/loginServlet" method="post" id="form"><h1 id="loginMsg">LOGIN IN</h1><p>UserName:<input id="username" name="username" type="text"></p><p>PassWord:<input id="password" name="password" type="password"></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.html">没有账号?点击注册</a></div></form>
</div>
</body>
</html>

编写login.css

编写login.css

* {margin: 0;padding: 0;
}html {height: 100%;width: 100%;overflow: hidden;margin: 0;padding: 0;background: url(../imgs/BackGround.JPG) no-repeat 0px 0px;background-repeat: no-repeat;background-size: 100% 100%;-moz-background-size: 100% 100%;
}body {display: flex;align-items: center;justify-content: center;height: 100%;
}#loginDiv {width: 37%;display: flex;justify-content: center;align-items: center;height: 300px;background-color: rgba(75, 81, 95, 0.3);box-shadow: 7px 7px 17px rgba(52, 56, 66, 0.5);border-radius: 5px;
}#name_trip {margin-left: 50px;color: red;
}p {margin-top: 30px;margin-left: 20px;color: azure;
}input {margin-left: 15px;border-radius: 5px;border-style: hidden;height: 30px;width: 140px;background-color: rgba(216, 191, 216, 0.5);outline: none;color: #f0edf3;padding-left: 10px;
}
#username{width: 200px;
}
#password{width: 202px;
}
.button {border-color: cornsilk;background-color: rgba(100, 149, 237, .7);color: aliceblue;border-style: hidden;border-radius: 5px;width: 100px;height: 31px;font-size: 16px;
}#subDiv {text-align: center;margin-top: 30px;
}
#loginMsg{text-align: center;color: aliceblue;
}

用户注册

需求分析

  1. 在前端页面输入用户名和密码,点击注册,将数据提交给servlet。
  2. 在servlet中编写程序,实现接收前端提交的用户名和密码。
  3. 在servlet中通过Mybatis框架调用Mapper查询,返回结果封装成一个User对象并返回
  4. 判断User对象是否为null,是null调用mapper添加用户、不是null代表用户已存在。

代码编写

编写UserMapper类

编写UserMapper提供根据用户名查询用户数据方法和添加用户方法

public interface UserMapper {/*** 根据用户名查询用户对象* @param username* @return*/@Select("select* from tb_user where username =#{username}")User selectByUsername(String username);/*** 添加用户*/@Select("insert into tb_user values(null,#{username},#{password})")void add(User user);
}

编写registerServlet类

@WebServlet("/registerServlet")
public class registerServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//第一步:接收用户名、密码String username;String password;username= req.getParameter("username");password= req.getParameter("password");byte[] bytes = username.getBytes(StandardCharsets.ISO_8859_1);username = new String(bytes, StandardCharsets.UTF_8);byte[] bytes1 = password.getBytes(StandardCharsets.ISO_8859_1);password = new String(bytes1, StandardCharsets.UTF_8);//封装用户对象User user1 = new User();user1.setUsername(username);user1.setPassword(password);//第二步:调用Mybatis查询用户//加载Mybatis的核心配置文件SqlSessionFactory sqlSessionFactory = SqlSessionFactoryUtil.getSqlSessionFactory();//  获取sqlSession对象,执行sqlSqlSession sqlSession = sqlSessionFactory.openSession();//获取UserMapper接口的代理对象UserMapper mapper = sqlSession.getMapper(UserMapper.class);//获取方法User user = mapper.selectByUsername(username);//获取字符的输出流 设置content-typeresp.setContentType("text/html;charset=utf-8");PrintWriter writer = resp.getWriter();//第三步:判断if(user==null){//用户名不存在,添加用户mapper.add(user1);//提交事务sqlSession.commit();sqlSession.close();}else {//用户存在,给出提示信息writer.write("用户已存在");}}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doGet(req, resp);}
}

编写register.html

采用正则表达式实现用户名不超过15个字符、密码在4~10个字符。采用上个案例的注册界面。

<!DOCTYPE html>
<html>
<head><meta charset="utf-8"><title>欢迎注册</title><link rel = "stylesheet" href="css/register.css">
</head>
<body>
<div class = "form-div"><div class="reg-content"><h1>欢迎注册</h1><span>已有账号?</span><a href="login.html">登录</a></div><form id = "reg-form" action="/Web-Demo/registerServlet" method="post"><table><tr><td>用户名:</td><td class="inputs"><input type="text" name = "username" id="username"/><br><span id = "username_err" class="err_msg" style="display:none">用户名不符合规则</span></td></tr><tr><td>密码:</td><td class="inputs"><input type="password" name = "password" id = "password"/><br><span id="password_err" class="err_msg" style="display: none">密码格式有误</span></td></tr></table><div class="buttons"><input type = "submit" value="注册" id ="reg_btn" /></div><br class="clear"></form>
</div>
<script>//验证用户名var usernameInput = document.getElementById("username");usernameInput.onblur = checkUser;function checkUser(){var username = usernameInput.value.trim();//判断用户名是否符合规则:长度0~15 单词字符组成var reg = /^\w{0,15}$/;var flag= reg.test(username);if(flag){document.getElementById("username_err").style.display = "none";}else{document.getElementById("username_err").style.display = "";}return flag;}//验证密码var passwordInput = document.getElementById("password");passwordInput.onblur = checkPassword;function checkPassword(){var password = passwordInput.value.trim();var reg = /^\w{4,10}$/;var flag= reg.test(password);if(flag){document.getElementById("password_err").style.display = "none";}else{document.getElementById("password_err").style.display = "";}return flag;}
</script>
</body>
</html>

编写register.css

* {margin: 0;padding: 0;list-style-type: none;
}
.reg-content{padding: 30px;margin: 3px;
}
a, img {border: 0;
}body {background-image: url("../imgs/BackGround.JPG") ;no-repeat:center center fixed;/*兼容浏览器版本*/-webkit-background-size: cover;-o-background-size: cover;background-size: cover;display: flex;align-items: center;justify-content: center;height: 100%;
}table {border-collapse: collapse;border-spacing: 0;
}td, th {padding: 0;height: 90px;}
.inputs{vertical-align: top;
}.clear {clear: both;
}.clear:before, .clear:after {content: "";display: table;
}.clear:after {clear: both;
}.form-div {background-color: rgba(255, 255, 255, 0.27);border-radius: 10px;border: 1px solid #aaa;width: 424px;margin-top: 150px;margin-left:1050px;padding: 30px 0 20px 0px;font-size: 16px;box-shadow: inset 0px 0px 10px rgba(255, 255, 255, 0.5), 0px 0px 15px rgba(75, 75, 75, 0.3);text-align: left;
}.form-div input[type="text"], .form-div input[type="password"], .form-div input[type="email"] {width: 268px;margin: 10px;line-height: 20px;font-size: 16px;
}.form-div input[type="checkbox"] {margin: 20px 0 20px 10px;
}.form-div input[type="button"], .form-div input[type="submit"] {margin: 10px 20px 0 0;
}.form-div table {margin: 0 auto;text-align: right;color: rgba(64, 64, 64, 1.00);
}.form-div table img {vertical-align: middle;margin: 0 0 5px 0;
}.footer {color: rgba(64, 64, 64, 1.00);font-size: 12px;margin-top: 30px;
}.form-div .buttons {float: right;
}input[type="text"], input[type="password"], input[type="email"] {border-radius: 8px;box-shadow: inset 0 2px 5px #eee;padding: 10px;border: 1px solid #D4D4D4;color: #333333;margin-top: 5px;
}input[type="text"]:focus, input[type="password"]:focus, input[type="email"]:focus {border: 1px solid #50afeb;outline: none;
}input[type="button"], input[type="submit"] {padding: 7px 15px;background-color: #3c6db0;text-align: center;border-radius: 5px;overflow: hidden;min-width: 80px;border: none;color: #FFF;box-shadow: 1px 1px 1px rgba(75, 75, 75, 0.3);
}input[type="button"]:hover, input[type="submit"]:hover {background-color: #5a88c8;
}input[type="button"]:active, input[type="submit"]:active {background-color: #5a88c8;
}
.err_msg{color: red;padding-right: 170px;
}
#password_err,#tel_err{padding-right: 195px;
}#reg_btn{margin-right:50px; width: 285px; height: 45px; margin-top:20px;
}

编写SqlSessionFactory工具类

在写Servlet的时候,因为需要使用Mybatis来完成数据库的操作,所
以对于Mybatis的基础操作就出现了些重复代码:

String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

有了这些重复代码就会造成一些问题:

  1. 重复代码不利于后期的维护

  2. SqlSessionFactory工厂类进行重复创建,资源消耗非常大但性能却非常低。

  3. 代码重复可以抽取工具类

  4. 对指定代码只需要执行一次可以使用静态代码块

对于静态代码块会随着类的加载而自动执行同时加载,只执行一次,就很好解决这一问题。

public class SqlSessionFactoryUtil {//SqlSessionFactory工具类抽取private static SqlSessionFactory sqlSessionFactory;static {//静态代码块会随着类的加载而加载 只执行一次//加载Mybatis的核心配置文件String resource = "mybatis-config.xml";InputStream resourceAsStream = null;try {resourceAsStream = Resources.getResourceAsStream(resource);} catch (IOException e) {e.printStackTrace();}//  获取sqlSessionFactory对象sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);}public static SqlSessionFactory getSqlSessionFactory (){return sqlSessionFactory;}
}

工具类抽取以后,以后在对Mybatis的SqlSession进行操作的时候,就可以直接使用。

项目总体架构

运行展示

用户登录:

登录成功:

来一个登录失败的案例:admin用户不存在

登录失败:

注册admin用户:

注册成功,后端数据库已写入admin用户数据

案例图片

漂亮~~

Java-web实现用户登录、注册功能相关推荐

  1. java wed登录面 代码_JavaWeb实现用户登录注册功能实例代码(基于Servlet+JSP+JavaBean模式)...

    下面通过通过图文并茂的方式给大家介绍JavaWeb实现用户登录注册功能实例代码,一起看看吧. 一.Servlet+JSP+JavaBean开发模式(MVC)介绍 Servlet+JSP+JavaBea ...

  2. java实现用户登录注册功能(用集合框架来实现)

    需求:实现用户登录注册功能(用集合框架来实现) 分析: A:需求的类和接口 1.用户类 UserBean 2.用户操作方法接口和实现类 UserDao UserDaoImpl 3.测试类 UserTe ...

  3. MVC框架实现用户登录注册功能(连接数据库)

    目录 一.简单理解MVC框架 二.项目结构 三.项目源码 3.1 User 3.2 UserDao 3.3 RegisterDao 3.4 servletControll 3.5 servletCon ...

  4. 【Java案例】用户登录注册

    案例介绍: 编写程序实现简单的用户登录注册功能.程序包含以下4个功能: (1)登录功能,用户输入正确的账号密码登录成功: (2)注册功能,输入用户名和密码进行注册: (3)查看功能,查看所有的用户名与 ...

  5. php注册登录描述,基于PHP实现用户登录注册功能的详细教程

    教程前先给大家看看小编的实现成果吧! 图1: 图2: 图3: 教程: 实现这个功能我们需要五个php文件: login.php (登录界面,如图2) 登录 登录页面 用户名: required=&qu ...

  6. vue+node---使用element框架实现的前后台用户登录注册功能

    为了更进一步清晰地了解前台数据向后台提交的过程,更好地加强巩固前端开发学习,整理了基础的[前后台用户登录注册功能]实现代码.后台通过node.js开发,数据存储在sqlite中,前台vue+eleme ...

  7. 注册登录案例用MVC和mysql_用MVC模式实现简单用户登录注册功能

    Model2模式 Jsp+Servlet+JavaBean MVC:开发模式 M:Model 模型层 ----> JavaBean V:View 视图层 ----> Jsp C:Contr ...

  8. Java实现简单的登录注册功能

    登录注册在项目开发中是常用的功能需求,以下使用控制台实现一个简单的登录注册功能. 实体类: package com.csdn.entry;public class User {//实体类,对应一个表p ...

  9. Java Web实现用户登录功能

    java web 学习记录一下 mvc结构实现mysql 连接 什么是mvc MVC是模型(model).视图(view).控制(controller)这三个单词上的首字母组成.它是一种应用模型,它的 ...

  10. Android+Java Web+MySQL实现登录注册

    1 前言&概述 这篇文章是基于此处文章的更新,更新了一些技术栈,更加贴近实际需要,以及修复了若干的错误. 这是一个前端Android+后端Java/Kotlin通过Servelt进行后台数据库 ...

最新文章

  1. 报班学python到底怎么样-你们都是怎么学 Python 的?
  2. [POJ]Zipper[动态规划]
  3. 一、ESP32环境搭建(基于vscode插件platformIO)
  4. change事件判断ajax,jquery中change事件里面if语句失效
  5. java自定义对话框_Flutter AlertDialog自定义对话框实现示例(确认或取消)
  6. python中定义字符串_Python中的字符串String
  7. Java中导入、导出Excel——HSSFWorkbook 使用
  8. ARM汇编加载/存储指令
  9. Go 语言 Gin 框架实战项目笔记
  10. 洛谷P2473奖励关——状压DP
  11. java byte与char互转原理
  12. 测试工具-Jira和禅道数据库分析
  13. 【yolov3详解】一文让你读懂yolov3目标检测原理
  14. TIOBE 6 月编程语言排行榜:编程语言的长尾效应
  15. MT6572 耳机驱动笔记
  16. 2020 中国独立开发者生存现状调研报告
  17. 手把手教你Axure-默认元件库(上)
  18. PS制作六边形蜂窝状banner人物海报
  19. 【OBS-STUDIO】OBSApp: OBS入口类
  20. RabbitMQ(六)——持久化和权重分配消息

热门文章

  1. Oracle查询CLOB类型字段的内容:
  2. 收款凭证 付款凭证 记账凭证的区别
  3. 女朋友没工作没文化不上进,甩都甩不掉,我疯了
  4. 开放接口API(开发者的福利)
  5. win10下Light-GBM(LGB)安装
  6. cvs配电保护断路器_CVS100F断路器|施耐德CVS100F100A断路器
  7. 三七互娱-游戏运维岗笔试题(无答案)
  8. 计算机英语及教学法,计算机英语教学方法探析
  9. 《软件工程与计算(卷二)》-Chapter22-23-软件开发过程模型与软件工程职业基础
  10. redis状态与性能监控