目录
1、需求
2、怎样实现
3、步骤
1)创建login.html
2)创建user数据表
3)IDEA连接数据库
4)pom.xml中添加MyBatis和MySQL驱动坐标
5)创建User实体类
6)创建UserMapper.xml映射文件
7)创建UserMapper接口
8)创建MyBatis的配置文件
9)创建LoginServlet、创建SuccessServlet
10)整体目录结构
11)启动Tomcat
1、需求
- 创建一个简单的HTML页面,输入用户名、密码,点击登录,使用POST方法。
- 创建LoginServlet,处理请求与响应。
- 如果登录成功,跳转到SuccessServlet,展示:用户名,欢迎回来!
- 登录失败,直接展示:登录失败
2、怎样实现
1. 用户在登录页面输入用户名和密码,提交请求给LoginServlet
2. 在LoginServlet中接收请求和数据(用户名和密码)
3. 在LoginServlet中,使用Mybatis调用UserMapper,根据用户名和密码查询数据库表
4. 将查询的结果封装到User对象中进行返回
5. 在LoginServlet中判断返回的User对象是否为null
6. 如果为null,说明根据用户名和密码没有查询到用户,则登录失败,返回"登录失败"数据给前端
7. 如果不为null,则说明用户存在并且密码正确,则登录成功,跳转到SuccessServlet,使用域对象的getAttribute方法获取用户名
3、步骤
1)创建login.html
放到:webapp文件夹中,WEB-INF外
需要一个 HTML 表单让用户输入用户名和密码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登录</title>
</head>
<body>
<form action="login" method="post">
<label for="username">用户名:</label>
<input type="text" id="username" name="username" required><br>
<label for="password">密码:</label>
<input type="text" id="password" name="password" required><br>
<input type="submit" value="登录">
</form>
</body>
</html>
在这个表单中,action
属性指定了表单数据提交到的 URL(“login"),method
属性指定了 HTTP 方法(POST)。
访问:
2)创建user数据表
-- 创建用户表
CREATE TABLE user(
user_id int primary key auto_increment,
username varchar(20) unique,
password varchar(32)
);
-- 添加数据
INSERT INTO user(username,password) values('Tom','123'),('Jerry','234');
SELECT * FROM user;
3)IDEA连接数据库
打开IDEA右侧栏Database选项:添加数据源,选择来自mysql,输入mysql的用户名、密码、数据库的名字,测试连接,显示绿色的对号,表示可以连接,点击apply、OK。
4)pom.xml中添加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>8.0.33</version>
</dependency>
5)创建User实体类
查询的结果需要封装到User对象,所以需要一个User类,放到pojo文件夹里。
package com.example.pojo;
public class User{
private Long id;
private String username;
private String password;
public User() {
}
public User(Long id, String username, String password) {
this.id = id;
this.username = username;
this.password = password;
}
public Long getId() {
return id;
}
public void setId(Long 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 + '\'' +
'}';
}
}
6)创建UserMapper.xml映射文件
在resources下创建多层目录,注意要使用/分割(不能用.):resources下新建文件夹com/example/mapper,再创建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.example.mapper.UserMapper">
<resultMap id="UserResult" type="com.example.pojo.User">
<id property="id" column="user_id"/>
<result property="username" column="username"/>
<result property="password" column="password"/>
</resultMap>
<select id="selectUser" resultMap="UserResult">
select *
from user
where username=#{username} and password=#{password};
</select>
</mapper>
<Mapper>元素的namespace属性应该与对应的映射器接口的全限定名相同。
<ResultMap>元素用于定义如何从数据库结果集映射到 Java 对象。这里定义了一个名为UserResult的结果映射,它将 user_id列映射到User 对象的id属性,username 列映射到 username属性,以及password列映射到password属性。
<Select>元素用于定义 SQL 查询语句。id 属性应该与映射器接口中的方法名相同,resultMap属性指定了用于映射结果集的结果映射的 ID。SQL 语句中的#{id}是一个占位符,它将被传递给 selectUser方法的参数值替换。
7)创建UserMapper接口
package com.example.mapper;
import com.example.pojo.User;
import org.apache.ibatis.annotations.Param;
public interface UserMapper{
User selectUser(@Param("username")String username, @Param("password")String password);
}
传参:如果方法接受多个参数,需要使用@Param注解来明确指定每个参数的名称,这样在XML映射文件中就可以通过指定的名称来引用这些参数。
8)创建MyBatis的配置文件
MyBatis再一个project中只需要一个配置文件。
<?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.example.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:///web?useSSL=false&useServerPrepStmts=true"/>
<property name="username" value="root"/>
<property name="password" value="111111"/>
</dataSource>
</environment>
</environments>
<mappers>
<!--扫描mapper-->
<package name="com.example.mapper"/>
</mappers>
</configuration>
实体类所在位置、数据库名称、用户名、密码改成自己的。
9)创建LoginServlet、创建SuccessServlet
接收参数、处理请求、给予响应,使用注解配置。
传来的是Post请求,重写doPost方法:
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取参数
String username = request.getParameter("username");
String password = request.getParameter("password");
//使用MyBatis查询数据表,如果用传来的参数能查到User对象,则成功登录
//MyBatis的使用步骤
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);//反射:
//MyBatis使用反射机制动态地生成该接口的代理实现。
User user = userMapper.selectUser(username, password);
sqlSession.close();
//进行响应
response.setContentType("text/html;charset=utf-8");
PrintWriter writer=response.getWriter();
if (user!=null){
request.setAttribute("username",username);
request.getRequestDispatcher("/SuccessServlet").forward(request,response);
}else {
writer.write("登录失败");
}
}
}
在这个 Servlet 类中,使用 @WebServlet("/login")
注解来指定该 Servlet 的访问 URL。这意味着当用户访问 /login
URL 时,Servlet 容器会自动实例化并调用这个 Servlet。
@WebServlet("/SuccessServlet")
public class SuccessServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = (String) request.getAttribute("username");
response.setContentType("text/html;charset=utf-8");
response.getWriter().write(username+",欢迎回来!");
}
}
原始请求是POST请求,所以目标Servlet中重写doPost方法。
10)整体目录结构
11)启动Tomcat
访问
转发:浏览器的地址栏不变