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 {// 对应字段 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展示

index

商品列表展示

shoplist

购物车列表展示

购物车

项目优缺点

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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

云计算——ACA学习 云计算概述

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​ 目录 写在前面 上章回顾 本章简介 本章目标 一.云计算产生背景 1.信息时代的重点变革…

【VUE】前端实现防篡改的水印

效果 水印的作用 图片加水印的操作一般是由后端来完成&#xff0c;有些站点保护的知识产权的类型可能比较多&#xff0c;不仅仅是图片&#xff0c;可能还有视频、文字等等&#xff0c;对于不同类型的对象添加水印后端操作比较复杂&#xff0c;所有有些站点逐步的让前端去进行水…

认识所有权

专栏简介&#xff1a;本专栏作为Rust语言的入门级的文章&#xff0c;目的是为了分享关于Rust语言的编程技巧和知识。对于Rust语言&#xff0c;虽然历史没有C、和python历史悠远&#xff0c;但是它的优点可以说是非常的多&#xff0c;既继承了C运行速度&#xff0c;还拥有了Java…

前沿分享-鱼形机器人

可能并不太前沿了&#xff0c;是21年底的新闻了&#xff0c;但是看见了就顺便发一下吧。 大概就是&#xff0c;通过在pH响应型水凝胶中编码不同的膨胀速率而构建了一种环境适应型变形微机器人,让微型机器人直接向癌细胞输送药物从而减轻药物带来副作用。 技术原理是&#xff0c…

拦截器对接口细粒度权限校验

文章目录 一、逻辑分析二、校验规则1.规则类型2.规则划分3.规则配置信息4.规则案例说明5.规则加载 三、拦截器定义1.自定义拦截器2.注册拦截器 四、获取请求参数1.获取get提交方式参数2.获取post提交方式参数&#xff08;1&#xff09;定义RequestWrapper类&#xff08;2&#…

Flink正常消费一段时间后,大量反压,看着像卡住了,但又没有报错。

文章目录 前言一、原因分析二、解决方案 前言 前面我也有提到&#xff0c;发现flink运行一段时间后&#xff0c;不再继续消费的问题。这个问题困扰了我非常久&#xff0c;一开始也很迷茫。又因为比较忙&#xff0c;所以一直没有时间能够去寻找答案&#xff0c;只是通过每天重启…

IDEA中maven项目失效,pom.xml文件橙色/橘色

IDEA中maven项目失效&#xff0c;pom.xml文件橙色/橘色 IDEA中Maven项目失效 IDEA中创建的maven项目中的文件夹都变成普通格式&#xff0c;pom.xml变成橙色 右键点击橙色的pom.xml文件&#xff0c;选择add as maven project maven项目开始重新导入相应依赖&#xff0c;恢复…

字符串查找匹配算法

概述 字符串匹配&#xff08;查找&#xff09;是字符串的一种基本操作&#xff1a;给定带匹配查询的文本串S和目标子串T&#xff0c;T也叫做模式串。在文本S中找到一个和模式T相符的子字符串&#xff0c;并返回该子字符串在文本中的位置。 暴力匹配 Brute Force Algorithm&a…

安全狗V3.512048版本绕过

安全狗安装 安全狗详细安装、遇见无此服务器解决、在windows中命令提示符中进入查看指定文件夹手动启动Apache_安全狗只支持 glibc_2.14 但是服务器是2.17_黑色地带(崛起)的博客-CSDN博客 安全狗 safedogwzApacheV3.5.exe 右键电脑右下角安全狗图标-->选择插件-->安装…

vscode中无法使用git解决方案

1 首先查看git安装目录 where git 2 找到bash.exe 的路径 比如&#xff1a;C:/Users/Wangzd/AppData/Local/Programs/Git/bin/bash 3 找到vscode的配置项setting.json 4 添加 "terminal.integrated.shell.windowns": "C:/Users/Wangzd/AppData/Local/Pr…

架构训练营学习笔记:6-2 微服务基础选型

基础选型 微服务基础设施架构 优先级 其中&#xff0c;核心 就是服务注册、服务发现、服务路由。 模式1-嵌入SDK 模式2-反向代理式 模式3-网络代理式&#xff08;Service Mesh&#xff09; 模式对比 常见微服务框架选择 嵌入SDK-dubbo Spring Cloud 反向代理式 APISIX …

跨境B2B2C多用户购物网站源码快速部署

​ 搭建跨境B2B2C多用户购物网站需要以下步骤&#xff1a; 1. 确定业务模式和定位&#xff1a;确定网站的业务模式&#xff0c;包括跨境B2B2C的商业模式以及目标用户定位。 2. 营业执照和域名注册&#xff1a;根据当地法律要求&#xff0c;注册一家具有法人资格的公司&#xff…

基于Citespace、vosviewer、R语言的文献计量学可视化分析技术及全流程文献可视化SCI论文高效写作方法

跨尺度预测模式&#xff08;The Model for Prediction Across Scales - MPAS&#xff09;是由洛斯阿拉莫斯实验室和美国国家大气研究中心(NCAR)共同开发&#xff0c;其由3个部分组成&#xff0c;分别称为 MPAS-A&#xff08;大气模型&#xff09;、MPAS-O&#xff08;海洋模型&…

一百四十一、Kettle——kettle8.2在Windows本地开启carte服务以及配置子服务器

一、目的 在kettle建好共享资源库后&#xff0c;为了给在服务器上部署kettle的carte服务躺雷&#xff0c;先在Windows本地测试一下怎么玩carte服务 二、Kettle版本以及在Windows本地安装路径 kettle版本是8.2 pdi-ce-8.2.0.0-342 kettle本地安装路径是D:\j…

全面讲解最小二乘法

常见的最小二乘法我们就不多说了&#xff0c;下面主要介绍一下最小二乘法的一些先进方法。 正则化的最小二乘法 在使用常见的最小二乘法进行回归分析时&#xff0c;常常会遇到过拟合的问题&#xff0c;也就是在训练数据集上表现的很好&#xff0c;但是在测试数据集上表现的很…

【Maven】常用命令、插件管理、私服nexus

【Maven】常用命令、插件管理、私服nexus 常用命令 插件管理 私服nexus Nexus3 配置私服 项目pom中的配置 发布时区分正式版、快照版 常用命令 Maven提供了一系列常用命令&#xff0c;用于构建、测试和管理项目。以下是一些常用的Maven命令示例&#xff1a; mvn clean:…

Cadence学习

Cadence学习 Cadence内容涵盖Cadence主要功能Cadence功能模块Allegro Design Entry CIS 和 OrCAD Capture CIS 的区别Cadence 公司简介Allegro Design Entry CISOrCAD Capture CIS OrCAD中part和database part区别OrCAD中不同页面的连接关系应该怎么处理&#xff08;1&#xff…

【Unity3D】消融特效

1 前言 选中物体消融特效中基于 Shader 实现了消融特效&#xff0c;本文将基于 Shader Graph 实现消融特效&#xff0c;两者原理一样&#xff0c;只是表达方式不同&#xff0c;另外&#xff0c;选中物体消融特效中通过 discard 丢弃片元&#xff0c;本文通过 alpha 测试丢弃片元…

【华秋推荐】物联网入门学习模块 ESP8266

随着全球信息技术的不断进步和普及&#xff0c;物联网成为当今备受关注的技术热点之一。通过物理和数字设备之间的连接来实现自动化和互联互通的网络。无线传感器、云计算和大数据分析等技术&#xff0c;物联网使设备能够相互交流和共享信息&#xff0c;实现智能化的自动化操作…

RocketMQ第二课-核心编程模型以及生产环境最佳实践

一、回顾RocketMQ的消息模型 ​ 上一章节我们从试验整理出了RocketMQ的消息模型&#xff0c;这也是我们使用RocketMQ时最直接的指导。 二、深入理解RocketMQ的消息模型 1、RocketMQ客户端基本流程 <dependency><groupId>org.apache.rocketmq</groupId>&…