JSP实训项目设计报告—MVC简易购物商城

JSP实训项目设计报告—MVC简易购物商城

文章目录

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

设计目的

《JSP程序设计实战》是计算机专业教学计划中十分重要的实践性教学环节,本课程使学生通过《JSP程序设计实战》课程的学习,具备一定的基于Java语言开发Web应用程序的能力,开设的实践性必修课程。通过课程实训教学环节,完成具有一定难度、一定规模的任务,强化、贯通所学知识,进一步巩固和提高编写程序的能力,并体验开发应用程序的设计过程,从而提高学生动手能力,达到理论与实践互相渗透、有机结合的目的。

设计要求

掌握《JSP程序设计实战》课程中的编程方法、技巧和程序的调试步骤,,并对软件项目开发流程有初步了解。

设计思路

系统要求

系统由单点登录、商品展示和购物车共三部分功能模块组成。各模块功能描述如下:

单点登录模块

  1. 登录验证:系统验证输入用户名和密码,经验证符合才能继续服务。
  2. 系统每个模块均有登录验证,如未登录直接访问其他模块,则跳转至登录模块。

商品展示模块

  1. 将商品列表展现给用户,包括商品名称、数量、单价等信息。
  2. 支持从商品列表选择商品至购物车。
  3. 支持从商品列表跳转至购物车。
  4. 支持数据库功能。

购物车展示模块

  1. 从商品列表选择的商品应该出现在购物车列表里
  2. 支持从购物车中删除商品
  3. 支持从购物车跳转至商品列表

概要设计

系统按MVC概念进行设计,实现注意点分离的设计理念,也就是让专业的对象做专业的事情,View层负责视图相关的内容,Model层负责描述数据模型,Controller层负责总控,各自分工协作。

在商品购物平台中,应该会涉及到很多模型,有涉及商品的模型,有涉及用户的模型,也有涉及购物车的模型,也有涉及订单的模型,还有一大些关于仓储,服务等方面的模型。本项目是简易商品购物商城,从中抽象出来的对象模型主要是三种,分别是商品类(Goods类)、购物车类(ShopCart类)、用户类(User类)

Model层

模型层(Model):指从现实世界中抽象出来的对象模型,是应用逻辑的反应;它封装了数据和对数据的操作,是实际进行数据处理的地方(模型层与数据库才有交互)

负责实现用户,商品等数据的结构设计并保存

View层

视图层(View):是应用和用户之间的接口,它负责将应用显示给用户 和 显示模型的状态。

负责实现项目主页面、登录页面、商品列表和购物车的展现

Controller层

控制器(Controller):控制器负责视图和模型之间的交互,控制对用户输入的响应、响应方式和流程;它主要负责两方面的动作,一是把用户的请求分发到相应的模型,二是吧模型的改变及时地反映到视图上。

负责信息流向控制,根据用户登录情况,负责控制主页面、登录页面、商品列表和购物车之间的切换

详细设计

Model层

进行Model层的编写的时候,一般将创建的所有JavaBean类放到一个专门的包里面,方便代码的分类和管理,为了方便查找,将包名命名为bean

创建Goods类,作为商品的基础类,有商品名称、价格和数量等属性,实现属性的设置、获取和初始化等功能

package bean;

public class Goods {
	// 对应字段 gname
	private String gname;
	// 对应字段 gprice
	private int gprice;
	// 对应字段 gunmber
	private 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 {

	// 对应字段 gname
	String gname;
	// 对应字段 gprice
	float gprice;
	// 对应字段 cnum
	int cnum;
	// 对应字段 cprice
	float cprice;
	// 对应字段 uname
	String 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 {
	// 对应字段 uname
	String uname;
	// 对应字段 password
	String 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 stub
		request.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 stub
		doGet(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 exception
			e.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 stub
		doGet(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展示

index

商品列表展示

shoplist

购物车列表展示

购物车

项目优缺点

本项目继承了MVC结构的缺点,同时因为项目过去简单,有些功能做的还不是很完善,有些功能上的漏洞还是需要进行修补,但是这东西可以跑!!!可以跑!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/63164.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【驱动开发day8作业】

作业1&#xff1a; 应用层代码 #include <stdlib.h> #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <string.h> #include <sys/ioctl.h>int main(int…

CVE-2022-23134(Zabbix setup 访问控制登录绕过)

目录 一、题目 二、进入题目 一、题目 靶标介绍&#xff1a; Zabbix Sia Zabbix是拉脱维亚Zabbix SIA&#xff08;Zabbix Sia&#xff09;公司的一套开源的监控系统。该系统支持网络监控、服务器监控、云监控和应用监控等。 Zabbix 存在安全漏洞&#xff0c;该漏洞源于在初始…

为什么要选择文件传输软件?有哪些最佳高速文件传输软件?

是否经历过这样的场景&#xff0c;正在努力地完成工作任务&#xff0c;但是由于制作的数据无法及时传送给合作伙伴&#xff0c;工作流程被打断了&#xff1f;这听起来很令人沮丧&#xff0c;对吧&#xff1f;可是&#xff0c;这种情况在现实中并不罕见。 因此&#xff0c;需要…

数据结构——搜索二叉树

文章目录 一. 概念二. 二叉搜索树的操作1.查找2.插入3.删除&#xff08;重点&#xff09;4.遍历5.拷贝构造与析构 三.二叉搜索树的递归实现1.递归查找2.递归插入3.递归删除 四.二叉搜索树的性能分析五.二叉树搜索的应用六.源码 前言&#xff1a; 本章我们将认识一种新的二叉树—…

Spring Boot配置文件与日志文件

1. Spring Boot 配置文件 我们知道, 当我们创建一个Spring Boot项目之后, 就已经有了配置文件存在于目录结构中. 1. 配置文件作用 整个项目中所有重要的数据都是在配置文件中配置的&#xff0c;比如: 数据库的连接信息 (包含用户名和密码的设置) ;项目的启动端口;第三方系统的调…

【chrome扩展开发】vue-i18n使用问题及解决方案

记录chrome扩展开发时调用vue-i18n的一些问题和解决方法 环境 vue: ^3.3.4vue-i18n: ^9.2.2vite: ^4.4.8 错误1 Uncaught (in promise) EvalError: Refused to evaluate a string as JavaScript because unsafe-eval is not an allowed source of script in the following Con…

vi 编辑器入门到高级

vi 编辑器的初级用法vi 编辑器的工作模式1. 命令模式2. 文本输入模式3. 状态行vi 工作模式切换存储缓冲区 vi 编辑器命令1. 启动 vi2. 文本输入3. 退出 vi4. 命令模式下的 光标移动5. 命令模式下的 文本修改6. 从 命令模式 进入 文本输入模式7. 搜索字符串8. vi 在线帮助文档 v…

云原生Kubernetes:阿里云托管k8s集群ACK创建和使用

目录 一、理论 1.容器服务Kubernetes版 2.ACK Pro版集群概述 3.CKA版本说明 二、实验 1.创建专有版Kubernetes集群 三、问题 1.依赖检查未通过 一、理论 1.容器服务Kubernetes版 &#xff08;1&#xff09;概念 阿里云容器服务Kubernetes版&#xff08;Alibaba Cloud…

mysql转sqlite3

在项目中需要将mysql迁移到sqlite3中&#xff0c;此时需要作数据转换 准备工作 下载mysql2sqlite转换工具 https://github.com/dumblob/mysql2sqlite/archive/refs/heads/master.zip 下载sqlite3 https://www.sqlite.org/download.html 转换 命令行中输入如下命令 1、cd …

Vue——webpack

webpack 一、Install1.全局安装2.局部安装 二、总结1.打包2.定义脚本3.配置文件定义&#xff08;webpack.config.js)4.项目重新加载依赖5.webpack打包Css6.style-loader 一、Install 1.全局安装 npm install webpack webpack-cli -g2.局部安装 以项目为单位&#xff0c;一个项…

skywalking日志收集

文章目录 一、介绍二、添加依赖三、修改日志配置1. 添加链路表示traceId2. 添加链路上下文3. 异步日志 四、收集链路日志 一、介绍 在上一篇文章skywalking全链路追踪中我们介绍了在微服务项目中使用skywalking进行服务调用链路的追踪。 本文在全链路追踪的基础上&#xff0c…

QT生成Debug和Release发布版后,运行exe缺少dll问题

在QT Creator生成debug和release的exe执行文件后&#xff0c;运行时&#xff0c;报错缺少*.dll.解决办法1&#xff1a; 在系统环境变量中添加D:\Qt\Qt5.13.2\Tools\mingw730_64\bin后&#xff0c;即可运行。 当使用此方法时&#xff0c;将exe拷贝到其他电脑中运行时&#xff0c…

科技感响应式管理系统后台登录页ui设计html模板

做了一个科技感的后台管理系统登录页设计&#xff0c;并且尝试用响应式布局把前端html写了出来&#xff0c;发现并没有现象中的那么容易&#xff0c;chrome等标准浏览器都显示的挺好&#xff0c;但IE11下面却出现了很多错位&#xff0c;兼容起来还是挺费劲的&#xff0c;真心不…

《吐血整理》高级系列教程-吃透Fiddler抓包教程(36)-掌握Fiddler中FiddlerScript用法你会有多牛逼-上

1.简介 Fiddler是一款强大的HTTP抓包工具&#xff0c;它能记录所有客户端和服务器的http和https请求&#xff0c;允许你监视&#xff0c;设置断点&#xff0c;甚至修改输入输出数据. 使用Fiddler无论对开发还是测试来说&#xff0c;都有很大的帮助。Fiddler提供的功能基本上能…

全网最全Linux 运行jar包的几种方式

一、Linux 运行jar包的几种方式 方式一&#xff1a; java -jar xxx.jar 最常用的启动jar包命令&#xff0c;特点&#xff1a;当前ssh窗口被锁定&#xff0c;可按CTRL C打断程序运行&#xff0c;或直接关闭窗口&#xff0c;程序退出 方式二&#xff1a; java -jar xxx.jar &…

复原 IP 地址——力扣93

文章目录 题目描述回溯题目描述 回溯 class Solution{public:static constexpr int seg_count=4<

使用Python + Flask搭建web服务

示例脚本 from flask import Flask# 获取一个实例对象 app Flask(__name__)# 1、注册 app.route(/reg, methods[get]) def reg():return {code: 200,msg: reg ok!}# 2、登录 app.route(/login, methods[get]) def login():return login ok&#xff01;if __name__ __main__:…

防火墙第五次作业

1. 什么是恶意软件&#xff1f; 恶意软件官方的一个定义&#xff1a;恶意软件 (Malware) 从“恶意”(malicious) 和“软件”(software) 这两个词合并而来&#xff0c;是一个通用术语&#xff0c;可以指代病毒、蠕虫、特洛伊木马、勒索软件、间谍软件、广告软件和其他类型的有害…

【vue】vue基础知识

1、插值表达式&属性绑定 <!--template展示给用户&#xff0c;相当于MVVM模式中的V--> <template><div class"first_div">//插值表达式<p>{{ message }}</p>//这里的参数是从父组件的template里传过来的<p>{{data_1}}</p…

深度学习——全维度动态卷积ODConv

ODConv(OMNI-DIMENSIONAL DYNAMIC CONVOLUTION)是一种关注了空域、输入通道、输出通道等维度上的动态性的卷积方法&#xff0c;因此被称为全维度动态卷积。 part1. 什么是动态卷积 动态卷积就是对卷积核进行线性加权 第一篇提出动态卷积的文章也是在SE之后&#xff0c;他提出…