当前位置: 首页 > news >正文

servlet的三个重要的类(httpServlet 、httpServletRequst、 httpServletResponse)

一、httpServlet 

写一个servlet代码一般都是要继承httpServlet 这个类,然后重写里面的方法

但是它有一个特点,根据之前写的代码,我们发现好像没有写main方法也能正常执行。

原因是:这个代码不是直接运行的,而是放到tomcat上运行的

换句话说,tomcat里就有main方法

1.httpServlet的几个主要方法

init方法是初始化操作

service 收到http请求的时候调用(一般会被doGet/doPost替代)

destroy当不在使用httpServlet实例的时候,调用,来销毁实例(释放资源)

        以上三个描述了 servlet的声明周期(经典面试题),就是描述一下这三个方法,什么时间干什么事(调用什么方法)。(在实际开发中,很少会用到,一般都是出现在面试题中)

初始化执行init方法,每次收到http请求调用 service方法,结束前执行destroy方法释放资源

        除了init方法,其他方法都可以在子类中重写,并且重写后,不用手动调用,tomcat会在何时机自动调用

        destroy方法,大概率事执行不到的。一个servlet 不用了,说明tomcat要关闭了

tomcat关闭有两种方式:

        1.直接干掉tomcat 进程(比如直接在任务管理器中 结束任务 , 或者直接点 叉关闭),完全来不及调用destroy。

        2.通过8005 管理端口,给tomcat 发送一个“停机”指令,这个时候是能执行到destroy的。

       但是通常,都是用第一种方式(直接干掉进程)来关闭servlet的。

使用HttpServlet类

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 java.io.IOException;
@WebServlet("/method") //指定路径
public class MethodServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("doPost");//控制台中打印resp.getWriter().write("doPost");//http的响应内容,显示在浏览器上}@Overrideprotected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("doPut");//控制台中打印resp.getWriter().write("doPut");//http的响应内容,显示在浏览器上}protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println("doDelete");//控制台中打印resp.getWriter().write("doDelete");//http的响应内容,显示在浏览器上}
}

二、HttpServletRequest类

     可以发现HttpServletRequest的方法里面,都是get方法(读方法),没有set方法(写方法)

        原因是,当前拿到的HttpServletRequest,这里的数据是来自于客户端发来的。这些数据的内容是已经确定下来了,程序员是不应该修改的。

(这种框架做出了限制,避免了程序员不小心把原有的请求修改坏的情况了)

经常将URI 、URL混着用

URI :统一资源标识符(相当于身份证号)

URL:统一资源定位符(相当于住址)

1)使用HttpServletRequest类的方法

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 java.io.IOException;
import java.util.Enumeration;@WebServlet("/show")
public class ShowRequestServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//调用上述api,把得到的结果构造成一个字符串,统一返回给客户端StringBuilder stringBuilder = new StringBuilder();//使用stringBuilder把HTTP请求中的数据记录下来stringBuilder.append(req.getProtocol());//获取HTTP协议版本stringBuilder.append("<br>");//html中的换行stringBuilder.append(req.getMethod());//获取HTTP请求方法(get/post)stringBuilder.append("<br>");stringBuilder.append(req.getRequestURI());//获取链接地址stringBuilder.append("<br>");stringBuilder.append(req.getContextPath());//获取一级地址stringBuilder.append("<br>");stringBuilder.append(req.getQueryString());//获取quary stringstringBuilder.append("<br>");//获取所有的 headerEnumeration<String> headernames = req.getHeaderNames();while(headernames.hasMoreElements()){String key = headernames.nextElement();String value = req.getHeader(key);stringBuilder.append(key + ":" + value + "<br>");}//返回响应是,一定要做的事情,告诉浏览器,当前是啥类型resp.setContentType("text/html;charset=utf8");//将stringBuild中的内容以字符串形式返回到响应中resp.getWriter().write(stringBuilder.toString());}
}

如果不写query string这里的a和b,那么这里就是a=1&b=2这里就是null 

2)获取Patameter(query string)

query string是url中 ?a=1&b=2 这种格式,是以键值对形式存在的

其中a 和 b 就是键值对的key,是由程序员自定的

前后端交互有三种方式:

一种是query string ,form表单,json格式(主流)

三种都差不多,具体用那种看个人习惯,以及公司既定的代码风格

servlet 天然支持 query string 和 form表单,而json本身是不支持的,但是可以引入第三方库

1.GET请求

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 java.io.IOException;@WebServlet("/getParameter")
public class GetParameterServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//此处约定:请求中给定的query string 例如:username=zhangsan&password=123//上述 query string,就会被tomcat 给自动解析成一个 Map 这样的结构//getParameter 就是在查询 Map<String,String>里的内容String username = req.getParameter("username");String password = req.getParameter("password");//就可以拿到这些内容之后,做一些其他的任意处理System.out.println("username =" + username);System.out.println("password =" + password);resp.setContentType("text/html charset=utf-8");resp.getWriter().write("ok");}}

不写string是这里是null 

当写了我们自定义的username和password的时候,这里就能看见显示的query string的内容了

但是有一个需要注意的点:

当传入的query string的时候如果涉及到中文字符,需要用urlencode去进行编码

(如果不进行urlencode编码,有些浏览器可能无法识别,导致一些错误)

encode之后的结果发送给浏览器,浏览器能自动识别并进行urldecode解码

 

2.POST请求

import com.sun.prism.PresentableState;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 java.io.IOException;@WebServlet("/postParameter")
public class PostParameterServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//约定:前端构造形如这样的请求://POST / postParameter//Content-Type:x-www-form-urlencoded////username=zhangsan&password=123//就需要在后端代码中,把body中的值 给拿到//获取值的方法,仍然是 getParameterString username = req.getParameter("username");String password = req.getParameter("password");System.out.println("username=" + username);System.out.println("password=" + password);resp.setContentType("text/html;charset=utf8");resp.getWriter().write("okk");}
}

3)引入json的第三方库(jackson)

1.json的第三方库有很多,Jackson是spring官方推荐的库,也被spring集成起来了,对于后期学习spring比较方便

版本没有要求(也没有必要太新,稳定就行 选择2.15.0)

将这个代码点击,复制粘贴到pom.xml里,点击maven的刷新键,完成json第三方库安装

2.使用jackson(一个类,两个方法)

一个类:ObjectMapper 对象映射器 
两个方法
1-把json字符串,映射成一个Java对象。readValue
Request request = objectMapper.readValue(req.getInputStream(),Request.class);//Request.class 类对象(反射)
2-把一个Java对象,映射成json字符串 writeValueAsString
String respJson = objectMapper.writeValueAsString(response);

网络传输,使用json字符串。Java代码中各种逻辑,使用Java对象。

站在服务器的角度,收到的请求,就是json字符串,就需要把json字符串,先映射成Java对象,

再进行一系列的业务逻辑处理。处理完之后,可能还需要把得到的Java对象,映射会json字符串,并通过响应来返回。

import com.fasterxml.jackson.databind.ObjectMapper;
import com.sun.org.apache.regexp.internal.RE;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 java.io.IOException;//把 json格式的字符串请求 映射后的 Java对象
class Request{public String username;public String password;
}
class Response{public boolean ok;
}
@WebServlet("/json")
public class JsonParameterServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//此处的约定请求格式如下://POST /json//Content-Type:application/json////{//  username:"zhangsan",//  password:"123"//}//此处也约定响应的格式(也按照 json 来组织)://{//  ok:true//}//把请求的 body 按照 json 格式解析成java对象ObjectMapper objectMapper = new ObjectMapper();Request request = objectMapper.readValue(req.getInputStream(),Request.class);//Request.class 类对象(反射)System.out.println("username=" + request.username);System.out.println("password" + request.password);Response response = new Response();response.ok = true;//把响应对象转成 json 字符串String respJson = objectMapper.writeValueAsString(response);resp.setContentType("application/json;charset=utf8");//设置字符集resp.getWriter().write(respJson);//返回json格式的字符串}
}

4)总结:如何进行前后端交互?如何获取前端传来的数据?

1.query string ( 使用 getParameter这个方法)

2.form表单  ( 使用 getParameter这个方法)

3.json(实际常用,导入json 的库 jackson,使用objectMapper对象和json方法)

三、HttpServletResponse类

主要方法

 1)setStatus设置状态码 和 sendError 设置状态码同时设置body返回的内容

1.setStatus设置状态码

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 java.io.IOException;@WebServlet("/Status")
public class StatusServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.setStatus(404);//设置状态码为404 not found 找不到}
}

  

光有状态码,body里面没有内容,是空的,对用户不太友好,浏览器里什么内容也没有,不知道到底出现了什么问题

2.sendError 设置状态码同时设置body返回的内容

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 java.io.IOException;@WebServlet("/Status")
public class StatusServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        resp.setStatus(404);//设置状态码为404 not found 找不到resp.sendError(404,"哎呀~网页找不到啦~是不是出现问题啦?");}
}

 可以看到设置了状态码404 同时还设置了 提示内容

这个页面就是sendError生成的

2)通过setHeader属性,给响应中设置一些特殊的header

1.设置 refresh:1,让浏览器每秒刷新一次

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 java.io.IOException;@WebServlet("/refresh")
public class RefreshServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.setHeader("refresh","1");//refresh浏览器刷新,1为时间,每一秒刷新一次resp.getWriter().write(" "+System.currentTimeMillis());//在浏览器显示当前时间}
}

观察发现好像每次并没有精确1s刷新,可能是一秒多一点

原因是:浏览器响应也需要时间,所以比原有的1s多一些

 2.构造重定向响应

1-状态码是 3开头(例如:302)

2-header 需要有一个Location属性,描述要跳转到哪里

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 java.io.IOException;@WebServlet("/redirect")
public class RedirectServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//方法一resp.setStatus(302);resp.setHeader("Location","http://www.baidu.com");//重定向/redirect这个网页到 www.baidu.com//方法二resp.sendRedirect("http://www.baidu.com");//两者效果一致}
}

(这几个类学完,就可以愉快的进行接下来的简单网站啦~~)

相关文章:

servlet的三个重要的类(httpServlet 、httpServletRequst、 httpServletResponse)

一、httpServlet 写一个servlet代码一般都是要继承httpServlet 这个类&#xff0c;然后重写里面的方法 但是它有一个特点&#xff0c;根据之前写的代码&#xff0c;我们发现好像没有写main方法也能正常执行。 原因是&#xff1a;这个代码不是直接运行的&#xff0c;而是放到…...

【软考】设计模式之命令模式

目录 1. 说明2. 应用场景3. 结构图4. 构成5. 优缺点5.1 优点5.2 缺点 6. 适用性7.java示例 1. 说明 1.命令模式&#xff08;Command Pattern&#xff09;是一种数据驱动的设计模式。2.属于行为型模式。3.请求以命令的形式被封装在对象中&#xff0c;并传递给调用对象。4.调用对…...

波奇学Linux:ip协议

ip报头是c语言的结构体 报头和有效载荷如何分离&#xff1f; 固定长度四位首部长度 4位版本号就是IPV4 8位服务类型&#xff1a;4位TOS位段和位保留字段 4位TOS分别表示&#xff1a;最小延时&#xff0c;最大吞吐量&#xff0c;最高可靠性&#xff0c;最小成本 给路由器提…...

Efficient Multimodal learning from data-centric perspective

[MLLM-小模型推荐-2024.3.18] Bunny 以数据的眼光看问题 - 知乎近期几天会梳理下多模态小模型相关的论文&#xff0c;做个汇总。为了能够每天更新点啥&#xff0c;先穿插一些小模型算法。等到全部算法都梳理完成后&#xff0c;再发布一篇最终汇总版本的。 3.15 号 BAAI 发布了 …...

ubuntu下交叉编译ffmpeg到目标架构为aarch架构的系统

Ubuntu下FFmpeg的aarch64-linux-gnu架构交叉编译教程 一、前言 有时候真的很想报警的&#xff0c;嵌入式算法部署花了好多时间了&#xff0c;RKNN 1808真是问题不少&#xff1b;甲方那边也是老是提新要求&#xff0c;真是受不了。 由于做目标检测&#xff0c;在C代码中有对视…...

【Linux C | 多线程编程】线程同步 | 条件变量(万字详解)

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; ⏰发布时间⏰&#xff1a;2024-04-15 0…...

【高阶数据结构】哈希表 {哈希函数和哈希冲突;哈希冲突的解决方案:开放地址法,拉链法;红黑树结构 VS 哈希结构}

一、哈希表的概念 顺序结构以及平衡树 顺序结构以及平衡树中&#xff0c;元素关键码与其存储位置之间没有对应的关系。因此在查找一个元素时&#xff0c;必须要经过关键码的多次比较。顺序查找时间复杂度为O(N)&#xff1b;平衡树中为树的高度&#xff0c;即O(log_2 N)&#xf…...

嵌入式之计算机网络篇(七)

七、计算机网络 1.说说计算机网络五层体系结构 计算机网络的五层架构包括应用层、传输层、网络层、数据链路层和物理层。 应用层&#xff1a;是网络结构中的最高层&#xff0c;负责向用户提供网络服务&#xff0c;如文件传输、电子邮件、远程登录等。常见的应用层协议有HTTP…...

C++|运算符重载(1)|为什么要进行运算符重载

写在前面 本篇里面的日期类型加法&#xff0c;先不考虑闰年&#xff0c;平年的天数&#xff0c;每月的天数统一按30天算&#xff0c;那么每一年也就是360天 目录 写在前面 定义 基本数据类型 自定义数据类型 成员函数解决相加问题 Date类&#xff0b;整形 下一篇----运…...

【ARM 裸机】汇编 led 驱动之烧写 bin 文件

1、烧写概念 bin 文件烧写到哪里呢&#xff1f;使用 STM32 的时候烧写到内部 FLASH&#xff0c;6ULL 没有内部 FLASH&#xff0c;是不是就不能烧写呢&#xff1f;不&#xff0c;6ULL 支持 SD卡、EMMC、NAND FLASH、NOR FLASH 等方式启动&#xff0c;在裸机学习的工程中&#x…...

计算机网络之CIDR

快速了解CIDR CIDR 表示的是什么&#xff1f; 单个IP地址&#xff1a;当你看到一个CIDR表示法&#xff0c;如192.168.1.1/32&#xff0c;它表示一个单独的具体IP地址。/32表示所有32位都是网络部分&#xff0c;没有主机部分&#xff0c;因此它指的是单一的IP地址。 一个IP地址…...

【无标题】系统思考—智慧共赢座谈会

第432期JSTO—“智慧共赢座谈会”精彩回顾 我们身处一个快速变化的世界&#xff0c;其中培训和咨询行业也不断面临新的挑战和机遇。为了紧跟这些变革&#xff0c;我们邀请了行业专家与合作伙伴深入探讨在培训、交付和销售过程中遇到的难题。 本次座谈会的亮点之一是我们科学上…...

【Linux C | 多线程编程】线程同步 | 互斥量(互斥锁)介绍和使用

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; ⏰发布时间⏰&#xff1a; 本文未经允许…...

mid_360建图和定位

录制数据 roslaunch livox_ros_driver2 msg_MID360.launch使用fast-lio 建图 https://github.com/hku-mars/FAST_LIO.git 建图效果 使用python做显示 https://gitee.com/linjiey11/mid360/blob/master/show_pcd.py 使用 point_lio建图 https://github.com/hku-mars/Point…...

ThreadX在STM32上的移植:通用启动文件tx_initialize_low_level.s

在嵌入式系统开发中&#xff0c;实时操作系统&#xff08;RTOS&#xff09;的选择对于系统性能和稳定性至关重要。ThreadX是一种广泛使用的RTOS&#xff0c;它以其小巧、快速和可靠而闻名。在本文中&#xff0c;我们将探讨如何将ThreadX移植到STM32微控制器上&#xff0c;特别是…...

【python实战】游戏开发——恐龙跳跃小游戏

目录 背景开发环境步骤初步搭建主窗口的实现地平线滑动场景小恐龙跳跃障碍物出现碰撞检测和积分功能优化改为随时可以跳跃源码参考背景 小恐龙沿着地平线前进,遇到障碍物跳跃,躲避障碍物。根据躲避的障碍物进行积分统计。 开发环境 开发环境:Windows10 软件:pycharm 开发…...

成都百洲文化传媒有限公司电商领域的新锐力量

在电商服务领域&#xff0c;成都百洲文化传媒有限公司凭借其专业的服务理念和创新的策略&#xff0c;正逐渐成为行业内的翘楚。这家公司不仅拥有资深的电商团队&#xff0c;还以其精准的市场定位和高效的服务模式&#xff0c;赢得了众多客户的信赖和好评。 一、专业团队&#…...

1042: 中缀表达式转换为后缀表达式

解法&#xff1a;直接给算法 创建一个栈和一个空的后缀表达式字符串。 遍历中缀表达式中的每个字符。 如果当前字符是操作数&#xff0c;直接将其添加到后缀表达式字符串中。 如果当前字符是操作符&#xff0c;需要将其与栈顶的操作符进行比较&#xff1a; 如果栈为空&#…...

避免上下文切换--Linux原子函数

在现代操作系统中&#xff0c;原子函数是一类特殊的函数&#xff0c;它们能够保证在并发环境中执行的操作是不可分割的。这意味着一旦一个原子函数开始执行&#xff0c;它的操作会在任何其他线程或进程可以介入之前完全完成。这是通过多种机制实现的&#xff0c;包括硬件支持的…...

塔面板php7.37.4版本不支持ZipArchive手工安装扩展方法

centos 7 宝塔面板安装的PHP7.3和7.4默认已经不带zip扩展&#xff0c;要手工安装zip扩展首先需要安装libzip&#xff0c; yum -y install libzip 方法如下&#xff1a; 宝塔面板php7.3版本在SSH命令行界面执行以下语句&#xff1a; cd /www/server/php/73/src/ext/zip/ /ww…...

go语言并发实战——日志收集系统(一) 项目前言

-goroutine- 简介 go并发编程的练手项目 项目背景 一般来说业务系统都有自己的日志,当系统出现问题时,我们一般需要通过日志信息来定位与解决问题&#xff0c;当系统机器较少时我们可以登录服务器来查看,但是当系统机器较多时,我们通过服务器来查看日志的成本就会变得很大,…...

Android Studio 之 Intent及其参数传递

一、Intent 显式Intent&#xff1a;通过组件名指定启动的目标组件,比如startActivity(new Intent(A.this,B.class)); 每次启动的组件只有一个~隐式Intent:不指定组件名,而指定Intent的Action,Data,或Category,当我们启动组件时, 会去匹配AndroidManifest.xml相关组件的Intent-…...

【黑马头条】-day06自媒体文章上下架-Kafka

文章目录 今日内容1 Kafka1.1 消息中间件对比1.2 kafka介绍1.3 kafka安装及配置1.4 kafka案例1.4.1 导入kafka客户端1.4.2 编写生产者消费者1.4.3 启动测试1.4.4 多消费者启动 1.5 kafka分区机制1.5.1 topic剖析 1.6 kafka高可用设计1.7 kafka生产者详解1.7.1 同步发送1.7.2 异…...

非线性特征曲线线性化插补器(CODESYS 完整ST代码)

1、如何利用博途PLC和信捷PLC实现非线性特征曲线的线性化可以参考下面文章链接: 非线性特征曲线线性化(插补功能块SCL源代码+C代码)_scl直线插补程序-CSDN博客文章浏览阅读382次。信捷PLC压力闭环控制应用(C语言完整PD、PID源代码)_RXXW_Dor的博客-CSDN博客闭环控制的系列文章…...

vue3从精通到入门4:diff算法的实现

Vue 3 的 diff 算法相较于 Vue 2 有了一些改进和优化&#xff0c;主要是为了应对更复杂的组件结构和更高的性能需求。 以下是 Vue 3 diff 算法在处理列表更新时的大致步骤&#xff1a; 头头比较&#xff1a;首先&#xff0c;比较新旧列表的头节点&#xff08;即第一个节点&…...

(三)C++自制植物大战僵尸游戏项目结构说明

植物大战僵尸游戏开发教程专栏地址http://t.csdnimg.cn/ErelL 一、项目结构 打开项目后&#xff0c;在解决方案管理器中有五个项目&#xff0c;分别是libbox2d、libcocos2d、librecast、libSpine、PlantsVsZombies五个项目&#xff0c;除PlantsVsZombies外&#xff0c;其他四个…...

动态规划专练( 279.完全平方数)

279.完全平方数 给你一个整数 n &#xff0c;返回 和为 n 的完全平方数的最少数量 。 完全平方数 是一个整数&#xff0c;其值等于另一个整数的平方&#xff1b;换句话说&#xff0c;其值等于一个整数自乘的积。例如&#xff0c;1、4、9 和 16 都是完全平方数&#xff0c;而 …...

京东商品详情API接口(商品属性丨sku价格丨详情图丨标题等数据)

京东商品详情API接口是京东开放平台提供的一种API接口&#xff0c;通过调用该接口&#xff0c;开发者可以获取京东商品的标题、价格、库存、月销量、总销量、详情描述、图片等详细信息。下面针对您提到的商品属性、SKU价格、详情图以及标题等数据&#xff0c;做具体介绍&#x…...

Springboot+Vue项目-基于Java+MySQL的校园周边美食探索及分享平台系统(附源码+演示视频+LW)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &…...

折叠面板组件(vue)

代码 <template><div class"collapse-info"><div class"collapse-title"><div class"title-left">{{ title }}</div><div click"changeHide"> <Button size"small" v-if"sho…...