jdbc+servlet+jsp搭建项目实现登录
一、创建数据库
DROP TABLE IF EXISTS `db_admin`;
CREATE TABLE `t_user` (
`id` int(4) NOT NULL AUTO_INCREMENT,
`username` varchar(200) DEFAULT NULL,
`password` varchar(200) DEFAULT NULL,
`name` varchar(200) DEFAULT NULL,
`sex` int(4) DEFAULT NULL,
`birthday` datetime DEFAULT NULL,
`phone` varchar(200) DEFAULT NULL,
`email` varchar(200) DEFAULT NULL,
`address` varchar(200) DEFAULT NULL,
`head_image_url` varchar(200) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
[添加一条数据]
二、开始使用STS创建项目
1、新建web项目
file->new->other->dynamic web project
generate web.xml deployment description,会在WEB-INF自动生成web.xml文件
2、新建完成目录结构
3、开始配置Tomcat
配置步骤:window===>preference==>server=====>runtime Environments=====add(本地目录的tomcat地址)
参考博客链接:https://blog.csdn.net/weixin_44176169/article/details/103054621
4、导入MySQL驱动文件
在WEB-INF下的lib文件导入MySQL驱动
全选中所需的依赖包,右键->build path->add build path就可以将依赖包添加到项目中
5、准备登录页面
样式文件放在网盘下,请自取:
百度网盘:https://pan.baidu.com/s/1huNNspLgl2IlEcXJfNgS9g
提取码:b7hj
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
pageContext.setAttribute("path", path);
%>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>AdminLTE 3 | Log in (v2)</title>
<!-- Google Font: Source Sans Pro -->
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,400i,700&display=fallback">
<!-- Font Awesome -->
<link rel="stylesheet" href="${path }/static/css/plugins/fontawesome-free/css/all.min.css">
<!-- icheck bootstrap -->
<link rel="stylesheet" href="${path }/static/css/plugins/icheck-bootstrap/icheck-bootstrap.min.css">
<!-- Theme style -->
<!-- Theme style -->
<link rel="stylesheet" href="${path }/static/css/plugins/adminlte/css/adminlte.min.css">
</head>
<body class="hold-transition login-page">
<div class="login-box">
<!-- /.login-logo -->
<div class="card card-outline card-primary">
<div class="card-header text-center">
<a href="#" class="h1"><b>权限</b>管理系统</a>
</div>
<div class="card-body">
<p class="login-box-msg">用户登录</p>
<form action="${path }/login" method="post">
<div class="input-group mb-3">
<input type="text" class="form-control" name="username" placeholder="用户名">
<div class="input-group-append">
<div class="input-group-text">
<span class="fas fa-user"></span>
</div>
</div>
</div>
<div class="input-group mb-3">
<input type="password" class="form-control" name="password" placeholder="密码">
<div class="input-group-append">
<div class="input-group-text">
<span class="fas fa-lock"></span>
</div>
</div>
</div>
<div class="row">
<div class="col-8">
<div class="icheck-primary">
<input type="checkbox" id="remember">
<label for="remember">
记住我
</label>
</div>
</div>
<!-- /.col -->
<div class="col-4">
<button type="submit" class="btn btn-primary btn-block">登录</button>
</div>
<!-- /.col -->
</div>
</form>
</div>
<!-- /.card-body -->
</div>
<!-- /.card -->
</div>
<!-- /.login-box -->
<!-- jQuery 3 -->
<script src="${path }/static/js/jquery.js"></script>
<!-- Bootstrap 4 -->
<script src="${path }/static/css/plugins/bootstrap/js/bootstrap.bundle.min.js"></script>
<!-- AdminLTE App -->
<script src="${path }/static/css/plugins/adminlte/js/adminlte.min.js"></script>
</body>
</html>
6、准备登录成功页面
index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>欢迎 <%
Object object=session.getAttribute("username");
if(object!=null) {
out.print(object.toString());
}%>登录成功</h1>
</body>
</html>
7、准备登录失败页面
error.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
对不起,登陆失败!
</body>
</html>
三、开始写Java代码
1.创建mvc项目结构
2.开始编写MVC模式
(1)编写数据库连接工具
方法一:
创建jdbc.properties文件方式
创建连接工具类。
遇到报异常:java.lang.NoClassDefFoundError: Could not initialize class www.demo.jdbc.utils.JdbcUtils
参考文章:https://www.cnblogs.com/yadongliang/p/7920053.html可以解决
package com.wyl.web.utils;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;
public class Dbutil {
//注意:加上绝对路径找到jdbc.properties文件
/**
*Xxx.class.getResourceAsStream(String name);
* 文件放在任意package下
* a.如果同级目录name写作:"xxx.properties";
* b.如果在另一package下name写作"../xxpackage/xxx.properties"
*参考文章:https://www.cnblogs.com/yadongliang/p/7920053.html
*/
private static Properties prop = Proputil.getProp("/www/demo/jdbc/jdbc.properties");
private static String username = prop.getProperty("username");
private static String password = prop.getProperty("password");
private static String url = prop.getProperty("url");
private static String driver = prop.getProperty("driver");
static {
try {
Class.forName(driver);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
//创建连接
public static Connection getCon() {
Connection con = null;
try {
con = DriverManager.getConnection(url, username, password);
} catch (SQLException e) {
e.printStackTrace();
}
return con;
}
/**
* 关闭Connection con,PreparedStatement ps,ResultSet rs对象
* @param con
* @param ps
* @param rs
*/
public static void close(ResultSet rs,PreparedStatement ps,Connection con) {
try {
if(rs != null)rs.close();
if(ps != null)ps.close();
if(con != null)con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
创建Proputil类
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
public class Proputil {
private static Properties prop;
public static Properties getProp(String path) {
InputStream is = Proputil.class.getResourceAsStream(path);
if(prop == null) {
prop = new Properties();
}
try {
prop.load(is);
} catch (IOException e) {
e.printStackTrace();
}
return prop;
}
}
创建jdbc.properties
username=root
password=123456
url=jdbc:mysql://127.0.0.1:3306/db_admin
driver=com.mysql.jdbc.Driver
方法二:
在同一个类中编写连接信息
public class Dbutil {
//定义一个方法来获取数据库的连接
public static Connection getConn() {
//初始化数据库连接对象conn
Connection conn = null;
//利用try...catch处理异常
try {
//注册数据库驱动
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
try {
//开始连接自己的数据库
//db_admin是数据库名称
//root 一般不需要修改
//password:修改为自己数据库的密码
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db_admin",
"root",
"123456");
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
}
3.编写实体层entity
package www.demo.jdbc.entity;
import java.util.Date;
import java.util.List;
public class User {
private int id;
private String username;
private String password;
private String name;
private int sex;
private Date birthday;
private String phone;
private String email;
private String address;
private String headImageUrl;
public User() {
}
public User(int id, String username, String password, String name, int sex, Date birthday, String phone,
String email, String address, String headImageUrl) {
super();
this.id = id;
this.username = username;
this.password = password;
this.name = name;
this.sex = sex;
this.birthday = birthday;
this.phone = phone;
this.email = email;
this.address = address;
this.headImageUrl = headImageUrl;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
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 getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int getSex() {
return sex;
}
public void setSex(int sex) {
this.sex = sex;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getHeadImageUrl() {
return headImageUrl;
}
public void setHeadImageUrl(String headImageUrl) {
this.headImageUrl = headImageUrl;
}
@Override
public String toString() {
return "User [id=" + id + ", username=" + username + ", password=" + password + ", name=" + name + ", sex="
+ sex + ", birthday=" + birthday + ", phone=" + phone + ", email=" + email + ", address=" + address
+ ", headImageUrl=" + headImageUrl + "]";
}
}
4.编写dao层接口
package www.demo.jdbc.dao;
/**
* 功能描述
* 这里存放的是我们所有的用户表的方法,
* @作者 WYuLin
* @time 2022年6月6日
* @version 1.0
*/
public interface UserDao {
User login(String username, String password);
}
5.编写dao层的实现类放在impl包下
package www.demo.jdbc.dao.impl;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import www.demo.jdbc.dao.UserDao;
import www.demo.jdbc.entity.User;
import www.demo.jdbc.utils.Dbutil;
public class UserDaoImpl implements UserDao {
/*
* 传入username,和password用于获取user
*/
@Override
public User login(String username, String password) {
Connection con = null;//创建数据库连接对象
PreparedStatement ps = null;//创建一个PreparedStatement 对象stmt 用来传输sql语句
ResultSet rs = null;//创建一个ResultSet集合对象 来接受stmt.executeQuery();返回的符合条件的所有对象的集合
User user = null;
List<User> users = new ArrayList<User>();
try {
con = Dbutil.getCon();
String sql = "select * from t_user where username = ? and password = ?";
ps = con.prepareStatement(sql);
ps.setString(1, username);
ps.setString(2, password);
rs = ps.executeQuery();
while(rs.next()) {
user = new User();
user.setId(rs.getInt("id"));
user.setUsername(username);
user.setPassword(password);
user.setName(rs.getString("name"));
user.setSex(rs.getInt("sex"));
user.setBirthday(rs.getDate("birthday"));
user.setPhone(rs.getString("phone"));
user.setEmail(rs.getString("email"));
user.setAddress(rs.getString("address"));
user.setHeadImageUrl(rs.getString("head_image_url"));
users.add(user);
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
Dbutil.close(rs, ps, con);
}
return user;
}
}
6.编写servlet层
package www.demo.jdbc.web;
import java.io.IOException;
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 www.demo.jdbc.dao.UserDao;
import www.demo.jdbc.dao.impl.UserDaoImpl;
@WebServlet("/login")
public class LoginServlet extends HttpServlet{
UserDao userDao = new UserDaoImpl();
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("进入到dopost方法");
//这里我们为了简单可以在doPost中调用doGet
doGet(request, response);
//这里是设置数据库获取到的数据的字符集,不设置可能会导致获取的数据是乱码
request.setCharacterEncoding("utf-8");
//从数据库获取用户名和密码
String username = request.getParameter("username");
String psssword = request.getParameter("password");
//这里我们直接调用service层的方法,不必再去调用dao层的方法
// userService user = new userServiceImpl();
//开始对获取的结果进行判断
if ((userDao.login(username, psssword)) != null) {
//登录成功
//这里我们设置了一个会话来存放我们获取到的用户名,一会我们将会把用户名渲染到页面当中
request.getSession().setAttribute("username", username);
//登录成功,采用转发的方式到登录成功的页面,当然也可使用重定向
request.getRequestDispatcher("/index.jsp").forward(request, response);
} else {
//登录失败,转发到登录失败页面...
request.getRequestDispatcher("/error.jsp").forward(request, response);
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
四、测试成功实现登录
login.jsp将放在与web-inf同级目录下,因为WEB-INF是Java的WEB应用的安全目录。所谓安全就是客户端无法访问,只有服务端可以访问的目录。如果想在页面中直接访问其中的文件,必须通过web.xml文件对要访问的文件进行相应映射才能访问。
访问登录地址:localhost:端口号/项目名/login.jsp
finished !!
五、总结
不足之处:
1、没有集成filter过滤器。
2、访问权限并没有配置
详见:Java中Servlet Filter拦截器详解http://www.51gjie.com/javaweb/867.html
otected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
## 四、测试成功实现登录
login.jsp将放在与web-inf同级目录下,因为WEB-INF是Java的WEB应用的安全目录。所谓安全就是客户端无法访问,只有服务端可以访问的目录。如果想在页面中直接访问其中的文件,必须通过web.[xml文件](https://baike.baidu.com/item/xml文件/1994443)对要访问的文件进行相应映射才能访问。
访问登录地址:localhost:端口号/项目名/login.jsp
## 五、总结
不足之处:
1、没有集成filter过滤器。
2、访问权限并没有配置
详见:Java中Servlet Filter拦截器详解http://www.51gjie.com/javaweb/867.html