登录
1. 准备环境
-
静态页面:login.html
<!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="loginServlet" 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>
-
数据库:user.sql
-- 创建用户表 CREATE TABLE tb_user( id int primary key auto_increment, username varchar(20) unique, password varchar(32) ); -- 添加数据 INSERT INTO tb_user(username,password) values('zhangsan','123'),('lisi','234'); SELECT * FROM tb_user;
-
pojo:User.java
-
pom.xml加入依赖坐标:Mybatis 和 Mysql驱动
-
mybatis-config.xml : resource目录下
<?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.itheima.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:///db1?useSSL=false&useServerPrepStmts=true"/> <property name="username" value="root"/> <property name="password" value="root"/> </dataSource> </environment> </environments> <mappers> <!--扫描mapper--> <package name="com.itheima.mapper"/> </mappers> </configuration>
-
Usermapper.xml :resource/com/itheima/mapper
-
Usermapper接口:java/com/itheima/mapper
2.代码实现
-
UserMapper接口中提供一个接口方法:根据username和password查询用户对象
package com.itheima.mapper; import com.itheima.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 (如果sql语句简单使用注解进行映射,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.itheima.mapper.UserMapper"> <select id="select" resultType="com.itheima.pojo.User"> select * from tb_user where username=#{username} and password = #{password} </select> </mapper>
-
login.html设置form标签action=LoginServert
<form action="LoginServlet" 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>
-
LoginServert:com.itheima.web
-
获取用户名和密码,
-
调用mybatis查询,
-
判断查询结果
package com.itheima.web; import com.itheima.mapper.UserMapper; import com.itheima.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("/loginServlet") public class LoginServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1.获取请求参数 String username = request.getParameter("username").trim(); String password = request.getParameter("password").trim(); //2.mybatis查询数据 //2.1加载核心配置文件 InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml"); //2.2使用sqlSessionFactory创建sqlSession SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); SqlSession sqlSession = sqlSessionFactory.openSession(); //2.3使用sqlSession获取userMapper代理对象,执行方法,获取查询结果 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); User user = userMapper.select(username,password); //3.释放资源 sqlSession.close(); //4.response设置ContentType response.setContentType("text/html;charset=utf-8"); //5.根据user是否为null,在页面写登录是否成功 PrintWriter writer = response.getWriter(); if (user!=null){ writer.write("登陆成功"); }else { writer.write("登陆失败"); } } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request, response); } }
-
-
测试
注册
代码实现
-
register.html:action指向registerServlet
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>欢迎注册</title> <link href="css/register.css" rel="stylesheet"> </head> <body> <div class="form-div"> <div class="reg-content"> <h1>欢迎注册</h1> <span>已有帐号?</span> <a href="login.html">登录</a> </div> <form id="reg-form" action="registerServlet" method="post"> <table> <tr> <td>用户名</td> <td class="inputs"> <input name="username" type="text" id="username"> <br> <span id="username_err" class="err_msg" style="display: none">用户名不太受欢迎</span> </td> </tr> <tr> <td>密码</td> <td class="inputs"> <input name="password" type="password" id="password"> <br> <span id="password_err" class="err_msg" style="display: none">密码格式有误</span> </td> </tr> </table> <div class="buttons"> <input value="注 册" type="submit" id="reg_btn"> </div> <br class="clear"> </form> </div> </body> </html>
-
registerServlet
package com.itheima.web; import com.itheima.mapper.UserMapper; import com.itheima.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.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("/registerServlet") public class RegisterServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1.获取前端请求数据,将用户名密码封装为User,为插入数据做准备 String username = request.getParameter("username").trim(); String password = request.getParameter("password").trim(); User u = new User(); u.setUsername(username); u.setPassword(password); //2.mybatis查询数据 InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml"); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); SqlSession sqlSession = sqlSessionFactory.openSession(); UserMapper userMapper = sqlSession.getMapper(UserMapper.class); //根据用户名查询,并返回User对象, //注意User实体类要有全参数的构造方法,才可以根据查询结果封装对象 User user = userMapper.selectByUsername(username); response.setContentType("text/html;charset=utf-8"); PrintWriter writer = response.getWriter(); if (user!=null){ writer.write("用户名已存在"); }else { userMapper.add(u); //mybatis默认开启事务,所以需要提交事务,这样插入数据才可以生效 sqlSession.commit(); sqlSession.close(); writer.write("注册成功"); } } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request, response); } }
-
UserMapper接口
package com.itheima.mapper; import com.itheima.pojo.User; import org.apache.ibatis.annotations.Insert; 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); @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); }
SqlSessionFactory工具类抽取
-
由于每个Servlet里面进行mybatis查询时都有重复的代码
- sqlSessionFactory工厂类重复创建
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml"); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
- 抽取SqlSessionFactory工具类
- 重复代码抽取工具类
- 对指定的代码只需要执行一次可以使用静态代码块