JSP实训项目设计报告—MVC简易购物商城
JSP实训项目设计报告—MVC简易购物商城
文章目录
- JSP实训项目设计报告—MVC简易购物商城
- 设计目的
- 设计要求
- 设计思路
- 系统要求
- 单点登录模块
- 商品展示模块
- 购物车展示模块
- 概要设计
- Model层
- View层
- Controller层
- 详细设计
- Model层
- View层
- 登录界面
- 系统主界面
- Controller层
- 系统运行效果
- 项目优缺点
设计目的
《JSP程序设计实战》是计算机专业教学计划中十分重要的实践性教学环节,本课程使学生通过《JSP程序设计实战》课程的学习,具备一定的基于Java语言开发Web应用程序的能力,开设的实践性必修课程。通过课程实训教学环节,完成具有一定难度、一定规模的任务,强化、贯通所学知识,进一步巩固和提高编写程序的能力,并体验开发应用程序的设计过程,从而提高学生动手能力,达到理论与实践互相渗透、有机结合的目的。
设计要求
掌握《JSP程序设计实战》课程中的编程方法、技巧和程序的调试步骤,,并对软件项目开发流程有初步了解。
设计思路
系统要求
系统由单点登录、商品展示和购物车共三部分功能模块组成。各模块功能描述如下:
单点登录模块
- 登录验证:系统验证输入用户名和密码,经验证符合才能继续服务。
- 系统每个模块均有登录验证,如未登录直接访问其他模块,则跳转至登录模块。
商品展示模块
- 将商品列表展现给用户,包括商品名称、数量、单价等信息。
- 支持从商品列表选择商品至购物车。
- 支持从商品列表跳转至购物车。
- 支持数据库功能。
购物车展示模块
- 从商品列表选择的商品应该出现在购物车列表里
- 支持从购物车中删除商品
- 支持从购物车跳转至商品列表
概要设计
系统按MVC概念进行设计,实现注意点分离的设计理念,也就是让专业的对象做专业的事情,View层负责视图相关的内容,Model层负责描述数据模型,Controller层负责总控,各自分工协作。
在商品购物平台中,应该会涉及到很多模型,有涉及商品的模型,有涉及用户的模型,也有涉及购物车的模型,也有涉及订单的模型,还有一大些关于仓储,服务等方面的模型。本项目是简易商品购物商城,从中抽象出来的对象模型主要是三种,分别是商品类(Goods类)、购物车类(ShopCart类)、用户类(User类)
Model层
模型层(Model):指从现实世界中抽象出来的对象模型,是应用逻辑的反应;它封装了数据和对数据的操作,是实际进行数据处理的地方(模型层与数据库才有交互)
负责实现用户,商品等数据的结构设计并保存
View层
视图层(View):是应用和用户之间的接口,它负责将应用显示给用户 和 显示模型的状态。
负责实现项目主页面、登录页面、商品列表和购物车的展现
Controller层
控制器(Controller):控制器负责视图和模型之间的交互,控制对用户输入的响应、响应方式和流程;它主要负责两方面的动作,一是把用户的请求分发到相应的模型,二是吧模型的改变及时地反映到视图上。
负责信息流向控制,根据用户登录情况,负责控制主页面、登录页面、商品列表和购物车之间的切换
详细设计
Model层
进行Model层的编写的时候,一般将创建的所有JavaBean类放到一个专门的包里面,方便代码的分类和管理,为了方便查找,将包名命名为bean
创建Goods类,作为商品的基础类,有商品名称、价格和数量等属性,实现属性的设置、获取和初始化等功能
package bean;public class Goods {// 对应字段 gnameprivate String gname;// 对应字段 gpriceprivate int gprice;// 对应字段 gunmberprivate int gnumber;/*** @return the gname*/public String getGname() {return gname;}/*** @param gname the gname to set*/public void setGname(String gname) {this.gname = gname;}/*** @return the gprice*/public int getGprice() {return gprice;}/*** @param gprice the gprice to set*/public void setGprice(int gprice) {this.gprice = gprice;}/*** @return the gnumber*/public int getGnumber() {return gnumber;}/*** @param gnumber the gnumber to set*/public void setGnumber(int gnumber) {this.gnumber = gnumber;}//有参构造public Goods(String gname, int gprice, int gnumber) {super();this.gname = gname;this.gprice = gprice;this.gnumber = gnumber;}//无参构造public Goods() {super();}}
创建ShopCart类,作为购物车模型的抽象,用于购物车的基础类,有购物车中商品的名称,单价,用户名,总价,购物车编号等属性,实现这些属性的设置,获取和初始化
package bean;public class ShopCart {// 对应字段 gnameString gname;// 对应字段 gpricefloat gprice;// 对应字段 cnumint cnum;// 对应字段 cpricefloat cprice;// 对应字段 unameString uname;public ShopCart( String uname, String gname, float gprice,int cnum, float cprice) {super();this.gname = gname;this.gprice = gprice;this.cnum = cnum;this.cprice = cprice;this.uname = uname;}public ShopCart() {super();}/*** @return the uname*/public String getUname() {return uname;}/*** @param uname the uname to set*/public void setUname(String uname) {this.uname = uname;}/*** @return the gname*/public String getGname() {return gname;}/*** @return the gprice*/public float getGprice() {return gprice;}/*** @return the cnum*/public int getCnum() {return cnum;}/*** @return the cprice*/public float getCprice() {return cprice;}/*** @param gname the gname to set*/public void setGname(String gname) {this.gname = gname;}/*** @param gprice the gprice to set*/public void setGprice(float gprice) {this.gprice = gprice;}/*** @param cnum the cnum to set*/public void setCnum(int cnum) {this.cnum = cnum;}/*** @param cprice the cprice to set*/public void setCprice(float cprice) {this.cprice = cprice;}}
创建User类,作为用户模型的抽象,用于用户的基础类,有用户中用户名,等属性,实现这些属性的设置,获取和初始化
package bean;public class User {// 对应字段 unameString uname;// 对应字段 passwordString password;public User(String uname, String password) {super();this.uname = uname;this.password = password;}public User() {super();}/*** @return the uname*/public String getUsername() {return uname;}/*** @param username the uname to set*/public void setUsername(String username) {this.uname = username;}/*** @return the password*/public String getPassword() {return password;}/*** @param password the password to set*/public void setPassword(String password) {this.password = password;}}
建立的三个类可以用快捷键进行创建,创建的时候不仅要创建set和get方法,还要创建有参构造和无参构造
然后根据创建的JavaBean类编写相应的数据库代码,为后面的数据库功能做基础
-- 创建数据库
create database jsp;
在数据库中根据Javabean创建数据表
-- 用户表
create table User
(`uname` varchar(30) not null primary key comment '用户名',`password` varchar(30) not null comment '密码'
);
用户名和密码都不能为空,同时用户名字段要作为你主键
-- 购物车表
create table ShopCart
(`uname` varchar(30) comment '用户名',`gname` varchar(30) comment '商品名称',`gprice` float comment '商品单价',`cnum` int comment '购买数量' not null,foreign key (uname) references User (uname)
);
购物车中的用户名字段应该跟用户表中的用户名字段对应,购物车中的商品名称字段和商品单价字段应该分别和商品列表中的商品名称字段和商品单价字段对应。这里简化了流程,没有进行对应,可以根据需要进行添加修改
-- 商品表
create table `Goods`
(`gname` varchar(30) primary key comment '商品名',`gprice` float comment '商品单价',`gnumber` int comment '商品库存数' not null
);
商品库存数可以根据后面的购物车的一系列操作进行增删改查的,因为1没有设计购物车之后的操作也就没有涉及多少相关的内容
在创建的数据库中添加一下初始记录
insert into `User` values ('zql', '1223456');
在User表中插入数据,分别1对应着用户名和密码
insert into `ShopCart` values ('zql', '三星 500GB SSD固态硬盘 SATA3.0接口', 440, 1);
在shopCart表中1插入数据
insert into goods
values ('林清玄启悟人生系列:愿你,归来仍是少年', 31.90, 996);
insert into goods
values ('平凡的世界:全三册(激励青年的不朽经典)', 103.40, 947);
insert into goods
values ('曾国藩全集(全六卷 绸面精装插盒珍藏版)', 280.50, 998);
insert into goods
values ('中外文化文学经典系列 红岩 导读与赏析', 31.90, 995);
insert into goods
values ('古琴 老杉木乐器伏羲式_七弦琴 ', 3628.90, 19);
insert into goods
values ('专业演奏级乐器洞箫_8孔正手G调', 603.90, 97);
insert into goods
values ('三星 500GB SSD固态硬盘 SATA3.0接口 ', 440.00, 498);
在goods表中插入数据
到现在为止,我们已经完成了模型的构建,还要完成业务的处理。在实际业务处理过程中,往往需要进行多次数据库的访问。这些访问性质往往是相同的,采用Dao层可以将对数据库访问进行封装,避免经行重复性数据库访问开发操作,同时降低维护的成本。
在此之前我们可以创建数据库连接池,减少每次数据库创建连接时造成的资源的较大消耗。创建数据库链接的时候可以单独放到一个文件夹里,方便分类管理
package util;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;public class DataBase {static String driver = "com.mysql.jdbc.Driver";static String ur1 = "jdbc:mysql://localhost:3306/jsp";static String user = "root";//用户名static String pwd = "123456";//密码public static Connection conn = null;public static Statement sm = null;ResultSet rs = null;static {//静态代码块,只执行一次try {Class.forName(driver);System.out.println("OK");//连接数据库conn = DriverManager.getConnection(ur1, user, pwd);System.out.println("OK");sm = conn.createStatement();} catch (ClassNotFoundException e) {//捕捉ClassNotFoundException异常e.printStackTrace();System.out.println("false");} catch (SQLException e) {//捕捉SQLException异常e.printStackTrace();System.out.println("false");}}public ResultSet getResultSet(String sql) {try {rs = sm.executeQuery(sql);} catch (SQLException e) {e.printStackTrace();}return rs;}public void executeDML(String sql) throws SQLException {sm.executeUpdate(sql);}public void closeDb() {try {if (rs != null) {rs.close();}if (sm != null) {sm.close();}if (conn != null) {conn.close();}} catch (SQLException e) {e.printStackTrace();}}
}
在DataBase类中,静态代码块主要是进行数据库的链接,只执行一次。getResultSet方法主要是是获取SQL语言执行后的结果,CloseDb方法主要用于关闭数据库。executeDML方法主要用于执行SQL语言,不要要返回结果
接着编写Dao层,Dao层一般分为Dao接口和Dao实现,因为本项目比较简单,直接编写Dao实现
根据简易购物商场的需求进行分析,GoodsDao中要用到插入和查找的功能,插入的功能是将形参作为条件,插入到数据库中,因此结果不需要返回,直接运行就可以了。查找的功能中需要将结果返回,并且因为返回的结果是一条条记录,所以可以将结果存放到一个ArrayList中,最后直接返回一个ArrayList作为结果
package dao;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import bean.Goods;
import util.DataBase;public class GoodsDao extends DataBase {public void insertGoods(String gname, float gprice, int gnumber) throws SQLException {// TODO Auto-generated method stub// insert into `goods` values ('"+name+"', "+gprice+", "+gnumber+");String sql = "insert into `goods` values ('" + gname + "', " + gprice + ", " + gnumber + ");";this.executeDML(sql);}public ArrayList<Goods> selectGoods() throws SQLException {// TODO Auto-generated method stub// select * from `Goods`String sql = "select * from `Goods`";ArrayList<Goods> list = new ArrayList<>();ResultSet rs = this.getResultSet(sql);try {while (rs.next()) {//判断数据表中是否还有记录Goods goods = new Goods();//根据bean中的Goods类创建对象goods.setGname(rs.getString("gname"));//将gname对应的内容存入到goods对象中的Gname中goods.setGnumber(rs.getInt("gnumber"));goods.setGprice(rs.getInt("gprice"));list.add(goods);//将创建的对象存到一个集合之中,后面的操作只需要堆读取list集合就可以了,不用再次调用数据库}} catch (SQLException e) {//捕获SQLException异常e.printStackTrace();}return list;}
}
根据简易购物商场的需求进行分析,ShopCartDao中要用到插入,删除和查找的功能,插入的功能是将形参作为条件,插入到数据库中,因此结果不需要返回,直接运行就可以了。删除的功能也是因为直接根据参数进行查找,查找到符合的记录后进行删除,不需要再返回任何结果。查找的功能中需要将结果返回,并且因为返回的结果是一条条记录,所以可以将结果存放到一个ArrayList中,最后直接返回一个ArrayList作为结果
package dao;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import bean.ShopCart;
import util.DataBase;public class ShopCartDao extends DataBase {public void insertCart1(String uname, String gname) throws SQLException {// TODO Auto-generated method stub// insert into `ShopCart` values ('"+uname+"','"+gname+"',"+gprice+",1);String sql = "insert into `ShopCart` values ('" + uname + "','" + gname + "',1);";this.executeDML(sql);}public void insertCart(String uname, String gname, float gprice) throws SQLException {// TODO Auto-generated method stub// insert into `ShopCart` values ('"+uname+"','"+gname+"',"+gprice+",1);String sql = "insert into `ShopCart` values ('"+uname+"','"+gname+"',"+gprice+",1);";this.executeDML(sql);}public void deleteCart(String gname) throws SQLException {// TODO Auto-generated method stub// delete from shopcart where gname='三星 500GB SSD固态硬盘 SATA3.0接口';String sql = "delete from shopcart where gname='" + gname + "';";this.executeDML(sql);}public ArrayList<ShopCart> selectCart(String uname) throws SQLException {// TODO Auto-generated method stub// select gname, gprice, cnum, gprice * ShopCart.cnum 'cprice' from ShopCart// where uname='" + uname + "';String sql = "select gname, gprice, cnum, gprice * ShopCart.cnum 'cprice' from ShopCart where uname='" + uname+ "';";ArrayList<ShopCart> list = new ArrayList<>();ResultSet rs = this.getResultSet(sql);try {while (rs.next()) {ShopCart cart = new ShopCart();cart.setGname(rs.getString("gname"));cart.setUname(uname);cart.setGprice(rs.getInt("gprice"));cart.setCnum(rs.getInt("cnum"));cart.setCprice(rs.getFloat("cprice"));list.add(cart);}} catch (SQLException e) {e.printStackTrace();}return list;}
}
根据简易购物商场的需求进行分析,UserDao中要用到插入和查找的功能,插入的功能是将形参作为条件,插入到数据库中,因此结果不需要返回,直接运行就可以了。查找的功能中需要将结果返回,并且因为返回的结果是一条条记录,所以可以将结果存放到一个ArrayList中,最后直接返回一个ArrayList作为结果
package dao;
import java.sql.ResultSet;
import java.sql.SQLException;
import bean.User;
import util.DataBase;public class UserDao extends DataBase {public void insertUser(String uname, String password) throws SQLException {// TODO Auto-generated method stub// insert into `user` values ('"+uname+"','"+password+"');String sql = "insert into `user` values ('" + uname + "','" + password + "');";this.executeDML(sql);}public User selectUser(String uname) throws SQLException {// TODO Auto-generated method stub// select password from `User` where uname='" + uname + "'String sql = "select password from `User` where uname='" + uname + "'";ResultSet rs = this.getResultSet(sql);User user = new User();try {while (rs.next()) {user.setPassword(rs.getString("password"));user.setUsername(uname);}} catch (SQLException e) {e.printStackTrace();}return user;}
}
View层
view层主要是通过JSP、HTML等进行页面的展示的
登录界面
在login.java界面中,把从login.jsp页面的内容传输Controller层中,由后台进行操作。
<%@ page language="java" contentType="text/html; charset=utf-8"pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>login</title>
</head>
<body><form action="Login" method="post">用户名:<input type="text" name="uname"> </br> 密码:<input type="text"name="password"></br><input type="submit" value="提交"></form>
</body>
</html>
系统主界面
主页面采用带导航的Frame框架的JSP页面实现,主框架页面包含三个分页面
功能描述:
展现信息:主页面负责系统的主要展现功能,top窗口负责显示欢迎信息;left窗口负责导航,用户点击“商品列表”或“购物车”会在center窗口显示相应的信息;Center窗口负责显示商品列表和购物车的详细信息。
<%-- <%@ page language="java" contentType="text/html; charset=ISO-8859-1"pageEncoding="ISO-8859-1"%> --%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Tindex</title>
</head>
<script>alert('right')
</script>
<frameset rows="10%,90%"><frame src="top.jsp" name="frame_top"><frameset cols="25%,75%"><frame src="left.jsp" name="frame_left"><frame src="center.jsp" name="frame_center"></frameset>
</frameset>
</html>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"pageEncoding="ISO-8859-1"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
center
</body>
</html>
center从页面主要是用来占位的,放着框架崩掉
<%@ page language="java" contentType="text/html; charset=utf-8"pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>top</title>
</head>
<body><%String uname = (String) session.getAttribute("uname");%>MVC商城欢迎你<%=uname%>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=utf-8"pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>left</title>
</head>
<body><a href="GoodsList" target="frame_center">商品列表</a><a href="ShopCart?type=select>" target="frame_center">购物车</a>
</body>
</html>
Controller层
本项目的Controller层的主要功能是对用户的登录进行进行操作,对购物车商品的操作和对商品列表的进行操作,还要负责页面之间的切换
对用户登录进行操作
package servelet;import java.io.IOException;
import java.io.PrintWriter;
import java.sql.ResultSet;
import java.sql.SQLException;
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 dao.UserDao;/*** Servlet implementation class Login*/
@WebServlet("/Login")
public class Login extends HttpServlet {private static final long serialVersionUID = 1L;/*** @see HttpServlet#HttpServlet()*/public Login() {super();// TODO Auto-generated constructor stub}/*** @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse* response)*/protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// TODO Auto-generated method stubrequest.setCharacterEncoding("utf-8");response.setCharacterEncoding("utf-8");// 获取login.jsp页面的内容String uname = request.getParameter("uname");String password = request.getParameter("password");System.out.println(uname);System.out.println(password);UserDao udi = new UserDao();try {// 获取对应的String sql = "select password from `User` where uname='" + uname + "'";ResultSet rs = null;rs = udi.getResultSet(sql);while (rs.next()) {String upwd = rs.getNString("password");System.out.println(upwd);System.out.println("OK");if (upwd.equals(password)) {request.getSession().setAttribute("uname", uname);response.sendRedirect("index.jsp");} else {PrintWriter out = response.getWriter();out.println("<script>alert('wrong2')</script>");response.sendRedirect("login.jsp");}}} catch (SQLException e) {/* 优化catch后面的操作 */e.printStackTrace();PrintWriter out = response.getWriter();out.println("<script>alert('wrong2')</script>");response.sendRedirect("login.jsp");}}/*** @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse* response)*/protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// TODO Auto-generated method stubdoGet(request, response);}}
本段的主要逻辑是把用户在网页中输入的用户名和密码传到这里后获取用户名在数据库中对应的记录,然后把数据库中存在的密码和传来的密码进行比较,如果密码错误或者在查找用户对应的记录的产生数据库异常,直接弹出窗口提醒。
对购物车进行操作,并做到敬center页面跳转到购物车页面,显示相应的信息
package servelet;import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
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 dao.ShopCartDao;/*** Servlet implementation class ShopCart*/
@WebServlet("/ShopCart")
public class ShopCart extends HttpServlet {private static final long serialVersionUID = 1L;/*** @see HttpServlet#HttpServlet()*/public ShopCart() {super();// TODO Auto-generated constructor stub}/*** @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse* response)*/protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// TODO Auto-generated method stub// 设置字符集request.setCharacterEncoding("utf-8");response.setCharacterEncoding("utf-8");String opt = request.getParameter("type");String uname = (String) request.getSession().getAttribute("uname");// 购物车操作try {System.out.println("flag_try");if (opt.equals("add")) {// 商品添加String gname = request.getParameter("gname");Float gprice = Float.valueOf(request.getParameter("gprice"));ShopCartDao scd = new ShopCartDao();scd.insertCart(uname, gname, gprice);} else if (opt.equals("delete")) {// 商品删除String gname = request.getParameter("gname");ShopCartDao scd = new ShopCartDao();scd.deleteCart(gname);} else if (opt.equals("select")) {// 购物车查询System.out.println("flag_select");ShopCartDao scd = new ShopCartDao();ArrayList<bean.ShopCart> cartlist = scd.selectCart(uname);System.out.println(cartlist.size());request.getSession().setAttribute("ShopCartList", cartlist);// 编写出页面response.setContentType("text/html; charset=UTF-8");PrintWriter out = response.getWriter();out.println("<!DOCTYPE html>");out.println("<html>");out.println("<head>");out.println("<meta charset='UTF-8'>");out.println("<title>商品</title>");out.println("</head>");out.println("<body>");out.println("<a href='GoodsList'>商品列表</a>");out.println("<table border='1'>");out.println("<tr>");out.println("<td>序号</td>");out.println("<td>商品名称</td>");out.println("<td>商品价格</td>");out.println("<td>购买数量</td>");out.println("<td>总价</td>");out.println("<td>操作</td>");out.println("</tr>");for (int i = 0; i < cartlist.size(); i++) {out.println("<tr>");out.println("<td>" + (i + 1) + "</td>");out.println("<td>" + cartlist.get(i).getGname() + "</td>");out.println("<td>" + cartlist.get(i).getGprice() + "</td>");out.println("<td>" + cartlist.get(i).getCnum() + "</td>");out.println("<td>" + cartlist.get(i).getCprice() + "</td>");out.println("<td><a href='ShopCart?type=delete&gname=" + cartlist.get(i).getGname() + "'>删除</a></td>");out.println("</tr>");out.println("</tr>");}out.println("</body>");out.println("</html>");}} catch (Exception e) {// TODO: handle exceptione.printStackTrace();System.out.println("wrong_E");}}/*** @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse* response)*/protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// TODO Auto-generated method stubdoGet(request, response);}}
对商品列表进行操作,并做到敬center页面跳转到购物车页面,显示相应的信息
package servelet;import java.io.IOException;
import java.io.PrintWriter;
import java.sql.SQLException;
import java.util.ArrayList;
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 bean.Goods;
import dao.GoodsDao;/*** Servlet implementation class GoodsList*/
@WebServlet("/GoodsList")
public class GoodsList extends HttpServlet {private static final long serialVersionUID = 1L;/*** @see HttpServlet#HttpServlet()*/public GoodsList() {super();}/*** @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse* response)*/protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {request.setCharacterEncoding("utf-8");response.setCharacterEncoding("utf-8");GoodsDao goodsDao = new GoodsDao();try {ArrayList<Goods> list = goodsDao.selectGoods();request.getSession().setAttribute("GoodsList", list);response.setContentType("text/html; charset=UTF-8");PrintWriter out = response.getWriter();out.println("<!DOCTYPE html>");out.println("<html>");out.println("<head>");out.println("<meta charset='UTF-8'>");out.println("<title>商品</title>");out.println("</head>");out.println("<body>");out.println("<a href='ShopCart?type=select'>购物车</a>");out.println("<table border='1'>");out.println("<tr>");out.println("<td>序号</td>");out.println("<td>商品名称</td>");out.println("<td>商品价格</td>");out.println("<td>库存数量</td>");out.println("<td>操作</td>");out.println("</tr>");for (int i = 0; i < list.size(); i++) {out.println("<tr>");out.println("<td>" + (i + 1) + "</td>");out.println("<td>" + list.get(i).getGname() + "</td>");out.println("<td>" + list.get(i).getGprice() + "</td>");out.println("<td>" + list.get(i).getGnumber() + "</td>");out.println("<td><a href='ShopCart?type=add&gname=" + list.get(i).getGname() + "&gprice="+ list.get(i).getGprice() + "'>添加</a></td>");out.println("</tr>");out.println("</tr>");}out.println("</body>");out.println("</html>");} catch (SQLException e) {e.printStackTrace();}}/*** @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse* response)*/protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request, response);}
}
系统运行效果
login.jsp展示
index.jsp/top.jsp/left.jsp展示
商品列表展示
购物车列表展示
项目优缺点
本项目继承了MVC结构的缺点,同时因为项目过去简单,有些功能做的还不是很完善,有些功能上的漏洞还是需要进行修补,但是这东西可以跑!!!可以跑!!!
相关文章:

JSP实训项目设计报告—MVC简易购物商城
JSP实训项目设计报告—MVC简易购物商城 文章目录 JSP实训项目设计报告—MVC简易购物商城设计目的设计要求设计思路系统要求单点登录模块商品展示模块购物车展示模块 概要设计Model层View层Controller层 详细设计Model层View层登录界面系统主界面 Controller层 系统运行效果项目…...

41、可靠传输——停等ARQ
前面两节内容我们学习了传输层的基本概况的一些知识,包括传输层在TCP/IP协议栈中负责的任务、传输层的两大协议,以及端口号、套接字等一些基本的概念。从这一节开始,我们将开启两大协议中TCP协议的学习。 但是,经过之前的学习&am…...
RK3568 cmake编译
一.简介 CMake是开源、跨平台的构建工具,可以让我们通过编写简单的配置文件去生成本地的Makefile,这个配置文件是独立于运行平台和编译器的,这样就不用亲自去编写Makefile了,而且配置文件可以直接拿到其它平台上使用,…...

详细安装配置django
安装配置使用Django。 1,下载安装 django pip install django 2.创建设置项目 先进入要放置项目的文件夹下 2.1, 创建项目 django-admin startproject Api_project 2.2, 创建app命令 cd Api_project dir看一下是否有 manage.py 文件…...

HTTP之cookie基础学习
目录 Cookie 什么是Cookie Cookie分类 Cookie版本 Cookie工作原理 Cookie详解 创建cookie cookie编码 cookie过期时间选项 Cookie流程 Cookie使用 会话管理 个性化信息 记录用户的行为 Cookie属性 domain选项 path选项 secure选项 cookie…...
观察者模式和发布订阅模式
观察者模式与发布订阅模式的区别: 1、观察者模式中只有观察者和被观察者,发布订阅模式中有发布者、订阅者、调度中心 2、观察者模式是被观察者发生变化时自己通知观察者,发布订阅模式是通过调度中心来进行分布订阅操作 发布订阅模式 class …...

利用ViewModel和LiveData进行数据管理
利用ViewModel和LiveData进行数据管理 1. 引言 在当今移动应用开发的世界中,数据管理是一个至关重要的方面。随着应用的复杂性不断增加,需要有效地管理和维护应用中的数据。无论是从服务器获取数据、本地数据库存储还是用户界面的状态,数据…...

前后端分离------后端创建笔记(05)用户列表查询接口(下)
本文章转载于【SpringBootVue】全网最简单但实用的前后端分离项目实战笔记 - 前端_大菜007的博客-CSDN博客 仅用于学习和讨论,如有侵权请联系 源码:https://gitee.com/green_vegetables/x-admin-project.git 素材:https://pan.baidu.com/s/…...
浅谈GIS和三维GIS的区别?
GIS(地理信息系统)和三维GIS(3D地理信息系统)是地理信息领域的两个重要概念,它们在地理数据的处理和分析方面具有不同的特点和应用。可能很多人分不清二者的区别,本文就带大家简单了解一下二者的区别。 定义…...

ArcGIS Maps SDK for JavaScript系列之三:在Vue3中使用ArcGIS API加载三维地球
目录 SceneView类的常用属性SceneView类的常用方法vue3中使用SceneView类创建三维地球项目准备引入ArcGIS API创建Vue组件在OnMounted中调用初始化函数initArcGisMap创建Camera对象Camera的常用属性Camera的常用方法 要在Vue 3中使用ArcGIS API for JavaScript加载和展示三维地…...

设计列表和超链接
在网页中,大部分信息都是列表结构,如菜单栏、图文列表、分类导航、新闻列表、栏目列表等。HTML5定义了一套列表标签,通过列表结构实现对网页信息的合理排版。另外,网页中还包含大量超链接,通过它实现网页、位置的跳转&…...
rust包跨平台编译,macbook ,linux
在 MacBook 上编译 Rust 项目并生成 Linux 包需要一些步骤。以下是一般的步骤概述: 1. **安装所需工具:** 首先,确保您的 MacBook 上已经安装了所需的工具。您需要 Rust 编程语言的工具链以及一些用于交叉编译到 Linux 的工具。 - 安装 R…...

JAVA集合-List
// 数组的缺点:每次使用都需要指定长度,掉率低,操作麻烦 // // 【java集合体系】:分类:6个接口,1个工具类 // 6个接口: 单列 :Collection,(父接口) // …...
Python|OpenCV-绘制图形和添加文字的方法(2)
前言 本文是该专栏的第2篇,后面将持续分享OpenCV计算机视觉的干货知识,记得关注。 OpenCV作为一个强大的计算机视觉功能库,除了能解决图像处理和计算机视觉任务之外,它还有着非常丰富的图像绘制功能。可以说,不论是在计算机视觉任务中标记目标领域,还是在图像上绘制一些…...
使用GO编译wasm文件并在nodejs中使用
使用GO编译wasm文件并在nodejs中使用 安装Go相关环境 # 安装GO # mac使用homebrew安装 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" brew install go# vi ~/.bashrc, 添加如下内容 e…...
BM22 比较版本号
一.双指针遍历截取 import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** 比较版本号* param version1 string字符串 * param version2 string字符串 * return int整型*/public …...
【Java】Maven配置文件帮助文档(settings.xml 和 pom.xml)
文章目录 1. settings.xml1.1 localRepository1.2 interactiveMode1.3 offline1.4 pluginGroups1.5 proxies1.6 servers1.7 mirrors1.8 profiles1.9 activeProfiles 2. pom.xml2.1 本项目信息2.2 父项目信息2.3 prerequisites2.4 issueManagement2.5 ciManagement2.6 inception…...
人脸识别技术应用安全管理规定(试行)
近年来,人脸识别技术不断成熟,已大量应用于治安管理、金融支付、门禁考勤等诸多领域,极大便捷了公众生活。然而,人脸识别技术在得到广泛应用的同时,仍存在一些不规范现象。人脸识别因其技术特点,涉及公众敏…...

FPGA应用学习-----FIFO双口ram解决时钟域+asic样机的时钟选通
60m写入异步ram,再用100M从ram中读出 写地址转换为格雷码后,打两拍和读地址判断是否空产生。相反读地址来判断是否满产生。 分割同步模块 asic时钟的门控时钟,fpga是不推荐采用门控时钟的,有很多方法移除fpga的时钟选通。 如果是a…...

zabbix案例--zabbix监控Tomcat
目录 一、 部署tomcat 二、配置zabbix-java-gateway 三、配置zabbix-server 四、配置zabbix-web界面 一、 部署tomcat tar xf apache-tomcat-8.5.16.tar.gz -C /usr/local/ ln -sv /usr/local/apache-tomcat-8.5.16/ /usr/local/tomcat cd /usr/local/tomcat/bin开启JMX…...

第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...

【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)
骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...

用机器学习破解新能源领域的“弃风”难题
音乐发烧友深有体会,玩音乐的本质就是玩电网。火电声音偏暖,水电偏冷,风电偏空旷。至于太阳能发的电,则略显朦胧和单薄。 不知你是否有感觉,近两年家里的音响声音越来越冷,听起来越来越单薄? —…...

佰力博科技与您探讨热释电测量的几种方法
热释电的测量主要涉及热释电系数的测定,这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中,积分电荷法最为常用,其原理是通过测量在电容器上积累的热释电电荷,从而确定热释电系数…...

LLMs 系列实操科普(1)
写在前面: 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容,原视频时长 ~130 分钟,以实操演示主流的一些 LLMs 的使用,由于涉及到实操,实际上并不适合以文字整理,但还是决定尽量整理一份笔…...
MySQL 8.0 事务全面讲解
以下是一个结合两次回答的 MySQL 8.0 事务全面讲解,涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容,并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念(ACID) 事务是…...

计算机基础知识解析:从应用到架构的全面拆解
目录 前言 1、 计算机的应用领域:无处不在的数字助手 2、 计算机的进化史:从算盘到量子计算 3、计算机的分类:不止 “台式机和笔记本” 4、计算机的组件:硬件与软件的协同 4.1 硬件:五大核心部件 4.2 软件&#…...