1、目标
编写一个基于java用于软件测试的商品系统(软件测试就测试吧,为什么还要我写个程序)。
数据库基于MySQL,CRUD操作通过JDBC实现的。
使用到的工具有Idea,Navicat for MySQL。
2、需求和可行性分析
JSP实现网页的动态数据显示,Servlet用来处理数据和请求响应。用到了一些MVC的概念,把实体类、控制、数据库操作拆开来调用实现解耦合。
增删改查用到了JDBC,java提供的一套用来操作数据库的api。增删改查要写简单的SQL语句,其实我感觉不会SQL语句也可以,数据库可视化管理工具挺好用的。
前端网页的显示有三大块,登录界面、后台数据管理、商品信息展示。实现的功能有根据权限进行登录、购物车进行购物、后台数据管理。
3、功能实现
1、登录功能的实现
登录的功能是让Servlet接收到前端提交的数据后,根据输入的账号和密码在数据库中进行检索。如果存在Servlet就会将页面跳转到后台数据管理界面,否则就让前端显示登录失败的错误信息。
创建一个登录用的JSP页面
<%--
Created by IntelliJ IDEA.
User: Lenovo
Date: 2023/6/20
Time: 20:32
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
String str;
if (session.getAttribute("info") == null) {
str = "";
} else {
str = (String) session.getAttribute("info");
}
%>
<html lang="zh">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>登录页面</title>
<style>
* {
margin: 0;
padding: 0;
}
html {
height: 100%;
}
body {
height: 100%;
}
.container {
height: 100%;
background-image: linear-gradient(110deg, #082516, #041538);
}
.login-wrapper {
background-color: #fbf1f1;
width: 400px;
height: 500px;
border-radius: 50px;
padding: 0 50px;
position: relative;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
}
.header {
font-size: 60px;
font-weight: 900;
text-align: center;
line-height: 120px;
}
.input-item {
display: block;
width: 100%;
margin-bottom: 20px;
border: 0;
padding: 10px;
border-bottom: 1px solid rgb(128, 125, 125);
font-size: 15px;
outline: none;
}
.input-item::placeholder {
text-transform: uppercase;
}
.btn {
text-align: center;
padding: 10px;
width: 100%;
margin-top: 40px;
background-image: linear-gradient(to right, #041538, #082516);
color: #fff;
}
.msg {
text-align: center;
line-height: 88px;
}
a {
text-decoration-line: none;
color: #abc1ee;
}
</style>
</head>
<body>
<form action="login" method="get">
<div class="container">
<div class="login-wrapper">
<div class="header">Login</div>
<div class="form-wrapper">
<input type="text" name="userid" placeholder="账户名" class="input-item">
<input type="password" name="password" placeholder="密码" class="input-item">
<div class="btn"><input type="submit" value="点击登录" style="border:0px;background:none;color:#fff"></div>
<%-- //设置一个内嵌CSS样式给input提交标签--%>
<div class="btn"><input type="button" value="返回商品信息浏览页" style="border:0px;background:none;color:#fff" onclick="location='showinfoTwo.jsp'"></div>
<div class="btn"><input type="button" value="忘记密码" style="border:0px;background:none;color:#fff" onclick="location='updatePassWord.jsp'"></div>
<p style="color: red"><%=str%>
</p>
</div>
<div class="msg">
</div>
</div>
</div>
</form>
</body>
</html>
>
创建一个dao包,并创建一个类用来进行数据库操作。
这个类完成后可能有一些问题要注意下。是否导入对应于JDK版本的数据库连接驱动包。数据库的地址,账号,密码是否有问题。电脑上的MySql数据库是否处在正常工作状态。
package com.liao.dao;
import com.liao.entity.Product;
import com.liao.entity.User;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
public class Db {
public void add(Product product) { //添加商品信息
Connection connection = null;
PreparedStatement preparedStatement = null;
Product p = null;
List<Product> products = new ArrayList<>();
try {
//加载驱动
Class.forName("com.mysql.jdbc.Driver");
//获取链接
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/products", "root", "root");
//获取预处理块
preparedStatement = connection.prepareStatement("insert into product(name,price,number)values (?,?,?)"); //
preparedStatement.setString(1, product.getName());
preparedStatement.setInt(2, product.getPrice());
preparedStatement.setInt(3, product.getNumber());
preparedStatement.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
preparedStatement.close();
connection.close();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
} //添加商品信息
public void delete(String name) { //删除商品信息
Connection connection = null;
PreparedStatement preparedStatement = null;
Product p = null;
List<Product> products = new ArrayList<>();
try {
//加载驱动
Class.forName("com.mysql.jdbc.Driver");
//获取链接
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/products", "root", "root");
//获取预处理块
preparedStatement = connection.prepareStatement("delete from product where name=?"); //删除user表中name为?的信息
preparedStatement.setString(1, name);//设置第一个?的值 然后进行删除操作
preparedStatement.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
preparedStatement.close();
connection.close();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
} //删除商品信息
public void update(Product product) {
Connection connection = null;
PreparedStatement preparedStatement = null;
Product p = null;
try {
//加载驱动
Class.forName("com.mysql.jdbc.Driver");
//获取链接
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/products", "root", "root");
System.out.println(connection);
//获取预处理块
preparedStatement = connection.prepareStatement("UPDATE product SET number = ? WHERE name = ? ");
preparedStatement.setInt(1, product.getNumber());
preparedStatement.setString(2, product.getName());
preparedStatement.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
preparedStatement.close();
connection.close();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}//更新商品信息
public List<Product> findAll() { //获取所有商品信息
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
Product p = null;
List<Product> products = new ArrayList<>();
try {
//加载驱动
Class.forName("com.mysql.jdbc.Driver");
//获取链接
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/products?useUnicode=true&characterEncoding=utf8", "root", "root");
System.out.println(connection);
//获取预处理块
preparedStatement = connection.prepareStatement("select * from product");
resultSet = preparedStatement.executeQuery();
//从resultSet从获取获取结果值
while (resultSet.next()) {
System.out.println("对从数据库获取的数据进行装载");
p = new Product(resultSet.getString("name"), resultSet.getInt("number"), resultSet.getInt("price"));
products.add(p);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
preparedStatement.close();
resultSet.close();
connection.close();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
return products;
} //查询所有商品信息
public Product findOne(String name) { //根据商品信息查询商品
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
Product p = null;
try {
//加载驱动
Class.forName("com.mysql.jdbc.Driver");
//获取链接
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/products", "root", "root");
System.out.println(connection);
//获取预处理块
preparedStatement = connection.prepareStatement("select * from product where name=?");
preparedStatement.setString(1, name);
resultSet = preparedStatement.executeQuery();
//从resultSet从获取获取结果值
while (resultSet.next()) {
System.out.println("对从数据库获取的数据进行装载");
p = new Product(resultSet.getString("name"), resultSet.getInt("number"), resultSet.getInt("price"));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
preparedStatement.close();
resultSet.close();
connection.close();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
return p;
} //查询一个商品信息
public User findUser(User user) { //获取用户信息
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
User u = null;
try {
//加载驱动
Class.forName("com.mysql.jdbc.Driver");
//获取链接
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/products", "root", "root");
//获取预处理块
preparedStatement = connection.prepareStatement("select * from user where id=? and password=?");
preparedStatement.setInt(1,user.getUserid());
preparedStatement.setInt(2,user.getPassword());
resultSet = preparedStatement.executeQuery();
System.out.println("==================================================");
while (resultSet.next()) {
System.out.println("对从数据库获取的数据进行装载"); //如果数据库中未找到匹配的账户和密码,数据库将返回一个空结果,servlet中如果判空则显示登录失败
u = new User(resultSet.getInt("power"), resultSet.getInt("id"), resultSet.getInt("password"));
System.out.println(resultSet.getInt("power"));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
preparedStatement.close();
resultSet.close();
connection.close();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
return u;
} //查询用户信息
public User findUser(int id,int power) { //根据账号和手机号获取用户信息
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
User u = null;
try {
//加载驱动
Class.forName("com.mysql.jdbc.Driver");
//获取链接
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/products", "root", "root");
//获取预处理块
preparedStatement = connection.prepareStatement("select * from user where id=? and power=?");
preparedStatement.setInt(1,id);
preparedStatement.setInt(2,power);
resultSet = preparedStatement.executeQuery();
System.out.println("==================================================");
while (resultSet.next()) {
System.out.println("对从数据库获取的数据进行装载"); //如果数据库中未找到匹配的账户和密码,数据库将返回一个空结果,servlet中如果判空则显示登录失败
u = new User(resultSet.getInt("power"), resultSet.getInt("id"), resultSet.getInt("password"));
System.out.println(resultSet.getInt("power"));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
preparedStatement.close();
resultSet.close();
connection.close();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
return u;
} //根据手机号和账号获取用户信息
public void update(User user){
Connection connection = null;
PreparedStatement preparedStatement = null;
Product p = null;
try {
//加载驱动
Class.forName("com.mysql.jdbc.Driver");
//获取链接
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/products", "root", "root");
System.out.println(connection);
//获取预处理块
preparedStatement = connection.prepareStatement("UPDATE user SET password = ? WHERE id = ? ");
preparedStatement.setInt(1, user.getPassword());
preparedStatement.setInt(2, user.getUserid());
preparedStatement.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
preparedStatement.close();
connection.close();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}
}
编写一个Servlet用来进行控制
package com.liao.control;
import com.liao.dao.Db;
import com.liao.entity.User;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
@WebServlet(name = "Servlet_Login", value = "/Servlet_Login")
public class Servlet_Login extends HttpServlet {
Db dbControl = new Db();
User userControl = null;
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/**
2023.6.20: 今日完成数据库商品对象的操作方法,并开始编写登录界面的servlet和jsp页面
在该登录方法中要实现普通用户和管理员操作的区别,具体实现方法是给用户对象设置一个权限值,当值为1为管理员,为0则为普通用户
*/
/**
2023.6.21:
今日开始编写登录逻辑和登录界面
*/
User user = new User(Integer.parseInt(request.getParameter("userid")), Integer.parseInt(request.getParameter("password")));//创建一个前端传递的用户对象给数据库进行查找
userControl = dbControl.findUser(user);//服务器内部的用户对象
if (userControl == null) {
request.setAttribute("info", "用户名或密码错误");
request.getRequestDispatcher("login.jsp").forward(request, response);
} else {
request.getRequestDispatcher("infoMange.jsp").forward(request, response);
}
}
}
我草,好累,不想写了。直接放代码吧,我懒狗。
后记
这是很久以前我写过的一个作业,当时真是啥也不会感觉。自己在B站学了一个星期的JSP后把这个简单的系统实现出来了。希望这个小系统能给后来的同学提供一些参考。