用户注册登录
用户登录
- 流程说明:
- 用户填写用户名密码,提交到LoginServlet
- 在LoginServlet中使用MyBatis查询数据库,验证用户名密码是否正确
- 如果正确,响应“登录成功”,如果错误,响应“登录失败”
- 准备环境:
- 复制资料中的静态页面到项目的webapp目录下
- 创建db1数据库,创建tb_user表,创建User实体类
- 导入MyBatis坐标,MySQL驱动坐标
- 创建mybatis-config.xml核心配置文件,UserMapper.xml映射文件,UserMapper接口
用户注册
- 流程说明:
- 用户填写用户名、密码等信息,点击注册按钮,提交到RegisterServlet
- 在RegisterServlet中使用MyBatis 保存数据
- 保存前,需要判断用户名是否已经存在:根据用户名查询数据库
具体代码
-
目录结构
-
porm.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.jihua</groupId> <artifactId>userDemo</artifactId> <version>1.0-SNAPSHOT</version> <packaging>war</packaging> <name>userDemo Maven Webapp</name> <!-- FIXME change it to the project's website --> <url>http://www.example.com</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.7</maven.compiler.source> <maven.compiler.target>1.7</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> <!--mybatis--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.5</version> </dependency> <!--mysql驱动--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.34</version> </dependency> </dependencies> <build> <plugins> <!-- Tomcat插件 --> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.2</version> <configuration> <!-- 端口号 --> <port>8080</port> </configuration> </plugin> </plugins> </build> </project>
-
login.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>login</title> </head> <body> <form action="/userDemo/LoginServlet" method="post" id="form"> <h1>欢迎,请登录</h1> <p>用户名:<input id="username" name="username" type="text"></p> <p>密 码:<input id="password" name="password" type="password"></p> <input type="submit" value="登录"> <input type="reset" value="清空"> <span>没有账号?</span><a href="register.html">注册</a> </form> </body> </html>
- register.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>欢迎注册</title> </head> <body> <h1>欢迎注册</h1> <form action="/userDemo/RegisterServlet" method="post"> <p><span>用户名:</span><input type="text" name="username" id="username"></p> <p><span>密 码:</span> <input type="password" name="password" id="password"></p> <input type="submit" value="注册"> <input type="reset" value="清空"> <span>已有账号?</span><a href="login.html">登录</a> </form> </body> </html>
-
UserMapper.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Napper 3.0//EN" "http: //mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.jihua.mapper.UserMapper"> </mapper>
-
mybatis-config.xml
<?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.jihua.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:///userdemo?useSSL=false&useServerPrepStmts=true"/> <property name="username" value="root"/> <property name="password" value="你的密码"/> </dataSource> </environment> </environments> <mappers> <!--加载sql映射文件--> <!--<mapper resource="com/jihua/Mapper/UserMapper.xml"/>使用Mapper代理后弃用--> <!--Mapper代理方式--> <package name="com.jihua.mapper"/> </mappers> </configuration>
-
User.java
package com.jihua.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 getName() { return username; } public void setName(String name) { this.username = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } @Override public String toString() { return "User{" + "id=" + id + ", name='" + username + '\'' + ", password='" + password + '\'' + '}'; } }
-
UserMapper.class(接口)
package com.jihua.mapper; import com.jihua.pojo.User; import org.apache.ibatis.annotations.Insert; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; 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); /** * 根据用户名查询用户对象 * @param username * @return */ @Select("select * from tb_user where username=#{username}") User selectByUsername(String username); /** * 添加用户 * @param user */ @Insert("insert into tb_user values(null, #{username}, #{password})") void add(User user); }
-
LoginServlet.class
package com.jihua.web; import com.jihua.mapper.UserMapper; import com.jihua.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.servlet.*; import javax.servlet.http.*; import javax.servlet.annotation.*; import java.io.IOException; import java.io.InputStream; import java.io.PrintWriter; @WebServlet(name = "LoginServlet", value = "/LoginServlet") public class LoginServlet extends HttpServlet { @Override protected void doGet(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(); //获取字符输出流,并设置content type response.setContentType("text/html;charset=utf-8"); PrintWriter writer = response.getWriter(); //3. 判断user是否为null if (user != null) { //登录成功 writer.write("<script>alert('登录成功')</script>"); // writer.write("登录成功"); writer.write(username + ",欢迎你"); } else { //登录失败 writer.write("<script>alert('登录失败')</script>"); response.getWriter().write("<a href=\"login.html\">登录失败,点击返回登录</a>"); // writer.write("登录失败"); } } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request, response); } }
-
RegisterServlet.class
package com.jihua.web; import com.jihua.mapper.UserMapper; import com.jihua.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.servlet.*; import javax.servlet.http.*; import javax.servlet.annotation.*; import java.io.IOException; import java.io.InputStream; import java.io.PrintWriter; @WebServlet(name = "RegisterServlet", value = "/RegisterServlet") public class RegisterServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1. 接收用户数据 String username = request.getParameter("username"); String password = request.getParameter("password"); //封装用户对象 User user = new User(); user.setName(username); user.setPassword(password); //2. 调用mapper,根据用户名查询用户对象 //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); //获取字符输出流,并设置content type response.setContentType("text/html;charset=utf-8"); //3. 判断用户对象是否为null if (u == null) { //用户名不存在,添加用户 userMapper.add(user); //提交事务 sqlSession.commit(); //给出提示 response.getWriter().write("<script>alert('注册成功')</script>"); response.getWriter().write("<a href=\"login.html\">注册成功,点击返回登录</a>"); } else { //用户名存在,给出提示信息 response.getWriter().write("<script>alert('用户已存在')</script>"); response.getWriter().write("<a href=\"login.html\">用户已存在,点击返回登录</a>"); } //释放资源 sqlSession.close(); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request, response); } }
SqlSessionFactory工具类抽取
代码优化
-
创建SqlSessionFactory代码优化
//2.1 获SqlSessionFactory对象 String resource "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsstream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputstream);
问题:
- 代码重复:工具类
SqlSessionFactory
工厂只创建一次,不要重复创建:静态代码块
public class SqlSessionFactoryUtils {
private static SqlSessionFactory sqlSessionFactory;
static {
//静态代码块会随着类的加截而自动执行,且只执行一次
try {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
public static SqlSessionFactory getSqlSessionFactory() {
return sqlSessionFactory;
}
}
//2.1 获SqlSessionFactory对象
SqlSessionFactory sqlSessionFactory = SqLSessionFactoryutils.getsqLSessionFactory();