SSM(2) —— 用户注册和登录(1)

一. 创建数据库和表

创建一个数据库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;
    }

    @Override
    public 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 mapper
        PUBLIC "-//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);

    //用户登录,如果登录失败会返回null
    public User login(User user);

    //判断用户名是否存在,返回true表示用户名已存在,返回false表示用户名可用
    public boolean existUsername(User user);
}

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 {
    @Autowired
    private UserMapper userMapper;
    @Override
    public void register(User user) {
        userMapper.insertUser(user);
    }

    @Override
    public User login(User user) {
        return userMapper.queryUserByNameAndPassword(user.getUsername(),user.getPassword());
    }

    @Override
    public boolean existUsername(User user) {
        if(userMapper.queryUserByName(user.getUsername()) == null){
            return false;
        }else {
            return true;
        }
    }
}

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

package com.server.controller;

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;

@Controller
public class UserController {
    @Autowired
    private UserService userService;

    @RequestMapping("/")
    public String index(){
        return "index";
    }

    @RequestMapping("/registerPage")
    public String goToRegisterPage(){
        return "user/register";
    }

    @RequestMapping("/loginPage")
    public String goToLoginPage(){
        return "user/login";
    }

    @RequestMapping("/register")
    public String registerUser(User user){
        if(userService.existUsername(user)){
            //注册不成功
            return "user/register";
        }else {
            //注册成功
            return "index";
        }
    }

    @RequestMapping("/login")
    public String loginUser(User user){
        if(userService.login(user) == null){
            //登录失败,跳回登录页面
            return "user/login";
        }else {
            //登录成功,跳回首页
            return "index";
        }
    }
}

六. 编写页面

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

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>首页</title>
</head>
<body>
    <a href="${pageContext.request.contextPath}/loginPage"><input type="button" value="登录"/></a>
    <a href="${pageContext.request.contextPath}/registerPage"><input type="button" value="注册"/></a>
</body>
</html>

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

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>用户登录</title>
</head>
<body>
    <form action="${pageContext.request.contextPath}/login" method="post">
        用户名:<input type="text" name="username"> <br/>
        密码:<input type="password" name="password"> <br/>
        <input type="submit" value="登录">
    </form>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>用户注册</title>
</head>
<body>

    <form action="${pageContext.request.contextPath}/register" method="post">
        用户名:<input type="text" name="username"> <br/>
        用户密码:<input type="password" name="password"> <br/>
        确认密码:<input type="password" name="password"> <br/>
        电子邮箱:<input type="text" name="email"> <br/>
        <input type="submit" value="注册">
    </form>

</body>
</html>

九. 表单回显登录或注册错误相关信息

①当用户登录时用户名或密码错误,页面需要展示出来错误,并将用户名回显。

②当用户注册时用户名已存在,页面需要提示出错误,并将用户名和邮箱回显。

package com.server.controller;

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.servlet.ModelAndView;

import javax.servlet.http.HttpSession;

@Controller
public class UserController {
    @Autowired
    private UserService userService;

    @RequestMapping("/")
    public String index(){
        return "index";
    }

    @RequestMapping("/registerPage")
    public String goToRegisterPage(){
        return "user/register";
    }

    @RequestMapping("/loginPage")
    public String goToLoginPage(){
        return "user/login";
    }

    @RequestMapping("/register")
    public ModelAndView registerUser(User user){
        ModelAndView mav = new ModelAndView();
        if(userService.existUsername(user)){
            //注册不成功
            mav.addObject("msg","用户名已存在");
            mav.addObject("username",user.getUsername());
            mav.addObject("email",user.getEmail());
            mav.setViewName("user/register");
            return mav;
        }else {
            //注册成功
            mav.setViewName("index");
            return mav;
        }
    }

    @RequestMapping("/login")
    public ModelAndView loginUser(HttpSession session, User user){
        ModelAndView mav = new ModelAndView();
        if(userService.login(user) == null){
            //登录失败,跳回登录页面
            mav.addObject("msg","用户名或密码错误!");
            mav.addObject("username",user.getUsername());
            mav.setViewName("user/login");
            return mav;
        }else {
            //登录成功,跳回首页
            session.setAttribute("user",user.getUsername());
            mav.setViewName("index");
            return mav;
        }
    }
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>用户登录</title>
</head>
<body>
    <form action="${pageContext.request.contextPath}/login" method="post">
        用户名:<input type="text" name="username" value="${empty requestScope.username ? "" : requestScope.username}"> <br/>
        密码:<input type="password" name="password"> <br/>
        <input type="submit" value="登录">
    </form>

    <div>
        ${empty requestScope.msg ? "请输入用户名和密码" : requestScope.msg}
    </div>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>用户注册</title>
</head>
<body>

    <form action="${pageContext.request.contextPath}/register" method="post">
        用户名:<input type="text" name="username" value="${empty requestScope.username ? "" : requestScope.username}"> <br/>
        用户密码:<input type="password" name="password"> <br/>
        确认密码:<input type="password" name="password"> <br/>
        电子邮箱:<input type="text" name="email" value="${empty requestScope.email ? "" : requestScope.email}"> <br/>
        <input type="submit" value="注册">
    </form>

    <div>
        ${empty requestScope.msg ? "" : requestScope.msg}
    </div>
</body>
</html>

十. 最终目录形式

 

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值