commons-logging-1.2.jar 下载。说明:用来记录程序运行时的活动的日志记录。
druid-1.0.9.jar下载地址。说明:Druid是一个数据库连接池,可以用来创建数据库连接池对象。
mchange-commons-java-0.2.12.jar下载。说明:C3P0数据库连接池依赖架包
mysql-connector-java-5.1.37.jar下载。说明:MySQL驱动架包
Spring 框架部分架包:
spring-core
和spring-beans
模块提供了框架的基础结构部分,包含控制反转和依赖注入功能。spring-jdbc
模块提供了JDBC抽象层,不需要再编写单调的JDBC代码,解析数据库提供商指定的错误编码。spring-tx
模块为实现指定接口和所有的简单Java对象的类提供编程式和声明式的业务管理。创建项目(RequestExample),导入架包到web/WEB-INF/lib
目录下
创建html页面:login.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>用户登录</title>
</head>
<body>
<form action="" method="post">
用户名:<label><input type="text" name="username"></label><br>
密码:<label><input type="password" name="password"></label><br>
<input type="submit" value="登录">
</form>
</body>
</html>
创建数据库连接池的配置文件:driud.properties
# 数据库连接池类全名称
driverClassName=com.mysql.jdbc.Driver
# 连接数据库的URL——jdbc:mysql://MySQL地址/数据库名
url=jdbc:mysql://127.0.0.1:3306/Study
# 数据库用户名
username=用户名
# 数据库密码
password=密码
# 数据库连接池初始化连接数
initialSize=5
# 数据库连接池最大连接数
maxActive=10
# 最大等待时间(毫秒为单位)
maxWait=3000
创建数据表:
USE Study;
CREATE TABLE users(
-- 用户id为主键,主键值自增。
id INT PRIMARY KEY AUTO_INCREMENT,
-- 用户名唯一,且非空。
username VARCHAR(32) UNIQUE NOT NULL,
-- 用户密码非空
userPassword VARCHAR(32) NOT NULL
);
INSERT INTO users(username, userPassword) VALUES(LeeHua, 2018520), (Rainbow, 20201314);
创建一个用户实体类,用该实体类数据类型来存储用户信息:user.domain.User.java
package user.domain;
/** @Description: 用户实体类 */
public class User {
private int id;
private String username;
private String userPassword;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getUserPassword() {
return userPassword;
}
public void setUserPassword(String userPassword) {
this.userPassword = userPassword;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username=‘" + username + ‘\‘‘ +
", userPassword=‘" + userPassword + ‘\‘‘ +
‘}‘;
}
}
创建一个Jdbc工具类,用来获取数据库连接池对象:JdbcUtil.java
package user.util;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.InputStream;
import java.util.Properties;
public class JdbcUtil {
private static DataSource dataSource;
static {
try {
// 获取加载配置文件的对象
Properties properties = new Properties();
// 获取类的类加载器
ClassLoader classLoader = JdbcUtil.class.getClassLoader();
// 获取druid-1.0.9.properties配置文件资源输入流
InputStream resourceAsStream = classLoader.getResourceAsStream("druid.properties");
// 加载配置文件
properties.load(resourceAsStream);
// 获取连接池对象
dataSource = DruidDataSourceFactory.createDataSource(properties);
} catch (Exception e) {
e.printStackTrace();
}
}
public static DataSource getDataSource() {
return dataSource;
}
}
创建操作数据库users表中的类:UserDao.java
package user.dao;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import user.domain.User;
import user.util.JdbcUtil;
public class UserDao {
/** 创建JdbcTemplate对象,需要传入数据库连接池对象。 */
private JdbcTemplate template = new JdbcTemplate(JdbcUtil.getDataSource());
/**
* 登录方法
* @param loginUser 只有用户名的密码
* @return 用户全部数据
*/
public User login(User loginUser) {
try {
// 定义预编译SQL语句
String sql = "SELECT * FROM users WHERE username = ? AND userPassword = ?";
// 查询结果,将结果封装为对象
User user = template. queryForObject(
sql,
// 将查询到的结果封装为 User 自定义数据结构
new BeanPropertyRowMapper<User>(User.class),
// 传入预编译sql语句的参数
loginUser.getUsername(),
loginUser.getUserPassword()
);
return user; // 查询到有对应的用户数据,返回数据
} catch (DataAccessException e) {
e.printStackTrace();
return null; // 查询不到对应的用户数据,返回null
}
}
}
创建三个servlet类:获取用户请求信息是否正确类、用户登录成功类、用户登录失败类
用户登录成功类:SuccessServlet.java
package web.servlet;
import user.domain.User;
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;
@WebServlet("/web/servlet/successServlet")
public class SuccessServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 获取request域中共享的user对象
User user = (User) request.getAttribute("username");
if (user != null) {
// 设置编码
response.setContentType("text/html;charset=utf-8");
// 输出
response.getWriter().write("登录成功。"+ user.getUsername() +",欢迎您!");
}
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doGet(request, response);
}
}
用户登录失败类:FailServlet.java
package web.servlet;
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;
@WebServlet("/web/servlet/failServlet")
public class FailServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 设置编码
response.setContentType("text/html;charset=utf-8");
// 输出
response.getWriter().write("登录失败,用户名或密码错误!");
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doGet(request, response);
}
}
获取用户请求信息是否正确类:LoginServlet.java
package web.servlet;
import user.dao.UserDao;
import user.domain.User;
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;
@WebServlet("/web/servlet/loginServlet")
public class LoginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 设置编码
request.setCharacterEncoding("utf-8");
// 获取请求参数
String username = request.getParameter("username");
String userPassword = request.getParameter("userPassword");
// 封装User对象(将获取到的请求参数封装到自定义数据类型中)
User loginUser = new User();
loginUser.setUsername(username);
loginUser.setUserPassword(userPassword);
// 创建UserDao,来操作数据库users表
UserDao userDao = new UserDao();
// 查询users表中是否存在请求的username和userPassword的一组数据
User user = userDao.login(loginUser);
if (user == null) {
// 不存在这组数据,登录失败。
// 将 request, response 传给 FailServlet.java
request.getRequestDispatcher("/web/servlet/failServlet").forward(request, response);
} else {
// 存在这组数据,登录成功
// 设置请求属性 ‘user‘:user
request.setAttribute("username", loginUser);
// 将 request, response 传给 SuccessServlet.java
request.getRequestDispatcher("/web/servlet/successServlet").forward(request, response);
}
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doGet(request, response);
}
}
编写login.html文件指定的servlet文件路径:
<form action="/RequestExample_war_exploded/web/servlet/loginServlet" method="post">
修改该行即可。
上面基本的实现已经完成,下面进行测试
启动服务器,浏览器访问:http://localhost:8080/RequestExample_war_exploded/login.html
输入正确的用户名和密码:
数据表中的数据如下:
登录,跳转到页面:http://localhost:8080/RequestExample_war_exploded/web/servlet/loginServlet
如果输入的账号密码,在数据库中没有一组与之对应的用户数据,那么会跑出错误,且页面也会跳转到:http://localhost:8080/RequestExample_war_exploded/web/servlet/loginServlet
跳转后的页面:
原文:https://www.cnblogs.com/liyihua/p/12942961.html