一. 创建数据库和表

创建一个数据库ssm,在该数据库下创建一个user表

CREATE TABLE `ssm`.`user` (`id` INT NOT NULL AUTO_INCREMENT,`username` VARCHAR(45) UNIQUE,`password` VARCHAR(45),`email` VARCHAR(45),PRIMARY KEY (`id`));

二. 编写JavaBean对象

package com.server.pojo;public class User {private Integer id;private String username;private String password;private String email;public User() {}public User(Integer id, String username, String password, String email) {this.id = id;this.username = username;this.password = password;this.email = email;}public Integer getId() {return id;}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;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}@Overridepublic String toString() {return "User{" +"id=" + id +", username='" + username + '\'' +", password='" + password + '\'' +", email='" + email + '\'' +'}';}
}

三. Dao层

1. 创建Mapper接口

package com.server.mapper;import com.server.pojo.User;
import org.apache.ibatis.annotations.Param;public interface UserMapper {//添加用户信息void insertUser(User user);//根据用户名查询用户信息User queryUserByName(@Param("username") String username);//根据用户名和密码查询用户信息User queryUserByNameAndPassword(@Param("username") String username, @Param("password") String password);
}

2. 创建Mapper接口的映射文件

映射文件与mapper接口、接口中的方法对应,并在映射文件中编写sql语句(相当于实现了Mapper接口中的方法)。

注:一个表 对应 一个实体类 对应 一个mapper接口 对应 一个映射文件

①在resources目录下创建一个mapper目录(该目录名需要与存放Mapper接口的包名一致,其用于存放每个Mapper接口所对应的映射文件),这里是com/server/mapper

②在resources目录下的mapper目录下创建一个映射文件:UserMapper.xml(映射文件的名字需要与Mapper接口同名)

③映射文件里的namespace要和Mapper接口的全类名保持一致,这里为:  com.server.mapper.UserMapper

④映射文件里的SQL语句的id要和mapper接口中的方法名一致

⑤映射文件里查询功能的返回值类型是数据库表对应的JavaBean对象

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.server.mapper.UserMapper">  <!--为mapper接口的全类名--><insert id="insertUser">insert into user values(#{id},#{username},#{password},#{email})</insert><select id="queryUserByName" resultType="User">select * from user where username=#{username}   <!-- {}中使用@Param注解内的值--></select><select id="queryUserByNameAndPassword" resultType="User">select * from user where username=#{username} and password=#{password} <!-- {}中使用@Param注解内的值--></select></mapper>

四. Service层

1. 在service包下编写UserService接口

package com.server.service;import com.server.pojo.User;public interface UserService {//用户注册,如果用户名已存在,则需要重新注册一个新的用户名(用户名不可以重复)public void register(User user);//用户登录,如果登录失败会返回nullpublic User login(String username, String password);//判断用户名是否存在,返回true表示用户名已存在,返回false表示用户名可用public User queryUsername(String username);
}

2. 在service.impl包下编写UserServiceImpl类来实现UserService接口

package com.server.service.impl;import com.server.mapper.UserMapper;
import com.server.pojo.User;
import com.server.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class UserServiceImpl implements UserService {@Autowiredprivate UserMapper userMapper;@Overridepublic void register(User user) {userMapper.insertUser(user);}@Overridepublic User login(String username, String password) {return userMapper.queryUserByNameAndPassword(username, password);}@Overridepublic User queryUsername(String username) {return userMapper.queryUserByName(username);}
}

五. Web层 —— 编写控制器方法

package com.server.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;@Controller
public class IndexController {@RequestMapping("/")public String index(){return "index";}
}
package com.server.controller;import com.server.common.Constants;
import com.server.common.ReturnObject;
import com.server.pojo.User;
import com.server.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;@Controller
public class UserController {@Autowiredprivate UserService userService;@RequestMapping("/loginPage")public String goToLoginPage(){return "user/login";}@RequestMapping("/registerPage")public String goToRegisterPage(){return "user/register";}@RequestMapping("/login")@ResponseBody   //添加@ResponseBody注解将返回的数据自动转化为jsonpublic Object loginUser(String username, String password, String isRemPwd, HttpSession session, HttpServletResponse response){  //形参名和请求的参数名需要相同User user = userService.login(username, password);   //查询用户ReturnObject returnObject = new ReturnObject();   //根据查询结果生成响应信息if(user == null){//登录失败returnObject.setCode(Constants.RETURN_OBJECT_CODE_FAIL);returnObject.setMessage("用户名或密码错误");}else {//登录成功returnObject.setCode(Constants.RETURN_OBJECT_CODE_SUCCESS);session.setAttribute(Constants.SESSION_USER, user);//如果需要记住密码,则添加cookieif("true".equals(isRemPwd)){Cookie cookieUsername = new Cookie("username", username);cookieUsername.setMaxAge(7*24*60*60);   //cookie保存7天response.addCookie(cookieUsername);Cookie cookiePassword = new Cookie("password", password);cookieUsername.setMaxAge(7*24*60*60);   //cookie保存7天response.addCookie(cookiePassword);}else{//如果不需要记住密码,则将以前创建的cookie删掉Cookie cookieUsername = new Cookie("username", null);cookieUsername.setMaxAge(0);   //删除cookieresponse.addCookie(cookieUsername);Cookie cookiePassword = new Cookie("password", null);cookieUsername.setMaxAge(0);   //删除cookieresponse.addCookie(cookiePassword);}}return returnObject;}@RequestMapping("/register")@ResponseBodypublic Object registerUser(String username, String password, String email, HttpSession session ){User user = new User(null, username, password, email);ReturnObject returnObject = new ReturnObject();   //根据查询结果生成响应信息if(userService.queryUsername(username) != null){//用户名已存在,不能注册returnObject.setCode(Constants.RETURN_OBJECT_CODE_FAIL);returnObject.setMessage("用户名已存在");}else {//可以注册userService.register(user);   //注册returnObject.setCode(Constants.RETURN_OBJECT_CODE_SUCCESS);session.setAttribute(Constants.SESSION_USER, user);}return returnObject;}@RequestMapping("/logout")public String logout(HttpServletResponse response, HttpSession session){//清空cookieCookie cookieUsername = new Cookie("username", null);cookieUsername.setMaxAge(0);   //删除cookieresponse.addCookie(cookieUsername);Cookie cookiePassword = new Cookie("password", null);cookieUsername.setMaxAge(0);   //删除cookieresponse.addCookie(cookiePassword);//销毁sessionsession.invalidate();return "redirect:/";   //重定向到首页}
}

上面需要用到自定义common包下的Constants类(常数类)和ReturnObject类(响应对象类)

package com.server.common;public class Constants {public static final String RETURN_OBJECT_CODE_SUCCESS = "1";  //成功public static final String RETURN_OBJECT_CODE_FAIL = "0";  //失败public static final String SESSION_USER = "sessionUser";
}
package com.server.common;public class ReturnObject {private String code;private String message;public ReturnObject() {}public ReturnObject(String code, String message) {this.code = code;this.message = message;}public String getCode() {return code;}public void setCode(String code) {this.code = code;}public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}@Overridepublic String toString() {return "ReturnObject{" +"code='" + code + '\'' +", message='" + message + '\'' +'}';}
}

六. 编写页面

1.在WEB-INF目录下创建一个pages目录,在pages目录下编写index.jsp页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head><title>首页</title><%    //获取当前工程的路径String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+request.getContextPath()+"/";%><base href="<%=basePath%>">
</head>
<body><%-- 如果用户还没有登录,显示登录和注册菜单--%><c:if test="${empty sessionScope.sessionUser}"><a href="loginPage"><input type="button" value="登录"/></a><a href="registerPage"><input type="button" value="注册"/></a></c:if><%-- 如果用户已经登录,显示欢迎用户和注销--%><c:if test="${not empty sessionScope.sessionUser}">欢迎${sessionScope.sessionUser.username}<a href="logout"><input type="button" value="退出"/></a></c:if></body>
</html>

2.在pages目录创建一个user目录,在user目录下创建login.jsp和register.jsp页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head><title>用户登录</title><%    //获取当前工程的路径String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+request.getContextPath()+"/";%><base href="<%=basePath%>"><script type="text/javascript" src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>  <!--引入jquery --><script type="text/javascript">$(function(){//给浏览器窗口添加键盘按下事件$(window).keydown(function (e){//如果按的是回车键,则提交登录请求if(e.keyCode == 13){$("#loginBtn").click();}});//添加单击事件$("#loginBtn").click(function(){//获取请求参数var loginUsername = $.trim($("#loginUsername").val());  //(将用户不小心输入的空格去掉)var loginPassword = $.trim($("#loginPassword").val());var isRemPwd = $("#isRemPwd").prop("checked");//表单验证//验证用户名:必须由字母或数字或下划线组成,并且长度为1-12位var usernamePatt = /^\w{1,12}$/;if(!usernamePatt.test(loginUsername)){$("#msg").text("用户名不合法");return;}//验证用户密码:必须由字母或数字或下划线组成,并且长度为6-12位var passwordPatt = /^\w{6,12}$/;if(!passwordPatt.test(loginPassword)){$("#msg").text("密码不合法");return;}//发送请求$.ajax({url:'login',data:{username:loginUsername,    //需要和Controller中方法的形参同名password:loginPassword,isRemPwd:isRemPwd},type:'post',dataType:'json',success:function (data){if(data.code=="1"){//登录成功,跳转到首页window.location.href="";}else{//登录失败,不跳转(显示错误信息)$("#msg").text(data.message);}}});});});</script></head>
<body><span id="msg"></span>  <br/><form>用户名:<input type="text" id="loginUsername" value="${cookie.username.value}"> <br/>密码:<input type="password" id="loginPassword" value="${cookie.password.value}"> <br/><input type="checkbox" id="isRemPwd">记住密码<br/><button type="button" id="loginBtn">登录</button></form>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>用户注册</title><%    //获取当前工程的路径String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+request.getContextPath()+"/";%><base href="<%=basePath%>"><script type="text/javascript" src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>  <!--引入jquery --><script type="text/javascript">$(function(){//给浏览器窗口添加键盘按下事件$(window).keydown(function (e){//如果按的是回车键,则提交登录请求if(e.keyCode == 13){$("#registerBtn").click();}});//添加单击事件$("#registerBtn").click(function(){//获取请求参数var registerUsername = $.trim($("#registerUsername").val());  //(将用户不小心输入的空格去掉)var registerPassword = $.trim($("#registerPassword").val());var confirmPassword = $.trim($("#confirmPassword").val());var email = $.trim($("#email").val());//表单验证//验证用户名:必须由字母或数字或下划线组成,并且长度为1-12位var usernamePatt = /^\w{1,12}$/;if(!usernamePatt.test(registerUsername)){$("#msg").text("用户名不合法");return;}//验证用户密码:必须由字母或数字或下划线组成,并且长度为6-12位var passwordPatt = /^\w{6,12}$/;if(!passwordPatt.test(registerPassword)){$("#msg").text("密码不合法");return;}//验证确认密码:必须和密码相同if(confirmPassword != registerPassword){$("#msg").text("密码不一致");return;}//发送请求$.ajax({url:'register',data:{username:registerUsername,    //需要和Controller中方法的形参同名password:registerPassword,email:email},type:'post',dataType:'json',success:function (data){if(data.code=="1"){//注册成功,跳转到登录页面window.location.href="loginPage";}else{//注册失败,不跳转(显示错误信息)$("#msg").text(data.message);}}});});});</script></head>
<body><span id="msg"></span>  <br/><form action="register" method="post">用户名:<input type="text" id="registerUsername"> <br/>用户密码:<input type="password" id="registerPassword"> <br/>确认密码:<input type="password" id="confirmPassword"> <br/>电子邮箱:<input type="text" id="email"> <br/><button type="button" id="registerBtn">注册</button></form></body>
</html>

十. 最终目录形式

SSM(3) —— 用户注册和登录(完整)相关推荐

  1. 登录注册php完整代码,PHP用户注册与登录完整代码分享

    在前面我们讲了<PHP 用户注册与登录实例演示>.<PHP 实现用户注册功能>.<PHP实现用户登录与退出功能>经过一系列的学习,就可以轻松实现注册与登录了,下面我 ...

  2. 使用Forms Authentication实现用户注册、登录 (二)用户注册与登录

    从这一部分开始,我们将通过一个实际的完整示例来看一下如何实现用户注册与登录.在介绍注册与登录之前,我们首先介绍一下如何判断用户是否已登录,并未后面的示例编写一些基础代码. 判断用户是否已经登录 首先, ...

  3. Python+django网页设计入门(5):自定义用户注册与登录功能

    今天恰逢1024,是我们码农自己的节日,祝"Python小屋"所有朋友节日快乐!发几个去年整理的段子开心一下: 祝所有程序员1024节日快乐 =================== ...

  4. PHP网站设计 ---- 网盘(实现用户注册、登录,文件上传、下载、删除、查看等功能)

    PHP网站设计 ---- 网盘(实现用户注册.登录,文件上传.下载.删除.查看等功能) 运行效果 视频演示 项目下载(在xampp/htdocs/下可以直接运行) 完整项目包.zip 功能要求 当用户 ...

  5. ODBC + WIN32 API 访问MYSQL 数据库实现简单QQ用户注册和登录 的代码分析

    ODBC + WIN32 API 访问MYSQL 数据库实现简单QQ用户注册和登录 的代码分析 . /   // datadase odbc1.cpp : 定义应用程序的入口点.  //   #inc ...

  6. 终于把单点登录完整流程图画明白了!史上最完整的CAS单点登录完整图解!

    CAS单点登录 本人也是初次接触CAS,有问题还请指正. 什么是单点登录 比如说百度,在浏览器中登录百度贴吧之后,百度的其他网站也同步登录了:退出百度贴吧之后,百度的其他网站也同步退出了. 简单来说就 ...

  7. 使用Forms Authentication实现用户注册、登录 (三)用户实体替换

    使用Forms Authentication实现用户注册.登录 (三)用户实体替换 收藏 IPrincipal和IIdentity 通过查阅文档,我们可以看到HttpContext.User属性的类型 ...

  8. python注销代码_django用户注册、登录、注销和用户扩展的示例

    用户部分是一个网站的基本功能,django对这部分进行了很好的封装,我们只需要在django的基础上做些简单的修改就可以达到我们想要的效果 首先我假设你对django的session.cookie和数 ...

  9. Spring框架学习笔记09:基于XML配置方式搭建SSM框架实现用户登录

    文章目录 一.采用MVC架构 二.用户登录运行效果 三.基于XML配置方式搭建SSM框架实现用户登录 (一)创建数据库与表 - simonshop (t_user) 1.创建数据库 - simonsh ...

  10. 使用Web API和React创建用户注册和登录

    目录 介绍 先决条件 代码 创建数据库和表 创建一个Web API项目 创建React项目 介绍 在本文中,我们将逐步学习使用Reactjs和Web API创建用户注册和登录页面的过程.React是一 ...

最新文章

  1. shell之实战应用一(查找xml文档中的关键字段)
  2. android运行jar文件路径,java命令行执行jar包报错解决
  3. redis的那种目录结构能新建么_Serverless 解惑——函数计算如何访问 Redis 数据库...
  4. 【unity3d游戏开发之基础篇】利用射线实现鼠标控制角色转向和移动(角色移动一)...
  5. android UI
  6. eclipse编写wordcount提交spark运行
  7. ES6——Set和WeakSet
  8. Ubuntu Desktop 变为 Ubuntu Server 服务器版的方法
  9. python小课账号转卖_Python小课笔记--Python报错处理
  10. 计算机如何做材料的应力应变曲线,常用材料应力应变曲线.xlsx
  11. 注入技术--LSP劫持注入
  12. 二元函数对xy同时求导_二元函数的连续、可偏导、可微、偏导数连续之间的关系...
  13. SEO整体优化有哪些操作步骤
  14. 夏普Sharp MX-B401 一体机驱动
  15. 聊一聊芯片后端的标准单元-standard cell
  16. oracle jmf下载,Ubuntu/Linux下安装JMF播放媒体文件
  17. 教程:实现WinUSB通信系统的最简单的方式
  18. 每日单词20110603
  19. 道尔生物与Lonza合作开发多特异性生物治疗药物;南京维立志博与百济神州达成合作 | 医药健闻...
  20. html2canvas以及domtoimage的使用踩坑总结 动态获取的二维码失效如何生成海报

热门文章

  1. 硬盘基本知识(磁头、磁道、扇区、柱面),格式化容量计算
  2. windows utf8 签名 一个很二的问题(经典乱码“锘”字)
  3. 苹果I 的创造者 沃兹
  4. 【chromium】Crashpad 简介
  5. JS 的立即执行函数
  6. GT/s和GB/s(Gbps)之间含义说明
  7. 护卫神php套件 xp,护卫神PHP套件FastCGI版PHP v5.4
  8. 用户账号注册的风险及安全措施
  9. umount: 提示 target is busy
  10. CALayer之旅(CALayer Tutorial: Getting Started)