用户登录及注册案例
一、用户登录
1. 准备阶段
1.1涉及的知识点
- MyBatis作为框架,简化JDBC来操作数据库
- Maven作为一个管理和构建java项目的工具
- MySQL作为数据库来存放用户信息
- Servlet作为一个接口由Tomcat运行,处理浏览器的请求和响应
1.2流程说明
- 用户填写用户名密码,提交到LoginServlet
- 在LoginServlet中使用MyBatis查询数据库,验证用户名密码是否正确
- 如果正确,响应“登录成功”,如果错误,响应“登录失败”
2. 具体流程
2.1环境的搭建
2.1.1具体内容
- 创建一个Maven项目
- 将下载的静态页面复制到项目中的webapp目录(web项目核心目录)下
- 创建数据库,创建一个表来存放用户数据
- 创建User实体类
- 导入MyBatis和MySQL驱动坐标
- 创建mybatis-config.xml核心配置文件
- 创建UserMapper.xml映射文件和UserMpper接口
2.1.2创建Maven项目
1.新建模块
2.选择Maven
3.选择“从原型创建”并选择如下原型
2.1.3静态页面文件
将下载到的静态页面的文件导入web项目核心文件目录
2.1.4创建数据库
-- 创建一个表
CREATE TABLE tb_user(
id INT PRIMARY KEY auto_increament,
username VARCHAR(20) UNIQUE,
password VARCHAR(30)
);
-- 添加数据
INSERT INTO tb_user(username,password) VALUES('mr.zhao','3220021'),('zhengwei','3122002298'),('zhaoying','123456');
SELECT * FROM tb_user;
2.1.5创建User实体类
在源代码java文件目录下创建一个com.zwcode.pojo的包,然后在该包中创建User实体类
package com.zwcode.pojo;
public class User {
private Integer id;
private String username;
private String password;
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;
}
@Override
public String toString() {
return "user{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
}
2.1.6导入MyBatis和MySQL驱动坐标
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.5</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.46</version>
</dependency>
</dependencies>
- 记得导入后要点击刷新
2.1.7mybatis-config.xml核心配置文件
- 核心配置文件的代码可以从官网拷贝;mybatis官网
- 核心文件主要是用于配置数据库连接环境信息的
- 如果Mapper接口名称和SQL映射文件名称相同,并在同一目录下,则可以使用包扫描的方式简化SQL映射文件的加载
<?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.zwcode.pojo"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:///accountinfo?useSSL=false&useServerPrepStmts=true"/>
<property name="username" value="root"/>
<property name="password" value="1234"/>
</dataSource>
</environment>
</environments>
<mappers>
<!--扫描mapper-->
<package name="com.zwcode.mapper"/>
</mappers>
</configuration>
2.1.8UserMapper.xml映射文件和UserMpper接口
-
映射文件中定义了sql语句,对sql语句进行统一的管理
-
接口中定义了方法,可以通过mybatis创建的代理对象来调用方法去执行对应的sql语句
-
执行sql语句的具体流程:
1.sqlSession对象通过getMapper方法获取Mapper接口的代理对象
2.代理对象调用Mapper接口中的方法
3.根据Mapper接口的全类名来查找映射文件
4.根据接口中方法名来找到映射文件中的sql语句,并执行
//UserMapper接口
package com.zwcode.mapper;
import com.zwcode.pojo.User;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
public interface UserMapper {
@Select("select * from tb_user where username= #{username} and password=#{password}")
User select(@Param("username") String username, @Param("password") String password);
}
<!-- UserMapper.xml映射文件 -->
<?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.zwcode.mapper.UserMapper">
</mapper>
3. 登录逻辑代码
3.1修改login.html中的action
- 当用户在页面里按下登录按钮,用户的数据就会被发送到action对应的文件中
<!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="/loginDemo1/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">
<a href="register.html">没有账号?点击注册</a>
</div>
</form>
</div>
</body>
</html>
3.2loginServlet类
3.2.1创建
- 选择新建一个servelt
- 修改WebServlet注解,配置Servlet访问路径
@WebServlet("/loginServlet")
3.2.2接收用户信息
//1.接受用户名和密码
String username = request.getParameter("username");
String password = request.getParameter("password");
3.2.3调用MyBatis查询
//2.1 获取SqLSessionFactory对象
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//2.2获取SqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//2.3获取Mapper
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
//2.4调用方法
User user = userMapper.select(username,password);
//2.5释放资源
sqlSession.close();
3.2.4判断账户密码正确性
//获取字符输出流,并设置content type
response.setContentType("text/html;charset=utf-8");
PrintWriter writer = response.getWriter();
//判断逻辑
if(user!=null){
//登录成功
writer.write("登录成功!");
}else{
//登录失败
writer.write("登录失败!");
}
3.2.5完整代码
package com.zwcode.web;
import com.zwcode.pojo.User;
import com.zwcode.mapper.UserMapper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
@WebServlet("/loginServlet")
public class loginServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.接受用户名和密码
String username = request.getParameter("username");
String password = request.getParameter("password");
//2.调用MyBatis完成查询
//2.1 获取SqLSessionFactory对象
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//2.2获取SqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//2.3获取Mapper
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
//2.4调用方法
User user = userMapper.select(username,password);
//2.5释放资源
sqlSession.close();
//3. 判断user释放为null
//获取字符输出流,并设置content type
response.setContentType("text/html;charset=utf-8");
PrintWriter writer = response.getWriter();
//判断逻辑
if(user!=null){
//登录成功
writer.write("登录成功!");
}else{
//登录失败
writer.write("登录失败!");
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
4.运行
4.1完整文件目录
4.2运行截图
二、用户注册
1.与用户登录代码不同点
-
用户注册要用到另外一个html文件,其中的action要改为注册的servlet目录
-
在与loginServlet同一个包下创建一个新的Servlet文件,取名为registerServlet
-
UserMapper接口中要新定义一系列方法
-
在用mybatis查询时用mapper对象调用userMapper接口中方法不同
-
最后的判断逻辑也不同
2.具体不同的代码和操作
2.1 register.html中action的更改
action="/loginDemo1/registerServlet"
2.2创建新的servlet文件
2.3 UserMapper接口中要新定义一系列方法
//根据用户名查询用户
@Select("select * from tb_user where username= #{username}")
User selectByUsername(String username);
//添加用户
@Insert("insert into tb_user values(null,#{username},#{password})")
void add(User user);
2.4 registerServlet中调用mybatis查询
//2.调用mybatis查询
//2.1获取SqlSessionFactory对象
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//2.2获取SqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//2.3获取Mapper
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
//2.4调用方法
User u=userMapper.selectByUsername(username);
2.5 判断逻辑
//3.判断用户对象是否为null
if(u==null){
//添加用户
userMapper.add(user);
response.setContentType("text/html;charset=utf-8");
response.getWriter().write("用户注册成功!");
//提交事务
sqlSession.commit();
//释放资源
sqlSession.close();
}else{
response.setContentType("text/html;charset=utf-8");
response.getWriter().write("用户已存在!");
}
2.6 registerServlet类完整代码
package com.zwcode.web;
import com.zwcode.mapper.UserMapper;
import com.zwcode.pojo.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import javax.annotation.Resource;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.io.StringReader;
@WebServlet("/registerServlet")
public class registerServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.接收用户信息
//1.1获取用户名和密码
String username=request.getParameter("username");
String password=request.getParameter("password");
//1.2创建一个User对象
User user=new User();
user.setUsername(username);
user.setPassword(password);
//2.调用mybatis查询
//2.1获取SqlSessionFactory对象
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//2.2获取SqlSession对象
SqlSession sqlSession = sqlSessionFactory.openSession();
//2.3获取Mapper
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
//2.4调用方法
User u=userMapper.selectByUsername(username);
//3.判断用户对象是否为null
if(u==null){
//添加用户
userMapper.add(user);
response.setContentType("text/html;charset=utf-8");
response.getWriter().write("用户注册成功!");
//提交事务
sqlSession.commit();
//释放资源
sqlSession.close();
}else{
response.setContentType("text/html;charset=utf-8");
response.getWriter().write("用户已存在!");
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}