Java后端开发——SpringMVC商品管理程序

Java后端开发——SpringMVC商品管理程序

今日目标

  • Spring MVC框架介绍
  • 掌握SpringMVC的核心类的原理及配置
  • 掌握SpringMVC的常用注解
  • 掌握SpringMVC的增删改查编程

Spring MVC框架介绍

Spring MVC(Model-View-Controller)是一个基于Java的开源框架,用于构建Web应用程序。它提供了一种模型-视图-控制器架构模式,通过这种模式,开发人员可以将应用程序分成三个部分:

1.模型(Model):表示应用程序的业务逻辑和数据。通常包括数据库交互、数据处理以及其他与数据相关的操作。在Spring MVC中,模型可以是一个POJO(Plain Old Java Object)或者一个使用Spring框架的类。
2.视图(View):负责渲染模型数据并展示给用户。它可以是JSP(JavaServer Pages)、Thymeleaf模板、FreeMarker模板或其他类型的UI模板。
3.控制器(Controller):充当应用程序的中心枢纽,处理用户请求并相应地更新模型和视图。它接收来自用户的请求,调用相应的业务逻辑来处理这些请求,并最终选择合适的视图展示给用户。

Spring MVC的工作流程通常如下:

4.用户发送HTTP请求至Spring的DispatcherServlet。
5.DispatcherServlet根据请求中的URL找到对应的Handler(控制器)。
6.Handler处理请求,调用业务逻辑并返回一个ModelAndView对象。
7.DispatcherServlet根据ModelAndView选择相应的视图。
8.最终,视图渲染模型数据,将结果返回给用户。

通过将应用程序分离成模型、视图和控制器,Spring MVC提供了松耦合、模块化和可维护的Web应用程序开发方式。它也提供了丰富的功能,如表单处理、数据验证、拦截器等,使得开发者能够更高效地构建健壮的Web应用。

一、Spring MVC入门程序

1.Eclipse创建web项目,勾选创建web.xml配置文件

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0"><display-name>myspringmvc</display-name><welcome-file-list><welcome-file>index.html</welcome-file><welcome-file>index.jsp</welcome-file><welcome-file>index.htm</welcome-file><welcome-file>default.html</welcome-file><welcome-file>default.jsp</welcome-file><welcome-file>default.htm</welcome-file></welcome-file-list>
<filter><filter-name>encoding</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>utf-8</param-value></init-param>
</filter>
<filter-mapping><filter-name>encoding</filter-name><url-pattern>/*</url-pattern>
</filter-mapping><servlet><servlet-name>dispatcher</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>dispatcher</servlet-name><url-pattern>/</url-pattern></servlet-mapping></web-app>

在这里插入图片描述
2.添加Spring MVC 依赖引入
在这里插入图片描述
3.web.xml添加DispatcherServlet 声明

<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>

在这里插入图片描述

4.添加SpringMVC配置文件
添加springmvc配置文件,在WEB-INF目录下,创建配置文件dispatcher-servlet.xml,并在文件中配置控制器信息。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
https://www.springframework.org/schema/mvc/spring-mvc.xsd">
<context:component-scan base-package="com.javaweb.controller"/> <!-- 声明注解扫描 --> 
<mvc:default-servlet-handler/> <!-- 启用默认Servlet处理静态资源 -->
<mvc:annotation-driven/> <!-- 开启 SpringMVC 的注解模式 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- 视图解析器 -->
<property name="prefix" value="/WEB-INF/jsp/"></property>
<property name="suffix" value=".jsp"></property>
</bean> 
</beans>

在这里插入图片描述
5.创建控制器类HelloController
在包com.javaweb.controller中,创建控制器类HelloController:

package com.javaweb.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;@Controller
public class HelloController {@RequestMapping("/hello")public String sayHello() {System.out.println("Hello SpringMVC!");return "hello";}
}

在这里插入图片描述
6.添加视图jsp页面
添加视图页面:hello.jsp,在WEB-INF目录下,创建一个jsp文件夹,并在文件夹中创建一个页面文件hello.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
Hello SpringMVC!
</body>
</html>

在这里插入图片描述
7.测试
启动项目并测试。

http://localhost:8080/myspringmvc/hello

在这里插入图片描述
控制台打印的信息
在这里插入图片描述

二、Spring MVC九九乘法口诀表

1.在com.javaweb.bean包创建Multable.java

 package com.javaweb.bean;public class Multable {
private int num;
public int getNum() {return num;}
public void setNum(int num) {this.num = num;}
public String print() {
String str="";
for (int i = 1; i <= num; i++) {
for (int j = 1; j <= i; j++) {
str += j + "*" + i + "=" + (i * j);
str += "&nbsp;&nbsp;&nbsp";
}
str += "<br>";
}
return str;
}}

在这里插入图片描述
2.在com.javaweb.controller创建MultableController.java,接收参数num,并调用Multable完成口诀表计算,得到结果在model中缓存,转发到result.jsp页面显示

package com.javaweb.controller;import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;import com.javaweb.bean.Multable;@Controller
public class MultableController {@RequestMapping("/cal")public String cal(Integer num,Model model) {Multable m=new Multable();m.setNum(num);String result=m.print();model.addAttribute("result", result);return "result";}}

在这里插入图片描述
3.在WEB-INF/jsp文件夹中创建result.jsp,显示计算结果。
result.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
${result}
</body>
</html>

在这里插入图片描述
4.在webapps下新建一个mulform.html页面,让用户输入阶数提交给服务器计算。

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h3>乘法口诀表</h3>
<form action="/myspringmvc/cal">
阶数:<input type="text" name="num"/> 
<input type="submit" value="提交"/> 
</form>
</body>
</html>

在这里插入图片描述
5.启动服务器并预览结果
启动服务器并预览结果。http://localhost:8080/myspringmvc/mulform.html
在这里插入图片描述
测试一下阶数为9:
在这里插入图片描述

三、SpringMVC商品管理程序

1.在com.javaweb.bean包里创建Goods.java

package com.javaweb.bean;public class Goods {
private int id;
private String name;
private String cover;
private String image1;
private String image2;
private float price;
private String intro;
private int stock;
private int type_id;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCover() {
return cover;
}
public void setCover(String cover) {
this.cover = cover;
}
public String getImage1() {
return image1;
}
public void setImage1(String image1) {
this.image1 = image1;
}
public String getImage2() {
return image2;
}
public void setImage2(String image2) {
this.image2 = image2;
}
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
}
public String getIntro() {
return intro;
}
public void setIntro(String intro) {
this.intro = intro;
}
public int getStock() {
return stock;
}
public void setStock(int stock) {
this.stock = stock;
}
public int getType_id() {
return type_id;
}
public void setType_id(int type_id) {
this.type_id = type_id;
}}

在这里插入图片描述

2.在com.javaweb.controller包里创建GoodsController.java

package com.javaweb.controller;import java.sql.SQLException;
import java.util.List;import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;import com.javaweb.bean.Goods;
import com.javaweb.dao.goodsDao;
import com.javaweb.utils.Page;@Controller
@RequestMapping("/goods")
public class GoodsController {	goodsDao goodsDao=new goodsDao();@PostMapping("/add")public String add(Goods goods) {System.out.println(goods.getId()+" | "+goods.getName()+" | "+goods.getPrice());try {goodsDao.insert(goods);} catch (SQLException e) {e.printStackTrace();}return "redirect:find";}@GetMapping("/findByPage")public String findByPage(@RequestParam(value = "type", defaultValue = "0") Integer type,@RequestParam(value = "pageNumber", defaultValue = "1") Integer pageNumber,Model model) {if (pageNumber <= 0)pageNumber = 1;int pageSize = 5;List<Goods> glist = null;int totalCount = 0;try {glist = goodsDao.findByTypeID(type, pageNumber, pageSize);totalCount = goodsDao.getCountByTypeID(type);} catch (SQLException e) {e.printStackTrace();}Page<Goods> p = new Page<Goods>(pageNumber, pageSize, totalCount);p.setList(glist);model.addAttribute("p", p);return "goods_list_page";}@GetMapping("/delete")public String delete(Integer id) {try {goodsDao.delete(id);} catch (SQLException e) {e.printStackTrace();}return "redirect:find";}@GetMapping("/findById")public String findById(Integer id,Model model) {Goods g=null;try {g=goodsDao.findById(id);} catch (SQLException e) {e.printStackTrace();}model.addAttribute("g", g);return "goods_edit";}@GetMapping("/find")public String find(@RequestParam(value = "type",defaultValue = "0") Integer type,Model model) {List<Goods> glist=null;try {glist=goodsDao.findByTypeID(type);model.addAttribute("glist",glist);} catch (SQLException e) {e.printStackTrace();}return "goods_list";	}@PostMapping("/update")public String update(Goods goods) {try {goodsDao.update(goods);} catch (SQLException e) {e.printStackTrace();}return "redirect:/goods/find";}}

在这里插入图片描述
3.完成add()方法,实现参数接收、类型转换和自动封装成Goods对象

@PostMapping("/add")
public String add(Goods goods) {System.out.println(goods.getId()+" | "+goods.getName()+" | "+goods.getPrice());return "";
}

4.添加商品添加页面:goods_add.jsp页面

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="stylesheet" href="${pageContext.request.contextPath}/css/bootstrap.css" />
</head>
<body>
<div class="container-fluid">
<h3>添加商品页面</h3>
<br><br>
<form class="form-horizontal" action="${pageContext.request.contextPath}/goods/add" method="post">
<div class="form-group">
<label for="input_name" class="col-sm-1 control-label">名称</label>
<div class="col-sm-6">
<input type="text" class="form-control" id="input_name" name="name" required="required">
</div>
</div>
<div class="form-group">
<label for="input_name" class="col-sm-1 control-label">价格</label>
<div class="col-sm-6">
<input type="text" class="form-control" id="input_name" name="price" >
</div>
</div>
<div class="form-group">
<label for="input_name" class="col-sm-1 control-label">介绍</label>
<div class="col-sm-6">
<input type="text" class="form-control" id="input_name" name="intro" >
</div>
</div>
<div class="form-group">
<label for="input_name" class="col-sm-1 control-label">库存</label>
<div class="col-sm-6">
<input type="text" class="form-control" id="input_name" name="stock" >
</div>
</div>
<div class="form-group">
<label for="input_file" class="col-sm-1 control-label">封面图片</label>
<div class="col-sm-6">
<input type="text" name="cover" id="input_file" required="required">推荐尺寸: 500 * 500
</div>
</div>
<div class="form-group">
<label for="input_file" class="col-sm-1 control-label">详情图片1</label>
<div class="col-sm-6">
<input type="text" name="image1" id="input_file" required="required">推荐尺寸: 500 * 500
</div>
</div>
<div class="form-group">
<label for="input_file" class="col-sm-1 control-label">详情图片2</label>
<div class="col-sm-6">
<input type="text" name="image2" id="input_file" required="required">推荐尺寸: 500 * 500
</div>
</div>
<div class="form-group">
<label for="select_topic" class="col-sm-1 control-label">类目</label>
<div class="col-sm-6">
<select class="form-control" id="select_topic" name="type_id">
<option value="1">食品</option>
<option value="2">生活用品</option>
<option value="3">学习用品</option>
</select>
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-1 col-sm-10">
<button type="submit" class="btn btn-success">提交保存</button>
</div>
</div>
</form>
</div>
</body>
</html>

在这里插入图片描述

在这里插入图片描述
5.测试商品表单数据接收
插入一条数据,数据内容全部为1:
在这里插入图片描述

提交保存,控制台打印信息,发现数据添加成功!
在这里插入图片描述
6.在web.xml文件中配置Spring为我们提供的编码过滤器
使用Spring为我们提供的编码过滤器,在web.xml文件中配置

<filter><filter-name>encoding</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>utf-8</param-value></init-param>
</filter>
<filter-mapping><filter-name>encoding</filter-name><url-pattern>/*</url-pattern>
</filter-mapping>

在这里插入图片描述
7.在WEB-INF/lib中引入上一个实验的MVC商品管理系统的jar包
引入商品管理系统的库
在这里插入图片描述
8.在src下引入商品C3P0配置文件c3p0-config.xml
引入商品C3P0配置文件c3p0-config.xml,存放在src下,我的数据库账号和密码都是root

<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<default-config>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">
jdbc:mysql://localhost/db_mygoods?useSSL=false&amp;serverTimezone=UTC&amp;useUnicode=true&amp;characterEncoding=utf-8
</property>
<property name="user">root</property>
<property name="password">root</property>
<property name="checkoutTimeout">30000</property>
<property name="initialPoolSize">5</property>
<property name="maxIdleTime">30</property>
<property name="maxPoolSize">10</property>
<property name="minPoolSize">2</property>
<property name="maxStatements">200</property>
</default-config>
</c3p0-config>9.引入com.javaweb.utils.DataSourceUtils文件
package com.javaweb.utils;import java.sql.Connection;
import java.sql.SQLException;import javax.sql.DataSource;import com.mchange.v2.c3p0.ComboPooledDataSource;public class DataSourceUtils {private static DataSource ds=new ComboPooledDataSource();public static DataSource getDataSource(){return  ds;}public static Connection getConnection() throws SQLException {return ds.getConnection();}
}

在这里插入图片描述
10.引入com.javaweb.utils.Page文件

package com.javaweb.utils;import java.util.List;import com.javaweb.bean.Goods;public class Page<T> {private int pageNumber;private int pageSize;private int totalCount;private int totalPage;private List<T> list;public Page() { }public Page(int pageNumber,int pageSize,int totalCount){this.pageNumber=pageNumber;this.pageSize=pageSize;this.totalCount=totalCount;totalPage= (int)Math.ceil((double)totalCount/pageSize);}public int getPageNumber() {return pageNumber;}public void setPageNumber(int pageNumber) {this.pageNumber = pageNumber;}public int getPageSize() {return pageSize;}public void setPageSize(int pageSize) {this.pageSize = pageSize;}public int getTotalCount() {return totalCount;}public void setTotalCount(int totalCount) {this.totalCount = totalCount;}public int getTotalPage() {return totalPage;}public void setTotalPage(int totalPage) {this.totalPage = totalPage;}public List<T> getList() {return list;}public void setList(List<T> list) {this.list = list;}}

在这里插入图片描述
11.完善add()方法,实现保存数据到数据库中

public class GoodsController {GoodsDao goodsDao=new GoodsDao();@PostMapping("/add")public String add(Goods goods) {System.out.println(goods.getId()+" | "+goods.getName()+" | "+goods.getPrice());try {goodsDao.insert(goods);} catch (SQLException e) {e.printStackTrace();}return "";}

12.测试数据提交和保存
添加一条关于黑糖珍奶的商品信息,提交保存。
在这里插入图片描述
数据插入成功!
在这里插入图片描述
13.完成find()方法,实现查询全部数据

@GetMapping("/find")
public String find(@RequestParam(value = "type",defaultValue = "0") Integer type,Model model) {List<Goods> glist=null;try {glist=goodsDao.findByTypeID(type);model.addAttribute("glist",glist);} catch (SQLException e) {e.printStackTrace();}return "goods_list";	
}

在这里插入图片描述
14.在WEB-INF/jsp创建goods_list.jsp页面,显示查询列表数据
创建goods_list.jsp页面

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="stylesheet" href="${pageContext.request.contextPath}/css/bootstrap.css" />
</head>
<body>
<div class="container-fluid">
<h3>商品列表页面</h3>
<div class="text-right"><a class="btn btn-warning" href="${pageContext.request.contextPath}/goods_add.jsp">添加商品</a></div>
<table class="table table-bordered table-hover">
<tr>
<th width="5%">ID</th>
<th width="10%">名称</th>
<th width="10%">价格</th>
<th width="10%">介绍</th>
<th width="10%">库存</th>
<th width="10%">封面图片</th>
<th width="10%">详情图片1</th>
<th width="10%">详情图片2</th>
<th width="10%">类目</th>
<th width="10%">操作</th>
</tr>
<c:forEach items="${glist }" var="g">
<tr>
<td><p>${g.id }</p></td>
<td><p>${g.name }</p></td>
<td><p>${g.price }</p></td>
<td><p>${g.intro }</p></td>
<td><p>${g.stock }</p></td>
<td><p>${g.cover }</p></td>
<td><p>${g.image1 }</p></td>
<td><p>${g.image2}</p></td>
<td><p>${g.type_id }</p></td>
<td>
<a class="btn btn-primary" href="${pageContext.request.contextPath}/goods/findById?id=${g.id}">修改</a>
<a class="btn btn-danger" href="${pageContext.request.contextPath}/goods/delete?id=${g.id}">删除</a>
</td>
</tr>
</c:forEach>
</table>
</div>
</body>
</html>

在这里插入图片描述
15.测试查询全部
启动tomact服务,预览地址:http://localhost:8080/myspringmvc/goods/find
成功测试查询全部商品信息。
在这里插入图片描述
16.完善delete()方法,删除后,再发送查询全部请求

@GetMapping("/delete")public String delete(Integer id) {try {goodsDao.delete(id);} catch (SQLException e) {e.printStackTrace();}return "redirect:find";}

在这里插入图片描述
17.完善findById()方法,查询指定ID记录后,转发到编辑页面

@GetMapping("/delete")
public String delete(Integer id) {
try {
goodsDao.delete(id);
} catch (SQLException e) {
e.printStackTrace();
}
return "redirect:find";
}

在这里插入图片描述
18.在WEB-INF/jsp创建goods_edit.jsp页面,点击商品列表页面的编辑按钮后,转到修改商品页面

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="stylesheet" href="css/bootstrap.css" />
</head>
<body>
<div class="container-fluid">
<h3>添加商品页面</h3>
<br><br>
<form class="form-horizontal" action="${pageContext.request.contextPath}/goods/add" method="post">
<div class="form-group">
<label for="input_name" class="col-sm-1 control-label">名称</label>
<div class="col-sm-6">
<input type="text" class="form-control" id="input_name" name="name" required="required">
</div>
</div>
<div class="form-group">
<label for="input_name" class="col-sm-1 control-label">价格</label>
<div class="col-sm-6">
<input type="text" class="form-control" id="input_name" name="price" >
</div>
</div>
<div class="form-group">
<label for="input_name" class="col-sm-1 control-label">介绍</label>
<div class="col-sm-6">
<input type="text" class="form-control" id="input_name" name="intro" >
</div>
</div>
<div class="form-group">
<label for="input_name" class="col-sm-1 control-label">库存</label>
<div class="col-sm-6">
<input type="text" class="form-control" id="input_name" name="stock" >
</div>
</div>
<div class="form-group">
<label for="input_file" class="col-sm-1 control-label">封面图片</label>
<div class="col-sm-6">
<input type="text" name="cover" id="input_file" required="required">推荐尺寸: 500 * 500
</div>
</div>
<div class="form-group">
<label for="input_file" class="col-sm-1 control-label">详情图片1</label>
<div class="col-sm-6">
<input type="text" name="image1" id="input_file" required="required">推荐尺寸: 500 * 500
</div>
</div>
<div class="form-group">
<label for="input_file" class="col-sm-1 control-label">详情图片2</label>
<div class="col-sm-6">
<input type="text" name="image2" id="input_file" required="required">推荐尺寸: 500 * 500
</div>
</div>
<div class="form-group">
<label for="select_topic" class="col-sm-1 control-label">类目</label>
<div class="col-sm-6">
<select class="form-control" id="select_topic" name="type_id">
<option value="1">食品</option>
<option value="2">生活用品</option>
<option value="3">学习用品</option>
</select>
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-1 col-sm-10">
<button type="submit" class="btn btn-success">提交保存</button>
</div>
</div>
</form>
</div>
</body>
</html>

在这里插入图片描述
点击商品列表页面的编辑按钮后,转到修改商品页面
在这里插入图片描述
在这里插入图片描述
19.完善update方法,更新记录,完成后转发列表页面

	@PostMapping("/update")public String update(Goods goods) {try {goodsDao.update(goods);} catch (SQLException e) {e.printStackTrace();}return "redirect:/goods/find";}

在这里插入图片描述
20.完善分页查询findByPage()方法

@GetMapping("/findByPage")
public String findByPage(@RequestParam(value = "type", defaultValue = "0") Integer type,
@RequestParam(value = "pageNumber", defaultValue = "1") Integer pageNumber,Model model) {
if (pageNumber <= 0)
pageNumber = 1;
int pageSize = 5;
List<Goods> glist = null;
int totalCount = 0;
try {
glist = goodsDao.findByTypeID(type, pageNumber, pageSize);
totalCount = goodsDao.getCountByTypeID(type);
} catch (SQLException e) {
e.printStackTrace();
}
Page<Goods> p = new Page<Goods>(pageNumber, pageSize, totalCount);
p.setList(glist);
model.addAttribute("p", p);
return "goods_list_page";}

在这里插入图片描述

21.在WEB-INF/jsp 创建goods_list_page.jsp页面

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="stylesheet" href="${pageContext.request.contextPath}/css/bootstrap.css" />
</head>
<body>
<div class="container-fluid">
<h3>商品列表页面</h3>
<div class="text-right"><a class="btn btn-warning" href="${pageContext.request.contextPath}/goods_add.jsp">添加商品</a></div>
<table class="table table-bordered table-hover">
<tr>
<th width="5%">ID</th>
<th width="10%">名称</th>
<th width="10%">价格</th>
<th width="10%">介绍</th>
<th width="10%">库存</th>
<th width="10%">封面图片</th>
<th width="10%">详情图片1</th>
<th width="10%">详情图片2</th>
<th width="10%">类目</th>
<th width="10%">操作</th>
</tr>
<c:forEach items="${p.list }" var="g">
<tr>
<td><p>${g.id }</p></td>
<td><p>${g.name }</p></td>
<td><p>${g.price }</p></td>
<td><p>${g.intro }</p></td>
<td><p>${g.stock }</p></td>
<td><p>${g.cover }</p></td>
<td><p>${g.image1 }</p></td>
<td><p>${g.image2}</p></td>
<td><p>${g.type_id }</p></td>
<td>
<a class="btn btn-primary" href="${pageContext.request.contextPath}/goods/findById?id=${g.id}">修改</a>
<a class="btn btn-danger" href="${pageContext.request.contextPath}/goods/delete?id=${g.id}">删除</a>
</td>
</tr>
</c:forEach>
</table>
<br>
<div style='text-align:center;'>
<a class='btn btn-info' <c:if test="${p.pageNumber==1 }">disabled</c:if> <c:if test="${p.pageNumber!=1 }">href="findByPage?pageNumber=1"</c:if>>首页</a>
<a class='btn btn-info' <c:if test="${p.pageNumber==1 }">disabled</c:if> <c:if test="${p.pageNumber!=1 }">href="findByPage?pageNumber=${p.pageNumber-1}"</c:if>>上一页</a>
<h3 style='display:inline;'>[${p.pageNumber }/${p.totalPage }]</h3>
<h3 style='display:inline;'>[${p.totalCount }]</h3>
<a class='btn btn-info' <c:if test="${p.totalPage==0 || p.pageNumber==p.totalPage }">disabled</c:if> <c:if test="${p.pageNumber!=p.totalPage }">href="findByPage?pageNumber=${p.pageNumber+1}"</c:if>>下一页</a>
<a class='btn btn-info' <c:if test="${p.totalPage==0 || p.pageNumber==p.totalPage }">disabled</c:if> <c:if test="${p.pageNumber!=p.totalPage }">href="findByPage?pageNumber=${p.totalPage}"</c:if>>尾页</a>
<input type='text' class='form-control' style='display:inline;width:60px;' value=''/><a class='btn btn-info' href='javascript:void(0);' onclick='location.href="findByPage?pageNumber="+(this.previousSibling.value)'>GO</a>
</div>
</div>
</body>
</html>

在这里插入图片描述
运行服务goods_list_page.jsp,开始测试分页查询findByPage()方法
http://localhost:8080/myspringmvc/goods/findByPage
在这里插入图片描述
测试成功!成功显示分页查询!

后面有时间精力会持续更新更多优质内容,感谢各位的支持!

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

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

相关文章

Linux系统的常见命令十一,文本编辑器(vi和vim)

目录 vi命令vim命令vi命令与vim命令的区别 本文主要介绍Linux系统的文本编辑器命令vi和vim&#xff0c;还有它们之间的区别。 vi命令 vi是Linux和其他类Unix操作系统中最常用的文本编辑器之一&#xff0c;它的功能强大且灵活&#xff0c;可以通过键盘快捷键来完成大量的编辑操…

GANVAEDiffusion

数学基础 KL散度 描绘一个分布p和另一个分布q之间的偏离程度 当 p ( x ) q ( x ) p(x)q(x) p(x)q(x)时散度取得最小值 JS散度 另一种衡量两个概率分布相似性的方法 GAN 需要训练两个网络&#xff1b;损失来回波动&#xff0c;不好分辨&#xff0c;不容易收敛&#xff…

uniapp开发小程序使用axios进行网络请求 uniapp 小程序调试

前言 本篇最好放到项目的【README.md】文件中,方便每次发布的时候检查纠错,毕竟好记性不如烂笔头。而且其他开发者帮忙修改bug、发布新版本的时候,只需要根据这个事项就能实现整个流程的提审发布,提高效率。 1、微信小程序配置 1.1、检查APPID是否正确 测试:wx--------…

Java实现动态加载的逻辑

日常工作中我们经常遇到这样的场景&#xff0c;某某些逻辑特别不稳定&#xff0c;随时根据线上实际情况做调整&#xff0c;比如商品里的评分逻辑&#xff0c;比如规则引擎里的规则。 常见的可选方案有: JDK自带的ScriptEngine 使用groovy&#xff0c;如GroovyClassLoader、Gro…

MacBook macOs安装RabbitMQ【超详细图解】

目录 一、使用brew安装RabbitMQ 二、安装RabbitMQWeb管理界面 三、启动RabbitMQ 一、使用brew安装RabbitMQ 刚好项目要用到RabbitMQ&#xff0c;安装顺便写下安装步骤记录一下以备用 使用brew命令安装&#xff0c;一般Mac会自带这个命令&#xff0c;如没有&#xff0c;…

SQL server-excel数据追加到表

参考文章&#xff1a;SQL server 2019 从Excel导入数据_mssql2019 导入excel数据-CSDN博客 将excel数据导入到SQL server数据库的详细过程 注意&#xff1a;第一行数据默认为数据库表中的字段&#xff0c;所以这个必须要有&#xff0c;否则无法映射导入 问题1&#xff1a;ADD…

YOLOv8独家原创改进:自研独家创新FT_Conv,卷积高效结合分数阶变换

💡💡💡本文自研创新改进:卷积如何有效地和频域结合,引入分数阶傅里叶变换(FrFT)和分数阶Gabor变换(FrGT),最终创新到YOLOv8。 使用方法:1)直接替换原来的C2f;2)放在backbone SPPF后使用;等 推荐指数:五星 在道路缺陷检测任务中,原始map为0.8,FT_Conv为0.82 收…

视频智能分析国标GB28181云平台EasyCVR加密机授权异常是什么原因?

国标GB28181视频汇聚/视频云存储/集中存储/视频监控管理平台EasyCVR能在复杂的网络环境中&#xff0c;将分散的各类视频资源进行统一汇聚、整合、集中管理&#xff0c;实现视频资源的鉴权管理、按需调阅、全网分发、云存储、智能分析等。 近期有用户选择使用加密机进行EasyCVR授…

KaiwuDB 亮相中国国际供应链促进博览会

11月28日&#xff0c;全球首个以供应链为主题的国家级展会——2023 中国国际供应链促进博览会&#xff08;简称“链博会”&#xff09;在北京盛大召开。KaiwuDB 受邀亮相大会&#xff0c;向与会者展示现代数据库技术在数字科技链条中的根基作用&#xff0c;其中分布式多模数据库…

基于springboot实现冬奥会科普平台系统【项目源码+论文说明】

基于SpringBoot实现冬奥会科普平台系统演示 摘要 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理平台应运而生&…

傅里叶变换及其在机器学习中的应用

​​​​​​​一、介绍 傅立叶变换是一种数学技术&#xff0c;在各个科学和工程领域发挥着关键作用&#xff0c;其应用范围从信号处理到量子力学。近年来&#xff0c;它在机器学习领域发现了新的意义。本文探讨了傅里叶变换的基础知识及其在机器学习应用中日益增长的重要性。 …

Nuxt.js:下一代Web开发框架的革命性力量

文章目录 一、Nuxt.js简介二、Nuxt.js的特点1. 集成Vue.js和Node.js2. 自动代码分割和优化3. 服务端渲染&#xff08;SSR&#xff09;4. 强大的路由管理5. 丰富的插件系统 三、Nuxt.js的优势1. 提高开发效率2. 降低维护成本3. 提高用户体验 四、Nuxt.js在实际应用中的案例1. 电…

HNCTF2022Week1 Reverse WP

文章目录 [HNCTF 2022 Week1]超级签到[HNCTF 2022 Week1]贝斯是什么乐器啊&#xff1f;[HNCTF 2022 Week1]X0r[HNCTF 2022 Week1]你知道什么是Py嘛&#xff1f;[HNCTF 2022 Week1]CrackMe[HNCTF 2022 Week1]给阿姨倒一杯Jvav[HNCTF 2022 Week1]Little EndianNSSCTF{Littl3_Endi…

基础算法学习

文章目录 快速排序归并排序二分浮点数二分 高精度BigIntegerBigDecimal 前缀和差分双指针位运算离散化区间合并 快速排序 确定分界点x &#xff08;可以是左边界&#xff0c;右边界&#xff0c;中间随机&#xff09;将小于等于x的数放到左边&#xff0c;大于等于x的放右边递归…

广州华锐视点:3D毒品预防专题教育平台帮助青少年提升拒毒意识

随着科技的不断发展&#xff0c;人们的生活方式也在不断地改变。在这个信息爆炸的时代&#xff0c;传统的普法教育方式已经无法满足人们的需求。为了适应这一变化&#xff0c;越来越多的教育机构开始尝试利用现代科技手段进行普法教育。其中&#xff0c;3D毒品预防专题教育平台…

跨界融合,科技耕耘:MTX基金公司与ICG共塑全球农业科技新景观

在全球经济快速发展的当下&#xff0c;农业科技创新成为了社会进步的重要推动力。MTX基金公司对ICG的投资是在这一背景下的战略决策&#xff0c;不仅寻求经济效益&#xff0c;更承载着改善全球农业生产、实现食品安全与环境保护的使命。 1、战略投资&#xff1a;文化情怀与全球…

开发知识点-Maven包管理工具

Maven包管理工具 SpringBootSpringSecuritydubbo图书电商后台实战-环境设置&#xff08;JDK8, STS, Maven, Spring IO, Springboot&#xff09;点餐小程序Java版本的选择和maven仓库的配置视频管理系统&&使用maven-tomcat7插件运行web工程SpringTool suite——maven项目…

vue2常见的语法糖

Vue.js 2 提供了一些语法糖&#xff08;syntactic sugar&#xff09;来简化常见的操作。以下是一些 Vue.js 2 中常用的语法糖&#xff1a; v-bind 简写&#xff1a; <!-- 完整语法 --> <a v-bind:href"url">Link</a><!-- 简写 --> <a :hr…

【MySQL数据库】SQL查询语句总结

目录 一、查询数据 1.1 基本查询语句 1.2 表单查询 1.3 WHERE子句 1.3.1 IN关键字查询 1.3.2 Between查询范围 1.3.3 Like匹配查询 1.3.4 AND多条件查询&#xff08;等同于&&&#xff09; 1.3.5 OR多条件查询&#xff08;等同于||&#xff09; 1.3.6 LIMIT子句 1.3.7 对…

tsx语法

安装JSX库 安装完之后在vite.config.ts进行插件使用&#xff0c;代码如下&#xff1a; 然后就可以愉快的使用TSX来开发Vue组件了&#xff0c;下面主要说一下SFC和TSX的部分区别。 基本语法对照 defineComponent 和 setup setup中函数的返回值有多种方式&#xff0c;可以直接…