Tomcat服务的部署及配置优化

文章目录

  • 1. Tomcat的相关介绍
    • 1.1 Tomcat简介
    • 1.2 Tomcat的核心组件
      • 1.2.1 Web容器
      • 1.2.2 Servlet容器
      • 1.2.3 JSP容器
    • 1.3 Tomcat的功能组件
      • 1.3.1 connector连接器
      • 1.3.2 container容器
        • 1.3.2.1 子容器及其相关功能
    • 1.4 主要作用
    • 1.5 Tmocat处理请求的过程
  • 2. Tomcata服务部署
    • 2.1 安装并配置JDK
    • 2.2 设置JDK环境变量
    • 2.3 安装Tomcat并用systemctl启动
      • 2.3.1 路径启动
      • 2.3 2 为tomcat添加进systemd服务
  • 3. Tomcat的端口及配置文件
    • 3.1 Tomcat常用端口
    • 3.2 主要目录、文件及其功能
  • 4. 虚拟主机
    • 4.1 作用
    • 4.2 配置虚拟主机(基于域名)
      • 4.2.1 创建 scj 和 shan 项目目录和文件
      • 4.2.2 修改 Tomcat 主配置文件
      • 4.2.3 重启并检测是否成功
  • 5. tomcat 配置优化
    • 5.1 配置文件优化
    • 5.2 内核优化
    • 5.3 JVM优化

1. Tomcat的相关介绍

1.1 Tomcat简介

Tomcat 是 Java 语言开发的,Tomcat 服务器是一个免费的开放源代码的 Web 应用服务器

Tomcat 属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试 JSP 程序的首选。

一般来说,Tomcat 虽然和 Apache 或者 Nginx 这些 Web 服务器一样,具有处理 HTML 页面的功能,然而由于其处理静态 HTML 的能力远不及 Apache 或者 Nginx,所以 Tomcat 通常是作为一个 Servlet 和 JSP 容器,单独运行在后端。

1.2 Tomcat的核心组件

  • Web 容器:完成 Web 服务器的功能。
  • Servlet 容器:名字为 catalina,用于处理 Servlet 代码。
  • JSP 容器:用于将 JSP 动态网页翻译成 Servlet 代码。

1.2.1 Web容器

Tomcat 是 Web 应用服务器,也是一个 Servlet/JSP 容器。Tomcat 作为 Servlet 容器,负责处理客户请求,把请求传送给 Servlet,并将 Servlet 的响应传送回给客户。

1.2.2 Servlet容器

Servlet 是Java Servlet 的简称,可以理解为是一个服务连接器,是用 Java 编写的服务器端程序,具有独立于平台和协议的特性,
简单的理解:servlet 就是一个中间件,包含了接口和方法,将客户端和数据库连接,从而实现动态网页的创建

1.2.3 JSP容器

JSP 全称 Java Server Pages,是一种动态网页开发技术。它使用 JSP 标签在HTML网页中插入 Java 代码。标签通常以 <% 开头,以 %> 结束。

JSP 是一种 Java servlet,主要用于实现 Java web 应用程序的用户界面部分。

JSP 通过网页表单获取用户输入数据、访问数据库及其他数据源,然后动态地创建网页。

1.3 Tomcat的功能组件

Tomcat 的核心功能有两个,分别是负责接收和反馈外部请求的连接器 Connector,和负责处理请求的容器 Container
其中连接器和容器相辅相成,一起构成了基本的 web 服务 Service。
每个 Tomcat 服务器可以管理多个 Service。

1.3.1 connector连接器

暴露监听端口,接收客户端发来的请求和返回响应消息给客户端

1.3.2 container容器

负责处理用户请求的业务逻辑。
由4个子容器组成(engine、host、context、wrapper),子容器之间是父子关系

1.3.2.1 子容器及其相关功能

  • engine:引擎,管理多个虚拟主机,一个container只有一个engine
  • host:代表一个虚拟主机
  • context:代表一个 Web 应用,包含多个 Servlet 封装器
  • wrapper:servlet封装器,每一 Wrapper 封装着一个 Servlet,负责对象实例的创建、执行和销毁功能

1.4 主要作用

  • 可以作为 Web 应用服务器,处理静态 Web 页面, 如 html 页面,但性能一般
  • 还可以作为 Servlet/JSP 容器,处理 java 语言开发的 jsp 动态页面应用程序,这也是 tomcat 主要的应用场景

1.5 Tmocat处理请求的过程

在这里插入图片描述

1、用户在浏览器中输入网址,请求被发送到本机端口 8080,被在那里监听的 Connector 获得;
2、Connector 把该请求交给它所在的 Service 的 Engine(Container)来处理,并等待 Engine 的回应;
3、请求在 Engine、Host、Context 和 Wrapper 这四个容器之间层层调用,最后在 Servlet 中执行对应的业务逻辑、数据存储等。
4、执行完之后的请求响应在 Context、Host、Engine 容器之间层层返回,最后返回给 Connector,并通过 Connector 返回给客户端。

客户端请求过程:
客户端浏览器——> connector(暴露的8080端口) ——>container(engine)——>host ——>context——>wrapper

container(engine) 根据域名发送给对应的虚拟主机
host 根据用户访问的URL路径
context 根据URL路径对应的Web应用
wrapper 根据应用程序处理业务逻辑

2. Tomcata服务部署

2.1 安装并配置JDK

systemctl stop firewalld
setenforce 0
#关闭防火墙和selinux#将所需源码包传到/opt目录下
jdk-8u201-linux-x64.rpm
apache-tomcat-9.0.16.tar.gz

在这里插入图片描述

#rpm安装JDK
cd /opt
rpm -ivh jdk-8u201-linux-x64.rpm 

在这里插入图片描述

rpm -ql jdk1.8 | tail -n 1
#查看安装路径

在这里插入图片描述

cd /usr/java/jdk1.8.0_201-amd64/ ;ls
文件名功能
bin存放 Java 可执行文件的目录
include存放 Java 开发头文件的目录
jre存放 Java 运行时环境的目录
LICENSEJDK 许可证文件
README.htmlJDK 的直观说明文档(HTML 格式)
src.zipJDK 的源代码压缩包
THIRDPARTYLICENSEREADME.txt第三方许可证文档
COPYRIGHTJDK 的版权信息
javafx-src.zipJavaFX 源代码压缩包
lib存放 JDK 和 JavaFX 库文件的目录
man存放 JDK 手册页(man page)文件的目录
releaseJDK 的版本信息
THIRDPARTYLICENSEREADME-JAVAFX.txtJavaFX 第三方许可证文档

在这里插入图片描述

java -version 
#查看目前JDK版本

在这里插入图片描述

2.2 设置JDK环境变量

#查看全局配置文件
vim /etc/profile

在这里插入图片描述

vi /etc/profile.d/java.shexport JAVA_HOME=/usr/java/jdk1.8.0_201-amd64   
#java家目录
export JRE_HOME=$JAVA_HOME/jre
#jre家目录
export CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
#指向java工具包和环境包
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
#java环境变量#linux查找可执行文件是根据PATH变量从左往右查找,找到即停止
#所以需要将安装版本的路径放在$PATH前面`CLASSPATH` 是一个环境变量,用于指定 Java 程序运行时的类路径。类路径是指计算机中存储 Java 类文件和库文件的路径。当 Java 程序运行时,虚拟机会搜索类路径上指定的路径,以找到所需的类文件和库文件,以便正确加载和执行程序。#CLASSPATH和 PATH是必需的,而JAVA_HOME和JRE_HOME是为了方便修改,只需要修改JAVA_HOME

在这里插入图片描述

source /etc/profile.d/java.sh
#调用Java脚本java -version
#查看当前JDK版本

在这里插入图片描述

#测试
任意Java脚本,测试是否成功

在这里插入图片描述

javac HelloWorld.java
#编译

在这里插入图片描述

java -cp . HelloWorld #执行脚本

在这里插入图片描述

---------------------------------热知识-------------------------------------------------------------------
JDK :java development kit (java开发工具)
JRE :java runtime environment (java运行时环境)
JVM :java virtuak machine (java虚拟机),使java程序可以在多种平台上运行class文件。
CLASSPATH:告诉jvm要使用或执行的class放在什么路径上,便于JVM加载class文件。
tools.jar:是系统用来编译一个类的时候用到的,即执行javac的时候用到。
dt.jar:dt.jar是关于运行环境的类库,主要是swing包。
----------------------------------------------------------------------------------------------------------

2.3 安装Tomcat并用systemctl启动

2.3.1 路径启动

#解压tomcat安装包
cd /opt
tar xf apache-tomcat-9.0.16.tar.gz  
#解压缩源码包 

在这里插入图片描述

cp -r apache-tomcat-9.0.16/ /usr/local/tomcat
#将源码包目录拷贝至/usr/local/下并重命名为tomcat
#简化路径,方便管理mv apache-tomcat-9.0.16 /usr/local/tomcat

在这里插入图片描述

#启动Tomcat的方法,省略路径
startup.sh          #后台启动tomcat
catalina.sh start   #后台启动tomcat
catalina.sh run     #前台启动 tomcat#关闭Tomcat的方法:
shutdown.sh      #关闭tomcat#查看tomcat是否启动:
ss -natp |grep 8080

在这里插入图片描述

2.3 2 为tomcat添加进systemd服务

#先关闭服务
/usr/local/tomcat/bin/shutdown.sh

在这里插入图片描述

#添加用户设置属主属组
useradd -s /sbin/nologin tomcat
chown tomcat:tomcat /usr/local/tomcat/ -R
#新建.service服务文件
vi /etc/systemd/system/tomcat.service[Unit]
Description=Tomcat
#After=syslog.target network.target remote-fs.target nss-lookup.target
After=syslog.target network.target[Service]
Type=forking
ExecStart=/usr/local/tomcat/bin/startup.sh
ExecStop=/usr/local/tomcat/bin/shutdown.sh
RestartSec=3
PrivateTmp=true
User=tomcat
Group=tomcat[Install]
WantedBy=multi-user.target
#重新加载服务,并开启,查看是否成功启动
systemctl daemon-reload
systemctl start tomcat
ss -ntap |grep 8080
或
systemctl status tomcat

在这里插入图片描述

浏览器访问Tomcat的默认主页 http://192.168.67.102:8080

在这里插入图片描述

3. Tomcat的端口及配置文件

3.1 Tomcat常用端口

8080: 默认接收 http 请求的端口

8005: 安全端口,可以关闭tomcat

8009: apache 和 tomcat 联动 AJP 协议

8443:负责处理https请求连接

3.2 主要目录、文件及其功能

目录名功能
bin存放启动和关闭 Tomcat 的脚本文件,比较常用的是 catalina.sh、startup.sh、shutdown.sh
conf存放 Tomcat 服务器的各种配置文件,比较常用的是 server.xml、context.xml、tomcat-users.xml、web.xml 四个文件。
lib存放 Tomcat 服务器的 jar 包,一般不作任何改动,除非连接第三方服务,比如 redis,那就需要添加相对应的 jar 包
logs存放 Tomcat 日志
temp存放 Tomcat 运行时产生的文件
webapps存放项目资源的目录
workTomcat 工作目录,一般清除 Tomcat 缓存的时候会使用到
文件名说明
server.xml主配置文件
web.xml每个webapp只有“部署"后才能被访问,它的部署方式通常由web.xml进行定义,其存放位置为
context.xml用于定义所有web应用均需加载的Context配置,此文件为所有的webapps提供默认配置,每个web应用也可以使用自已专用的配置,它通常由专用的配置文件context.xml来定义,其存放位置为WEB-INF/目录中,覆盖全局的文件
tomcat-users.xml用户认证的账号和密码文件
catalina.policy当使用security选项启动omcat时,用于为tomcat设置安全策略
catalina.propertiesTomcat环境变量的配置,用于设定类加载器路径,以及一些与JVM调优相关参数
logging.propertiesTomcat日志系统相关的配置,可以修改日志级别和日志路径等

注意:配置文件对于大小写很敏感

4. 虚拟主机

4.1 作用

  1. 分离多个网站:通过配置虚拟主机,可以将不同的网站分开,并为每个网站指定独立的文档根目录、日志文件、访问日志等,以避免网站之间的资源冲突和混乱。
  2. 实现多个域名指向不同的网站:通过虚拟主机,可以将多个域名指向同一台服务器的不同网站,实现一个服务器对应多个域名,提高服务器的利用率和灵活性。
  3. 隔离与保护:每个虚拟主机都是独立的,网站之间不会相互干扰,如果一个网站出现问题,不会影响其他网站的正常运行。
  4. 提供定制化配置:通过虚拟主机配置,可以为每个网站提供独立的配置选项,如SSL证书、访问权限、反向代理等,以满足不同网站的需求。
  5. 简化管理和维护:通过虚拟主机,可以利用Tomcat提供的管理工具(如Tomcat Manager)对每个虚拟主机进行独立的管理和监控,方便统一管理多个网站

4.2 配置虚拟主机(基于域名)

新增两个域名 www.scj.com 和 www.shan.com,希望通过这两个域名访问到不同的项目内容。

4.2.1 创建 scj 和 shan 项目目录和文件

#创建 scj 和 shan 项目目录与文件
cd /usr/local/tomcat/webapps
mkdir scj  shan

在这里插入图片描述

#自定义主页内容
echo "this is scj web" > scj/index.html
echo "this is shan web" > shan/index.html

在这里插入图片描述

4.2.2 修改 Tomcat 主配置文件

#修改主配置文件
vim /usr/local/tomcat/conf/server.xml 
约164行位置插入
-----------------------------------------------------<Host name="www.scj.com"  appBase="/usr/local/tomcat/webapps" unpackWARs="true" autoDeploy="true"xmlValidation="false" xmlNamespaceAware="false"><Context docBase="/usr/local/tomcat/webapps/scj"path="" reloadable="true" /></Host><Host name="www.shan.com"  appBase="/usr/local/tomcat/webapps" unpackWARs="true" autoDeploy="true"xmlValidation="false" xmlNamespaceAware="false"><Context docBase="/usr/local/tomcat/webapps/shan"path="" reloadable="true" /></Host>###################释义#########
Host name :主机名appBase :Tomcat程序工作目录,相对路径为webapps,绝对路径为/usr/local/tomcat/webappsunpackWARs :是否解压war包autoDeploy :指示Tomcat运行时,如有新的WEB应用是否允许自动部署xmlValidation :是否验证xml文件执行有效性检验的标志xmlNamespaceAware :是否启用xml命名空间,设置该值与xmlValidation为true,表示对web.xml文件执行有效性检验appBase :WEB应用的目录path :设置访问的URI为WEB应用的根目录reloadable :是否在程序有改动时重新载入

在这里插入图片描述

4.2.3 重启并检测是否成功

#服务机关闭防火墙并重启服务
systemctl restart tomcat
systemctl stop firewalld
setenforce 0
#前往客户机,更改/etc/hosts文件并关闭防火墙
echo "192.168.67.102 www.scj.com www.shan.com" >> /etc/hosts
systemctl stop firewalld
setenforce 0

在这里插入图片描述

#在客户机中测试
curl http://www.scj.com:8080
curl http://www.shan.com:8080

在这里插入图片描述

5. tomcat 配置优化

5.1 配置文件优化

maxThreads(最大线程数/并发)
processorCache(进程缓冲)
acceptCount(等待队列数)  
enableLookups(关闭DNS反向解析)  
URIEncoding(网页字符集编码UTF-8) 
maxKeepAliveRequests(长连接最大请求数)  
connectionTimeout(连接超时时间)  
compression(开启页面压缩)

5.2 内核优化

#/etc/security/limits.conf     
nofile  nproc  memlock
#/etc/sysctl.conf   
net.ipv4.tcp_tw_reuse=1   
net.ipv4.tcp_tw_recycle=1   
net.ipv4.tcp_fin_timeout=30  
net.ipv4.tcp_max_tw_buckets=5000    
net.ipv4.ip_local_port_range=1024 65535 

5.3 JVM优化

#在 catalina.sh 中设置 JAVA_OPTS 参数JAVA_OPTS="$JAVA_OPTS -server -Xms2048m -Xmx2048m -XX:PermSize=1024m -XX:MaxPermSize=1024m -Xmn768m"-server                                    #表示启用JDK的Server模式,实现在多核服务器性能更佳
-Xms2048m -Xmx2048m                        #设置JVM堆内存初始值和最大最一样大,一般设置为物理内存的 1/2
-XX:PermSize=1024m -XX:MaxPermSize=1024m   #设置永久代(非堆内存)初始值和最大最一样大,一般设置为物理内存的 1/4#初始值和最大最设置一样大的原因:可以减少GC次数和内存伸缩带来的频繁内存申请,从而减少一定的系统开销。-Xmn #设置JVM堆内存新生代的大小,一般设置为堆内存的 3/8-XX:ParallelGCThreads=2   #设置并行GC(垃圾回收)线程数,提高垃圾回收效率
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/usr/local/tomcat/temp/oom.hprof  设#置进程发生OOM异常退出会进行DUMP备份
-XX:+DisableExplicitGC  #禁止调用System.gc()方法,防止误调用系统gc方法导致系统的JVM堆内存大起大落而使系统响应效率严重降低

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

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

相关文章

VSCode自动分析代码的插件

今天来给大伙介绍一款非常好用的插件&#xff0c;它能够自动分析代码&#xff0c;并帮你完成代码的编写 效果如下图 首先我们用的是VSCode&#xff0c;&#xff08;免费随便下&#xff09; 找到扩展&#xff0c;搜索CodeGeeX&#xff0c;将它下载好&#xff0c;就可以实现了 到…

QVector 和 QMap

QVector_QMap QVector简介 头文件&#xff1a;#include<QVector> 模块&#xff1a; QT core 功能&#xff1a; QVector类是动态数组的模板类&#xff0c;顺序容器&#xff0c;它将自己的每一个对象存储在连续的内存中&#xff0c;可以使用索引号来快速访问它们 常用…

【MySQL系列】视图特性

「前言」文章内容大致是MySQL事务管理。 「归属专栏」MySQL 「主页链接」个人主页 「笔者」枫叶先生(fy) 目录 视图1.1 视图概念1.2 创建视图1.3 修改互相影响1.4 删除视图1.5 视图规则和限制 视图 1.1 视图概念 视图是一个虚拟表&#xff0c;其内容由查询定义同真实的表一样…

uniapp 实现多音频同时播放 解决sessionCategory = “ambient“不生效问题

1.1完整代码 <template><view></view> </template><script>export default {data() {return {BGInnerAudioContext1: null, //背景1BGInnerAudioContext2: null, //背景2}},onLoad() {this.play1()this.play2()},methods: {//音频1play1() {//背…

保护个人隐私,自建个性图床:Cpolar+Qchan轻量级搭建教程分享

文章目录 前言1. Qchan网站搭建1.1 Qchan下载和安装1.2 Qchan网页测试1.3 cpolar的安装和注册 2. 本地网页发布2.1 Cpolar云端设置2.2 Cpolar本地设置 3. 公网访问测试总结 前言 图床作为云存储的一项重要应用场景&#xff0c;在大量开发人员的努力下&#xff0c;已经开发出大…

h5开发网站-使用jquery来实现二层嵌套的左侧列表,点击后显示右侧内容的效果

一、需求&#xff1a; 使用jquery来实现二层嵌套的左侧列表&#xff0c;点击后显示右侧内容的效果。 二、思路&#xff1a; 为一级列表项和二级子列表项分别添加了点击事件处理程序。当一级列表项被点击时&#xff0c;使用.slideToggle()方法展开或收起对应的二级子列表项。…

如何激励员工?

如何激励员工&#xff1f;激励就是发现员工的需求&#xff0c;并满足它。 今天想给大家介绍下“马斯洛需求理论”&#xff0c;毕竟想要更好的激励下属创造价值&#xff0c;你首先需要了解他想要什么。对吧。 马斯洛需求理论是美国心理学家马斯洛在上世纪四十年代年提出的。他…

C语言深入理解指针(非常详细)(五)

目录 回调函数qsort使用举例qsort函数的模拟实现sizeof和strlen的对比sizeofstrlensizeof和strlen的对比一道关于sizeof的题 回调函数 回调函数就是一个通过函数指针调用的函数 如果你把函数的指针&#xff08;地址&#xff09;作为参数传递给另一个函数&#xff0c;当这个指…

Python项目开发:Flask基于Python的天气数据可视化平台

目录 步骤一&#xff1a;数据获取 步骤二&#xff1a;设置Flask应用程序 步骤三&#xff1a;处理用户输入和数据可视化 步骤四&#xff1a;渲染HTML模板 总结 在这个数字化时代&#xff0c;数据可视化已经成为我们理解和解释信息的重要手段。在这个项目中&#xff0c;我们…

OpenCV(三十):图像膨胀

1.图像膨胀原理 图像膨胀的原理是将一个结构元素&#xff08;也称为核或模板&#xff09;在图像上滑动&#xff0c;并将其与图像中对应位置的像素进行比较。如果结构元素的所有像素与图像中对应位置的像素都匹配&#xff0c;那么该位置的像素值保持不变。如果结构元素的任何一个…

C#__多线程之任务和连续任务

/// <summary> /// /// 任务&#xff1a;System.Threading.Tasks&#xff08;异步编程的一种实现方式&#xff09; /// 表应完成某个单元工作。这个工作可以在单独的线程中运行&#xff0c;也可以以同步方式启动一个任务。 /// /// 连续任务&#…

Mysql数据库基础总结:

什么是数据库&#xff1a; 数据库&#xff08;DataBase&#xff09;&#xff1a;存储和管理数据的一个仓库。 数据库类型分为&#xff1a;关系型数据库和非关系型数据库。 关系型数据库&#xff08;SQL&#xff09;&#xff1a;存储的数据以行和列为格式&#xff0c;类似于e…

wpf C# 用USB虚拟串口最高速下载大文件 每包400万字节 平均0.7s/M,支持批量多设备同时下载。自动识别串口。源码示例可自由定制。

C# 用USB虚拟串口下载大文件 每包400万字节 平均0.7s/M。支持批量多设备同时下载。自动识别串口。可自由定制。 int 32位有符号整数 -2147483648~2147483647 但500万字节时 write时报端口IO异常。可能是驱动限制的。 之前用这个助手发文件&#xff0c;连续发送&#xff0…

【创新项目探索】大数据服务omnidata-hive-connector介绍

omnidata-hive-connector介绍 omnidata-hive-connector是一种将大数据组件Hive的算子下推到存储节点上的服务&#xff0c;从而实现近数据计算&#xff0c;减少网络带宽&#xff0c;提升Hive的查询性能。目前支持Hive on Tez。omnidata-hive-connector已在openEuler社区开源。 …

运行java命令出现 Error: Invalid or corrupt jarfile XXX.jar

朋友 我当你一秒朋友 朋友 我当你一世朋友 奇怪 过去再不堪回首 怀缅 时时其实还有 运行java命令出现 Error: Invalid or corrupt jarfile XXX.jar 基本可以断定&#xff0c;是jar不完整导致的。不完整&#xff01;&#xff01;&#xff01;记住关键字 检查1&#xff1a; …

【Mysql】数据库第三讲(表的约束、基本查询语句)

表的约束和基本查询 1.表的约束1.1 空属性1.2默认值1.3列描述1.4 zerofill1.5主键1.6 自增长1.7 唯一键1.8外键 1.表的约束 真正约束字段的是数据类型&#xff0c;但是数据类型约束很单一&#xff0c; 需要有一些额外的约束&#xff0c; 更好的保证数据的合法性&#xff0c;从…

colcon build --symlink-install ,编译失败解决方法

colcon build --symlink-install编译ros2源代码时&#xff0c;或者其example时报此错误。 EasyInstallDeprecationWarning: easy_install command is deprecated.报错的路径是/usr/lib/python3/dist-packages中的setuptools&#xff0c;版本是setuptools-59.6.0.egg-info&…

鸿蒙应用开发之容器组件

一、概述 一个丰富的页面通常是由很多基础组件组成的&#xff0c;那么我们如何才能让这些组件有条不紊地在页面上布局呢&#xff1f;这就需要借助容器组件来实现。 容器组件是一种比较特殊的组件&#xff0c;它可以包含其他的组件&#xff0c;而且按照一定的规律布局&#xf…

基于SSM的精品酒销售管理系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…