一. 创建数据库和表
创建一个数据库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>
十. 最终目录形式