技术支持:JAVA、JSP
服务器:TOMCAT 7.0.86
编程软件:IntelliJ IDEA 2021.1.3 x64
前文三篇登录和注册功能的实现
基于JSP、java、Tomcat、mysql三层交互的项目实战--校园交易网(1)-项目搭建(前期准备工作)-CSDN博客基于JSP、java、Tomcat、mysql三层交互的项目实战--校园交易网(2)登录,注册功能实现_jsp与java交互-CSDN博客基于JSP、java、Tomcat三者的项目实战--校园交易网(2)登录,注册功能实现-CSDN博客
基于JSP、java、Tomcat三者的项目实战--校园交易网(3)主页-CSDN博客
主页中我们其实看到了许多功能,我们先来说说
由于这么多功能,集中在这一个网页中,所以我也不水字数,主页的JSP文件在这篇博客中
基于JSP、java、Tomcat三者的项目实战--校园交易网(3)主页-CSDN博客https://blog.csdn.net/m0_64056556/article/details/140730309?spm=1001.2014.3001.5501
首先,我们是将所有的商品放在我的sdjyy的数据库中,接下来新建一个名为goods的数据表,里面的属性分别为name和price,同样的这个操作我在上面一篇博客也已经讲了基于JSP、java、Tomcat三者的项目实战--校园交易网(3)主页-CSDN博客
接下来我们先讲一下添加商品功能---->④
①-服务层所写的文件,代码
②-要呈现所有的商品,我们最主要的逻辑就是应用了dao层的findallgoods方法
③-是上一个博客的疏忽,我忘记将Product实体类放到博客上来了,其实就是根据数据库中的定义类型,对product对象中的name和price属性进行set、get方法以及tostring。
话不多说,直接上代码
服务层
AddShoppingServlet
package Servlet;import dao.StudentDAO;
import entiy.Product;
import entiy.Student;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;public class AddShoppingServlet extends HttpServlet {public void service(HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException {request.setCharacterEncoding("utf-8");//读取参数String name = request.getParameter("name");String price = request.getParameter("price");response.setContentType("text/html;charset=utf-8");PrintWriter out=response.getWriter();try {StudentDAO dao = new StudentDAO();//创建商品对象Product e1 = new Product();e1.setName(name);e1.setPrice(Double.parseDouble(price));System.out.println(e1.getName());System.out.println(e1.getPrice());dao.savegoods(e1);//重定向到主页面response.sendRedirect("list");} catch (Exception e) {e.printStackTrace();out.println("系统繁忙,请稍后再试!");}out.close();}
}
这段服务层的作用是处理添加商品的请求并将商品信息保存到数据库中。
逻辑思路和步骤:
-
设置编码和获取参数:
request.setCharacterEncoding("utf-8")
:确保请求参数的编码正确设置为UTF-8,以防止乱码问题。String name = request.getParameter("name")
和String price = request.getParameter("price")
:从请求中获取商品的名称和价格。
-
设置响应类型和获取输出流:
response.setContentType("text/html;charset=utf-8")
:设置响应的内容类型为HTML,并指定UTF-8编码。PrintWriter out = response.getWriter()
:获取用于向客户端发送响应的输出流。
-
数据库操作:
StudentDAO dao = new StudentDAO()
:创建一个StudentDAO对象,这可能是一个数据访问对象,用于处理数据库操作。Product e1 = new Product()
:创建一个Product对象,用于封装从请求中获取的商品信息。e1.setName(name)
和e1.setPrice(Double.parseDouble(price))
:设置商品对象的名称和价格。
-
保存商品到数据库:
dao.savegoods(e1)
:调用StudentDAO中的savegoods方法,将商品对象保存到数据库中。
-
异常处理和响应输出:
response.sendRedirect("list")
:重定向到名为"list"的Servlet或页面,通常用于显示添加商品后的主页面或列表页面。catch (Exception e)
:捕获可能发生的异常。e.printStackTrace()
和out.println("系统繁忙,请稍后再试!")
:在控制台打印异常信息,并向客户端输出错误提示信息。
用到的技术和连接:
- Servlet技术:基于Java的Web应用开发技术,通过继承HttpServlet来处理HTTP请求和响应。
- HttpServletRequest和HttpServletResponse:用于获取客户端请求的数据和向客户端发送响应。
- UTF-8编码:确保中文和特殊字符能够正确地被处理和显示。
- 数据库访问:通过StudentDAO对象调用savegoods方法,将商品信息保存到数据库中。
这段代码的主要逻辑是接收从前端传来的商品名称和价格,将其封装成一个Product对象,然后通过StudentDAO将该对象保存到数据库中。最后,根据保存结果,可能重定向到商品列表页面或者显示错误信息给用户。
前端
AddShopping.jsp
<%@page contentType="text/html;charset=utf-8" pageEncoding="utf-8" %>
<%@page import="java.util.*,java.text.*,dao.*" %>
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Add Product</title><link rel="stylesheet" href="css/style.css"><style>/* 这里可以添加页面特定的 CSS 样式 */body {font-family: Arial, sans-serif;background-color: #f0f0f0;margin: 0;padding: 0;}#wrap {width: 80%;margin: 0 auto;background-color: #fff;box-shadow: 0 0 10px rgba(0,0,0,0.1);}header {background-color: #333;color: #fff;padding: 10px;text-align: center;}#content {padding: 20px;}.form_table {width: 100%;}.form_table td {padding: 10px;}.inputgri {width: 100%;padding: 8px;border: 1px solid #ccc;border-radius: 4px;box-sizing: border-box;font-size: 14px;}.button {padding: 10px 20px;background-color: #4CAF50;color: white;border: none;border-radius: 4px;cursor: pointer;font-size: 14px;}.button:hover {background-color: #45a049;}#footer {background-color: #333;color: #fff;text-align: center;padding: 10px;}</style>
</head>
<body>
<div id="wrap"><div id="content"><h1>添加商品:</h1><form action="add" method="post"><table class="form_table"><tr><td align="right">Name:</td><td><input type="text" class="inputgri" name="name" /></td></tr><tr><td align="right">Price:</td><td><input type="text" class="inputgri" name="price" /></td></tr></table><p><input type="submit" class="button" value="确认添加" /></p></form></div><footer id="footer">sdjyw@126.com</footer>
</div>
</body>
</html>
这是一个简单的HTML页面,用于向用户展示一个添加商品的表单界面。
页面结构和功能解析:
-
页面声明和设置:
<%@page contentType="text/html;charset=utf-8" pageEncoding="utf-8" %>
:指定页面的内容类型和编码为UTF-8,确保页面可以正确显示中文和特殊字符。<%@page import="java.util.*,java.text.*,dao.*" %>
:导入所需的Java类库,包括java.util下的所有类、java.text下的所有类,以及dao包中的所有类,用于后续的数据处理。
-
HTML结构:
<!DOCTYPE html>
:声明文档类型为HTML5。<html lang="en">
:指定页面的语言为英语。<head>
:头部部分,包含页面的元数据和引用的样式表。<meta charset="UTF-8">
:设置字符集为UTF-8。<meta name="viewport" content="width=device-width, initial-scale=1.0">
:设置视口,使页面在各种设备上能正确显示并自动缩放到设备宽度。<title>Add Product</title>
:设置页面的标题为"Add Product"。<link rel="stylesheet" href="css/style.css">
:引入外部样式表,定义了页面的整体样式。<style>
:内部样式表,用于定义页面特定的样式。
-
页面内容:
<body>
:页面的主体部分。<div id="wrap">
:包裹整个页面内容,定义了页面的宽度、背景色和阴影效果。<div id="content">
:页面的主要内容区域。<h1>添加商品:</h1>
:显示页面的主标题。<form action="add" method="post">
:表单元素,用于向服务器提交数据,提交目标为"add",提交方式为POST。<table class="form_table">
:使用表格布局,定义了表单的样式。<tr>
:表格行。<td align="right">Name:</td>
:表格单元格,显示字段"Name",并右对齐。<td><input type="text" class="inputgri" name="name" /></td>
:表格单元格,包含一个文本输入框,用于用户输入商品名称,输入框具有自定义的样式类"inputgri"。
- 同样的结构用于"Price"字段的输入。
<p><input type="submit" class="button" value="确认添加" /></p>
:提交按钮,用户点击后将表单数据提交到服务器。
<footer id="footer">
:页面的页脚部分。"sdjyw@126.com"
:显示联系邮箱。
页面样式和功能点解释:
- 样式设计:通过CSS设置了页面的整体布局、背景色、字体等样式,使页面看起来更加整洁和专业。
- 表单设计:使用了HTML表格布局来组织表单元素,使页面结构清晰,并通过CSS样式美化表单元素的外观。
- 提交功能:表单的提交目标为"add",使用POST方法提交数据,提交的数据将被发送到后端处理。
- 响应性设计:通过设置视口和CSS,使页面在不同设备上具有良好的显示效果和响应性。
总体来说,这段HTML页面设计了一个简洁而功能完善的商品添加界面,用户可以通过输入商品名称和价格,点击确认添加按钮,将数据提交到后端处理。
dao层
savegoods方法
public void savegoods(Product e) throws Exception {Connection conn = null;PreparedStatement prep = null;try {conn = DBUtil.getConnection();prep = conn.prepareStatement("INSERT INTO goods (name,price) VALUES (?, ?)");prep.setString(1, e.getName());prep.setDouble(2, e.getPrice());prep.executeUpdate();} catch (SQLException e1) {// Handle specific SQL exceptions or log them for debugginge1.printStackTrace();throw new Exception("Failed to save goods: " + e1.getMessage(), e1);} finally {// Close PreparedStatement and Connection in finally blockif (prep != null) {try {prep.close();} catch (SQLException e2) {e2.printStackTrace();}}DBUtil.close(conn);}
}
-
连接和 PreparedStatement 设置:
- 方法开始通过
DBUtil.getConnection()
建立数据库连接 (conn
)。 - 使用包含插入
name
和price
到goods
表的 SQL 查询创建PreparedStatement
(prep
)。
- 方法开始通过
-
设置参数和执行:
- 使用
prep.setString(1, e.getName())
和prep.setDouble(2, e.getPrice())
分别为PreparedStatement
的参数 (name
和price
) 设置值。 - 使用
prep.executeUpdate()
执行数据库更新操作。
- 使用
-
异常处理:
- 方法捕获
SQLException
来专门处理数据库操作期间发生的任何错误。 - 在捕获异常时,打印堆栈跟踪以进行调试,并且抛出一个新的
Exception
,包装原始的SQLException
,并提供自定义的错误消息 ("Failed to save goods: " + e1.getMessage()
).
- 方法捕获
-
资源管理:
- 在
finally
块中确保PreparedStatement
(prep
) 被正确关闭以释放数据库资源,使用prep.close()
。 - 使用
DBUtil.close(conn)
关闭数据库连接 (conn
)。
- 在
entity层(实体层)
Product
package entiy;public class Product {private int id;private String name;private double price;// 其他商品属性,如颜色、库存等// 构造方法、getter和setter方法public int getId() {return id;}public void setId(int id) {this.id = id;}public Product(/*, 其他属性 */) {this.name = name;this.price = price;// 初始化其他属性}public String getName() {return name;}public void setName(String name) {this.name = name;}public double getPrice() { return price; }public void setPrice(double price) {this.price = price;}@Overridepublic String toString() {return "Product{" +"id=" + id +", name='" + name + '\'' +", price=" + price +'}';}
}
web.xml
<servlet><servlet-name>add</servlet-name><servlet-class>Servlet.AddShoppingServlet</servlet-class></servlet><servlet-mapping><servlet-name>add</servlet-name><url-pattern>/add</url-pattern></servlet-mapping>