在业务中,用户数据都是存储在数据库里
#判断存在即删除数据库
drop database if exists mydb;
#创建数据库
create database mydb;
#使用数据库
use mydb;
#创建表
create table t_user
(
uid int primary key auto_increment,
username varchar(20),
password varchar(20),
phone varchar(11),
address varchar(50)
);
insert into t_user(username,password,phone,address) values('张三','666','18965423548','南阳');
insert into t_user(username,password,phone,address) values('李四','333','18754263548','许昌');
insert into t_user(username,password,phone,address) values('小美','123','18565234759','信阳');
create table t_goods
(
gid int primary key auto_increment,
gname varchar(20),
price double,
mark varchar(100)
);
insert into t_goods(gname,price,mark) values('泡面',4.5,'够香够辣就是这个味!');
insert into t_goods(gname,price,mark) values('火腿',8.5,'肉质细腻Q弹!');
insert into t_goods(gname,price,mark) values('雪碧',3.5,'清爽冰凉随心爽!');
首先在IDEA上部署web项目,具体步骤参考上篇博客,
部署文件如下:
下面是首页的页面效果:
实现代码如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
主页
欢迎来到主页
登录
注册
我们点击登录,进入登录页面,
实现代码如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
登录
后面会用到在这个项目中常用的类GoodsDao,UserDaoImpl,JDBCUtil类代码先放在下面,后面很多操作需要用到这两个类的方法
GoodsDao类:
package com.wang.dao.impl;
import com.wang.Bean.Goods;
import com.wang.Bean.User;
import com.wang.util.JDBCUtil;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
public class GoodsDao {
Goods goods=null; // 声明一个 Goods 对象,初值为 null
Connection con=null; // 声明一个 Connection 对象,初值为 null
PreparedStatement pstm=null; // 声明一个 PreparedStatement 对象,初值为 null
ResultSet rs = null; // 声明一个 ResultSet 对象,初值为 null
List goodslist=null; // 声明一个 List 对象,初值为 null
int row =0;
// 定义一个方法 shopping,返回一个 List 对象
public List shopping(){
try {
con = JDBCUtil.getCon(); // 调用 JDBCUtil 的静态方法,获取数据库连接
String sql ="select * from t_goods"; // 定义 SQL 语句,查询所有商品
pstm = con.prepareStatement(sql); // 创建 PreparedStatement 对象,执行 SQL 语句
rs = pstm.executeQuery(); // 执行 SQL 查询,获取查询结果集
goodslist= new ArrayList<>(); // 创建 ArrayList 对象,存储查询结果
while (rs.next()){ // 遍历查询结果集
goods=new Goods(); // 创建一个新的 Goods 对象
goods.setGid(rs.getInt("gid")); // 从查询结果中获取 gid 值,设置给 Goods 对象
goods.setGname(rs.getString("gname")); // 从查询结果中获取 gname 值,设置给 Goods 对象
goods.setPrice(rs.getDouble("price")); // 从查询结果中获取 price 值,设置给 Goods 对象
goods.setMark(rs.getString("mark")); // 从查询结果中获取 mark 值,设置给 Goods 对象
goodslist.add(goods); // 将 Goods 对象添加到 ArrayList 中
}
} catch (Exception e) { // 捕获所有异常
e.printStackTrace(); // 打印异常信息
}finally {
try {
JDBCUtil.colse(rs,pstm,con); // 调用 JDBCUtil 的静态方法,关闭 ResultSet、PreparedStatement 和 Connection 对象
} catch (Exception e) {
e.printStackTrace(); // 打印异常信息
}
}
return goodslist; // 返回查询结果,即 ArrayList 对象
}
public int add(Goods goods){
con = JDBCUtil.getCon();
String sql = "insert into t_goods(gname,price,mark) values(?,?,?);";
try {
pstm=con.prepareStatement(sql);
pstm.setObject(1,goods.getGname());
pstm.setObject(2,goods.getPrice());
pstm.setObject(3,goods.getMark());
row = pstm.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
JDBCUtil.colse(pstm,con);
} catch (Exception e) {
e.printStackTrace();
}
}
return row;
}
public int delete(int gid){
con = JDBCUtil.getCon();
String sql = "delete from t_goods where gid=?";
try {
pstm=con.prepareStatement(sql);
pstm.setObject(1,gid);
row = pstm.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
JDBCUtil.colse(pstm,con);
} catch (Exception e) {
e.printStackTrace();
}
}
return row;
}
public Goods selectById(int gid){
Goods goods=null;
try{
con= JDBCUtil.getCon();
String sql="select * from t_goods where gid=?";
pstm=con.prepareStatement(sql);
pstm.setObject(1,gid);
rs=pstm.executeQuery();
if (rs.next()){
//从结果集中获取数据,封装到Goods对象中
goods=new Goods();
goods.setGid(rs.getInt("gid"));
goods.setGname(rs.getString("gname"));
goods.setPrice(rs.getDouble("price"));
goods.setMark(rs.getString("mark"));
}
} catch (Exception e){
e.printStackTrace();
} finally {
try{
JDBCUtil.colse(pstm,con);
} catch (Exception e){
e.printStackTrace();
}
}
return goods;
}
public int update( Goods goods){
try {
con = JDBCUtil.getCon();
String sql="update t_goods set gname=?,price=?,mark=? where gid=?";
pstm=con.prepareStatement(sql);
pstm.setObject(1,goods.getGname());
pstm.setObject(2,goods.getPrice());
pstm.setObject(3,goods.getMark());
pstm.setObject(4,goods.getGid());
row = pstm.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
JDBCUtil.colse(pstm,con);
} catch (Exception e) {
e.printStackTrace();
}
}
return row;
}
}
UserDaoImpl类:
package com.wang.dao.impl;
import com.wang.Bean.User;
import com.wang.dao.UserDao;
import com.wang.util.JDBCUtil;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class UserDaoImpl implements UserDao {
// 数据库连接、用户信息、数据库操作等相关变量的声明
Connection con = null; // 数据库连接
User user = null; // 用户信息
PreparedStatement pstm = null; // 数据库操作
ResultSet rs = null; // 数据库查询结果
int row = 0; // 数据库受影响行数
@Override
public User Login(String username, String password) {
// 获取数据库连接
con = JDBCUtil.getCon();
// 定义 SQL 查询语句
String sql = "select * from t_user where username = ? and password =?";
try {
// 准备预处理 SQL 语句
pstm = con.prepareStatement(sql);
// 设置预处理参数,防止 SQL 注入攻击
pstm.setObject(1, username);
pstm.setObject(2, password);
// 执行 SQL 查询,并获取查询结果
ResultSet rs = pstm.executeQuery();
// 处理查询结果
if (rs.next()) {
user = new User();
user.setUid(rs.getInt("uid"));
user.setUsername(rs.getString("username"));
user.setPassword(rs.getString("password"));
user.setPhone(rs.getString("phone"));
user.setAddress(rs.getString("address"));
}
} catch (Exception e) {
// 处理异常
e.printStackTrace();
} finally {
try {
// 关闭数据库连接、释放资源
JDBCUtil.colse(rs, pstm, con);
} catch (Exception e) {
e.printStackTrace();
}
}
// 返回用户信息
return user;
}
@Override
public int register(User user) {
// 获取数据库连接
con = JDBCUtil.getCon();
// 定义 SQL 插入语句
String sql = "insert into t_user(username,password,phone,address) values(?,?,?,?)";
try {
// 准备预处理 SQL 语句
pstm = con.prepareStatement(sql);
// 设置预处理参数,防止 SQL 注入攻击
pstm.setObject(1, user.getUsername());
pstm.setObject(2, user.getPassword());
pstm.setObject(3, user.getPhone());
pstm.setObject(4, user.getAddress());
// 执行 SQL 插入操作,并获取操作结果
row = pstm.executeUpdate();
} catch (Exception e) {
// 处理异常
e.printStackTrace();
} finally {
try {
// 关闭数据库连接、释放资源
JDBCUtil.colse(pstm, con);
} catch (Exception e) {
e.printStackTrace();
}
}
// 返回插入结果
return row;
}
}
JDBCUtil类:
package com.wang.util; // 定义类所在的包
import java.sql.*; // 导入 Java SQL 相关的类
public class JDBCUtil { // 定义 JDBCUtil 类
static String driver = "com.mysql.cj.jdbc.Driver"; // 定义数据库驱动类名
static String url = "jdbc:mysql:///mydb?useSSL=false&serverTimezone=UTC"; // 定义数据库连接 URL
static String username = "root"; // 定义数据库用户名
static String password = "123"; // 定义数据库密码
static Connection conn = null; // 定义连接对象,初始值为 null
public static Connection getCon() { // 定义获取连接对象的方法
try {
Class.forName(driver); // 加载数据库驱动程序
conn = DriverManager.getConnection(url, username, password); // 获取连接对象
} catch (Exception e) { // 处理异常
e.printStackTrace();
}
return conn; // 返回连接对象
}
//资源回收方法
public static void colse(ResultSet rs, PreparedStatement pstm, Connection con) throws SQLException { // 定义关闭 ResultSet、PreparedStatement 和 Connection 对象的方法
if (rs != null) { // 如果 ResultSet 对象不为空
rs.close(); // 关闭 ResultSet 对象
}
if (pstm != null) { // 如果 PreparedStatement 对象不为空
pstm.close(); // 关闭 PreparedStatement 对象
}
if (con != null) { // 如果 Connection 对象不为空
con.close(); // 关闭 Connection 对象
}
}
public static void colse(PreparedStatement pstm, Connection con) throws SQLException { // 定义关闭 PreparedStatement 和 Connection 对象的方法
if (pstm != null) { // 如果 PreparedStatement 对象不为空
pstm.close(); // 关闭 PreparedStatement 对象
}
if (con != null) { // 如果 Connection 对象不为空
con.close(); // 关闭 Connection 对象
}
}
}
我们输入账号密码,点击确定时,我们要获取页面数据向Java发送Servlet请求进行判断,操作代码如下:
package com.wang.servlet;
import com.wang.Bean.User;
import com.wang.dao.impl.UserDaoImpl;
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 javax.servlet.http.HttpSession;
import java.io.IOException;
// 使用@WebServlet注解标记该类为Servlet,指定了Servlet的请求路径
@WebServlet("/denglu")
public class Login extends HttpServlet {
UserDaoImpl userDao = null; // 用户DAO实现类对象
User login = null; // 登录用户对象
// 处理Get请求
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp); // 将Get请求转发给doPost()方法处理
}
// 处理Post请求
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 设置请求和响应的编码格式
req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("utf-8");
// 设置响应的内容类型
resp.setContentType("text/html;charset=utf-8");
// 获取用户提交的用户名和密码
String username = req.getParameter("username");
String password = req.getParameter("password");
// 创建用户DAO实现类对象,通过该对象调用登录方法验证用户身份
userDao = new UserDaoImpl();
login = userDao.Login(username, password);
// 根据登录结果进行不同的响应
if (login != null) { // 登录成功
HttpSession session = req.getSession();
session.setAttribute("login",login);
req.getRequestDispatcher("SelectAllGoods").forward(req,resp); //请求别的servlet做后续操作
} else { // 登录失败
req.setAttribute("error_msg","用户名或密码错误!");
req.getRequestDispatcher("error.jsp").forward(req,resp);
}
}
}
登录效果如下动图
当用户输入错误的密码或账号时,跳转错误页面,错误页面代码如下
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
${error_msg}
返回登录