news 2026/8/8 22:44:44

Windows下Tomcat 9安装配置与本地开发环境搭建全指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Windows下Tomcat 9安装配置与本地开发环境搭建全指南

1. 项目概述:为什么Tomcat依然是本地开发与测试的基石

如果你是一名Java Web开发者,或者正准备踏入这个领域,那么“Tomcat”这个名字你一定不陌生。它不是一个新潮的框架,但却是整个Java Web生态中,尤其是Servlet/JSP技术栈里,最经典、最可靠、最不可或缺的运行时容器。很多朋友可能会觉得,现在都是Spring Boot内置容器一键启动了,还有必要手动安装配置Tomcat吗?我的答案是:非常有必要。手动安装配置Tomcat,就像学开车前先了解发动机的基本构造一样,它能让你从根本上理解一个Web应用是如何被加载、解析和运行的。当你在本地调试一个传统的Web项目,或者需要模拟生产环境进行特定测试时,一个独立、可控的Tomcat环境是无可替代的。它让你对类加载路径、配置文件位置、日志输出等有绝对的掌控权,这是内嵌容器有时无法提供的透明性。

今天,我就以一个老开发的身份,带你从零开始,在Windows系统上完成Apache Tomcat的安装与环境变量配置。这不仅仅是一个“点击下一步”的安装过程,我会穿插讲解每个步骤背后的逻辑,以及那些官方文档里不会写的、只有踩过坑才知道的细节。无论你是刚入门的新手,还是想巩固基础的老手,这篇“保姆级”指南都会让你对Tomcat有一个更清晰、更深入的认识。我们不止于“安装成功”,更要追求“配置明白”,为后续的开发和排错打下坚实的基础。

2. 核心准备:版本选择、下载与前置条件检查

在动手之前,做好准备工作能避免一半以上的问题。安装Tomcat的第一步,不是急着下载,而是想清楚你需要什么。

2.1 Tomcat版本与Java版本的匹配关系

这是最关键的一步,版本不匹配会导致Tomcat根本无法启动。Tomcat的版本严重依赖于你本地安装的Java版本(更准确地说,是JRE或JDK版本)。

Tomcat 版本所需最低 Java 版本 (JRE)推荐 Java 版本 (JDK)主要特性与说明
Tomcat 10.1.xJava 17 或更高Java 17, 21支持 Servlet 6.0, JSP 3.1, EL 5.0。注意:包名从javax.*迁移到了jakarta.*,与旧项目可能存在兼容性问题。
Tomcat 9.0.xJava 8 或更高Java 8, 11, 17支持 Servlet 4.0, JSP 2.3, EL 3.0。目前最稳定、使用最广泛的版本,兼容性最好。
Tomcat 8.5.xJava 7 或更高Java 8, 11支持 Servlet 3.1, JSP 2.3, EL 3.0。已停止更新,仅用于维护非常老的项目。

选择建议:

  • 新手或企业常规项目开发:强烈推荐 Tomcat 9.0.x。它平衡了稳定性、功能性和广泛的社区支持,对绝大多数项目都足够用。
  • 体验最新规范或为新项目技术选型:可以考虑 Tomcat 10.x,但务必注意javaxjakarta的包名变更带来的影响。
  • 维护历史遗留项目:根据项目要求选择对应的 Tomcat 8.5.x 或更早版本。

如何查看本机Java版本?打开命令提示符(CMD),输入java -version。记下显示的第一行版本号,例如java version "1.8.0_381”对应 Java 8。

2.2 获取安装包:官方渠道与镜像源

永远从Apache官方或可信的镜像站下载,避免第三方修改带来的安全风险。

  1. 访问Apache Tomcat官网:https://tomcat.apache.org/
  2. 在左侧“Download”栏目下,找到你选择的版本(例如 Tomcat 9)。
  3. 在“Binary Distributions”部分,找到“Core”分类。这里你会看到两种格式:
    • zip (pgp, sha512):绿色免安装版。解压即用,我最推荐的方式,干净、无残留、便于多版本管理。
    • 32-bit/64-bit Windows Installer (pgp, sha512):Windows安装程序。会写注册表,有图形界面服务管理,适合希望以Windows服务方式运行的生产环境,但对于开发学习而言稍显笨重。
  4. 点击zip链接进行下载。如果官网下载慢,可以使用国内镜像,例如清华大学的镜像站,将官网域名替换为https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/即可。

2.3 规划安装目录与系统环境准备

下载完成后,不要随意解压。建议在非系统盘(如D盘)创建一个清晰的目录来管理你的开发环境。例如:

D:\DevTools\

在这个目录下,你可以建立:

D:\DevTools\apache-tomcat-9.0.85\ (你的Tomcat解压目录) D:\DevTools\jdk1.8.0_381\ (你的JDK目录)

这样的结构一目了然。同时,请确保你的系统用户名是英文的,路径中不要包含中文或特殊字符(如空格、&#等)。这是很多“玄学”错误的根源,例如Tomcat启动闪退,很可能就是因为路径中的中文字符导致文件读取失败。

3. 详解安装步骤:从解压到首次启动

我们以下载apache-tomcat-9.0.85-windows-x64.zip并规划安装到D:\DevTools为例。

3.1 解压与目录结构解析

将下载的ZIP文件解压到D:\DevTools目录下。完成后,你会得到一个名为apache-tomcat-9.0.85的文件夹。进入这个文件夹,我们来认识一下核心目录,这比盲目操作重要得多:

  • bin/最重要的目录,存放启动和关闭Tomcat的脚本。
    • startup.bat:Windows下的启动脚本。
    • shutdown.bat:Windows下的关闭脚本。
    • catalina.bat:核心脚本,startup.batshutdown.bat最终都调用它。
  • conf/:配置文件目录。
    • server.xml:主配置文件,可以修改端口号、连接器设置、主机配置等。
    • web.xml:所有Web应用的默认部署描述符。
    • tomcat-users.xml:定义Tomcat管理后台(Manager和Host Manager)的用户角色和密码。
  • lib/:存放Tomcat运行和所有Web应用共享的Java库文件(JAR包),例如Servlet API的jar包就在这里。
  • logs/:日志文件目录。排错必看!当Tomcat启动失败或应用出错时,第一时间来这里查看catalina.yyyy-mm-dd.loglocalhost.yyyy-mm-dd.log
  • webapps/Web应用部署目录。你打包好的WAR文件,或者解压后的Web应用文件夹,直接放在这里,Tomcat启动时会自动加载。
    • 默认里面有几个示例应用:docs/,examples/,host-manager/,manager/,ROOT/
  • work/:Tomcat的工作目录。JSP文件在首次被访问时,会被编译成Servlet的Java源文件和Class文件,存放在这里。清空此目录可以强制JSP重新编译,常用于解决JSP缓存问题。
  • temp/:临时文件目录。

理解这些目录的作用,后续无论是部署、配置还是排错,你都能精准定位。

3.2 不依赖环境变量的首次启动测试

在配置环境变量之前,我们可以先验证Tomcat压缩包本身是否完整,以及Java环境是否基本可用。这是一种“隔离测试”的思路。

  1. 打开命令提示符(CMD)。关键技巧:不要直接双击打开CMD,而是先按住Shift键,然后在bin文件夹的空白处点击鼠标右键,选择“在此处打开命令窗口”或“在此处打开 PowerShell 窗口”。这样可以确保你的当前工作目录就是D:\DevTools\apache-tomcat-9.0.85\bin
  2. 在当前命令行中,直接输入startup.bat并回车。
  3. 观察弹出的新窗口(Tomcat启动日志窗口)。如果一切顺利,你会看到日志滚动,最后几行出现类似“Server startup in [xxxx] milliseconds”的信息,这意味着Tomcat启动成功了!
  4. 打开浏览器,访问http://localhost:8080。你应该能看到Tomcat默认的“一只猫”欢迎页面。

注意:这种方式启动Tomcat,其运行依赖于当前CMD窗口。如果你关闭了这个黑色窗口,Tomcat服务也就随之停止了。这只适用于临时测试。

如果启动失败,窗口闪退怎么办?这是新手最常见的问题。不要慌张,因为窗口关闭太快看不到错误信息。请按照以下步骤排查:

  1. 还是在上面的bin目录,右键选择“在此处打开命令窗口”。
  2. 先输入catalina.bat run然后回车。这个命令会在当前窗口前台运行Tomcat,所有日志信息都会打印在当前窗口,不会闪退。
  3. 仔细阅读最后几行报错信息。最常见的错误是“The JAVA_HOME environment variable is not defined correctly”。这说明虽然你能用java -version,但Tomcat启动脚本没有找到它期望的Java安装路径。这引出了我们必须正确配置的环境变量。

4. 环境变量配置的深层原理与实操

为什么需要配置环境变量?简单说,就是为了让操作系统和应用程序(如Tomcat)在任何位置都能方便地找到关键的运行依赖(如Java)。对于Tomcat,主要是两个变量:JAVA_HOME和可选的CATALINA_HOME

4.1 配置JAVA_HOME:指向JDK而非JRE

JAVA_HOME这个变量名是业界约定俗成的,Tomcat的启动脚本(catalina.bat)会主动去读取这个变量的值,以定位Java的安装位置。

  1. 找到你的JDK安装路径。如果你只安装了JRE,强烈建议安装完整的JDK,因为开发过程中可能需要用到编译工具(javac)。路径类似C:\Program Files\Java\jdk1.8.0_381D:\DevTools\jdk1.8.0_381
  2. 设置系统环境变量
    • 右键点击“此电脑” -> “属性” -> “高级系统设置” -> “环境变量”。
    • 在“系统变量”区域(为所有用户生效),点击“新建”。
    • 变量名:JAVA_HOME
    • 变量值:你的JDK安装的绝对路径(例如D:\DevTools\jdk1.8.0_381)。务必确保这个路径下存在binlib等文件夹,且bin文件夹里有java.exe
    • 点击“确定”。
  3. 验证JAVA_HOME配置
    • 打开一个新的命令提示符(重要:必须新开一个,环境变量才生效)。
    • 输入echo %JAVA_HOME%并回车。如果正确显示你刚才设置的路径,说明配置成功。

实操心得:很多教程让你同时配置JRE_HOME,但对于Tomcat 8.5及以上版本,只配置JAVA_HOME指向JDK即可,脚本会智能处理。配置多个反而容易混乱。确保路径中没有分号结尾,没有多余的空格。

4.2 配置CATALINA_HOME与PATH(可选但推荐)

  • CATALINA_HOME:这个变量指向你的Tomcat安装根目录(例如D:\DevTools\apache-tomcat-9.0.85)。配置它的好处是,你可以在系统的任何位置通过脚本启动Tomcat,而不必每次都切换到bin目录。Tomcat自己的脚本也会用到这个变量。
    • 设置方法同上,在“系统变量”中新建:
      • 变量名:CATALINA_HOME
      • 变量值:你的Tomcat安装的绝对路径
  • %CATALINA_HOME%\bin加入PATHPATH变量告诉系统,当你在命令行输入一个命令时,应该去哪些目录里寻找可执行文件。
    • 在“系统变量”中找到Path变量,选中并点击“编辑”。
    • 点击“新建”,然后添加一行:%CATALINA_HOME%\bin
    • 点击“确定”保存所有更改。

配置后的验证:

  1. 关闭所有已打开的命令提示符窗口,新开一个。
  2. 输入echo %CATALINA_HOME%,检查是否输出正确路径。
  3. 现在,你可以在任意目录下,直接输入startup.bat来启动Tomcat了。系统会根据PATH变量找到%CATALINA_HOME%\bin\startup.bat并执行。

4.3 环境变量配置后的完整启动测试

完成上述配置后,我们进行最终测试:

  1. 新开一个CMD窗口,输入startup.bat。Tomcat应在新的窗口中启动。
  2. 浏览器访问http://localhost:8080,确认欢迎页面正常。
  3. 在启动着Tomcat的CMD窗口里,按Ctrl + C,或者在新开的一个CMD窗口里,输入shutdown.bat,可以正常关闭Tomcat。

至此,Tomcat的安装和基础环境变量配置就全部完成了。但这只是开始,一个可用的环境还需要进行必要的安全性和便利性配置。

5. 基础配置与安全加固:让Tomcat更顺手、更安全

默认安装的Tomcat虽然能跑,但存在一些安全隐患,且不够便利。我们进行几项关键配置。

5.1 修改默认端口号(可选)

8080是Tomcat的默认HTTP端口。如果你的8080端口被其他程序(如Oracle数据库控制台、其他Tomcat实例)占用,就需要修改。

  1. 用文本编辑器(如Notepad++,不要用Windows自带的记事本,可能编码有问题)打开conf/server.xml
  2. 搜索Connector port="8080",大概在第69行左右。你会看到一段类似下面的配置:
    <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
  3. port="8080"修改为你想要的端口,例如port="8888"。保存文件。
  4. 重启Tomcat,此时就需要访问http://localhost:8888了。

5.2 配置管理后台用户角色(强烈建议)

默认情况下,Tomcat的管理后台(Manager App和Host Manager)是没有配置用户的,无法登录。我们需要手动添加一个用户。

  1. 打开conf/tomcat-users.xml
  2. 在文件末尾的</tomcat-users>标签之前,添加如下配置(以添加一个具有manager-guiadmin-gui角色的用户为例):
    <role rolename="manager-gui"/> <role rolename="admin-gui"/> <user username="admin" password="your_strong_password" roles="manager-gui,admin-gui"/>
    • manager-gui角色允许访问和管理Web应用(/manager/html)。
    • admin-gui角色允许访问虚拟主机管理(/host-manager/html)。
    • 请务必将your_strong_password替换为一个强密码。
  3. 保存文件。重启Tomcat后,访问http://localhost:8080/manager/htmlhttp://localhost:8080/host-manager/html,就可以用上面设置的用户名和密码登录了。

安全警告:在生产环境中,仅在内网开放管理界面,并使用强密码。甚至可以注释掉webapps目录下的managerhost-manager文件夹来彻底禁用。

5.3 解决控制台中文乱码问题

在Windows下,Tomcat日志和控制台输出中文时可能会出现乱码(显示为问号??)。这是因为Tomcat默认使用UTF-8编码,而Windows CMD默认使用GBK编码。

  1. 打开conf/logging.properties文件。
  2. 找到java.util.logging.ConsoleHandler.encoding这一行,默认是UTF-8
  3. 将其修改为GBK
    java.util.logging.ConsoleHandler.encoding = GBK
  4. 保存并重启Tomcat。此时控制台输出的中文日志就能正常显示了。

更深层的解决思路:上述方法是修改Tomcat去适应CMD。更现代的做法是使用支持UTF-8的终端,比如Windows Terminal,并将系统区域设置中的“Beta版:使用Unicode UTF-8提供全球语言支持”勾选上,然后保持Tomcat编码为UTF-8。这需要更复杂的系统设置,但对于长期开发者而言是更一劳永逸的方案。

6. 部署你的第一个Web应用:理论与实践

配置好环境后,我们来实际部署一个应用,理解Tomcat是如何工作的。

6.1 部署方式详解

将Web应用部署到Tomcat,主要有三种方式:

  1. 静态部署(最常用):直接将你的Web应用文件夹(符合WAR包解压后的结构)或WAR包,复制到webapps目录下。Tomcat启动时会自动解压WAR包并加载应用。
    • 例如,将myapp.war复制到webapps,启动Tomcat后,会自动生成myapp文件夹,并通过http://localhost:8080/myapp访问。
  2. 动态部署(通过管理界面):在配置好管理用户后,你可以通过http://localhost:8080/manager/html页面,上传WAR文件进行部署、卸载、重载等操作,无需重启Tomcat。
  3. 配置文件部署(灵活控制):在conf/Catalina/localhost目录下(如果没有则创建),创建一个XML文件,例如myapp.xml,内容如下:
    <Context docBase="D:\MyProjects\myapp\webroot" />
    这会将位于D:\MyProjects\myapp\webroot的Web应用,映射到上下文路径/myapp(文件名即路径)。这种方式可以将应用放在任何位置,与Tomcat本身分离。

6.2 手动创建一个简单的测试应用

让我们亲手创建一个最简单的应用来验证部署流程:

  1. 在任意位置(例如桌面)新建一个文件夹,命名为hello
  2. hello文件夹内,新建一个文件夹WEB-INF(注意大小写)。这是Java Web应用的标志性目录。
  3. hello文件夹内,直接创建一个index.jsp文件,用记事本打开,输入:
    <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Hello Tomcat</title> </head> <body> <h1>Hello, Tomcat! 当前时间是:<%= new java.util.Date() %></h1> <p>我的第一个应用部署成功了!</p> </body> </html>
  4. 现在,你的hello文件夹结构应该是:
    hello/ │ index.jsp └───WEB-INF/ (可以暂时为空)
  5. 将整个hello文件夹复制到Tomcat的webapps目录下。
  6. 启动(或重启)Tomcat。
  7. 打开浏览器,访问http://localhost:8080/hello/。你应该能看到页面显示标题和当前的服务器时间。

恭喜!你不仅安装配置了Tomcat,还成功部署了第一个应用。这个过程让你直观地理解了webapps目录的作用、应用上下文路径的映射关系,以及JSP的基本运行原理。

7. 常见问题排查与深度优化技巧

即使按照教程一步步来,也可能会遇到问题。这里我总结了一些典型问题的排查思路和进阶优化技巧。

7.1 启动失败问题速查表

问题现象可能原因排查步骤与解决方案
启动窗口闪退1. JAVA_HOME未配置或配置错误。
2. 端口被占用。
3. 安装路径含中文/空格。
1. 在bin目录下运行catalina.bat run查看具体错误。
2. 检查JAVA_HOMEecho %JAVA_HOME%,确保路径正确且指向JDK。
3. 检查端口:netstat -ano | findstr :8080,若被占用则修改server.xml端口或结束占用进程。
4. 确保Tomcat安装路径全英文无空格。
访问localhost:8080连接被拒绝1. Tomcat未成功启动。
2. 防火墙阻止。
1. 检查Tomcat启动窗口是否正常跑完日志。
2. 临时关闭防火墙测试,或在防火墙中为8080端口添加入站规则。
报错“Address already in use: JVM_Bind”端口被其他程序占用。使用netstat -ano找到占用8080端口的进程ID(PID),在任务管理器中结束该进程,或为Tomcat更换端口。
管理页面(/manager/html)无法访问或403错误1. 未在tomcat-users.xml中配置用户角色。
2. 角色配置错误。
3. 默认禁止了外部IP访问。
1. 检查tomcat-users.xml配置,确保用户角色包含manager-gui
2. 对于Tomcat 9+,还需检查webapps/manager/META-INF/context.xml,可能默认注释掉了允许外部连接的Valve,需要按需调整。
应用部署后访问4041. 应用部署路径错误。
2. 应用本身结构问题。
3. 上下文路径(Context Path)不对。
1. 确认WAR包或文件夹已放入webapps且Tomcat已重启/重载。
2. 检查应用是否有WEB-INF目录(可空)和web.xml(Tomcat 9+非必须)。
3. 访问URL应为http://主机:端口/应用文件夹名/

7.2 性能与内存基础调优

对于本地开发,默认配置通常足够。但如果项目较大,可以适当调整JVM参数,防止内存溢出。 修改bin/catalina.bat(Linux下是catalina.sh): 在文件开头部分,找到rem ----- Execute The Requested Command -----------------------------------------这行注释之前,添加JVM参数设置:

set "JAVA_OPTS=-Xms512m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256m"
  • -Xms512m:JVM堆内存初始大小为512MB。
  • -Xmx1024m:JVM堆内存最大大小为1024MB。
  • -XX:MetaspaceSize=128m:元空间初始大小(Java 8+替代了永久代)。
  • -XX:MaxMetaspaceSize=256m:元空间最大大小。 根据你机器的物理内存和项目大小调整这些值。本地开发环境,给1-2G堆内存通常足够。

7.3 以Windows服务方式运行(生产环境思路)

对于需要长期稳定运行的环境,可以将Tomcat安装为Windows服务,实现开机自启、后台运行。

  1. 确保已正确配置JAVA_HOMECATALINA_HOME
  2. 以管理员身份打开命令提示符,切换到Tomcat的bin目录。
  3. 执行安装服务命令:
    service.bat install
    你会看到服务安装成功的提示,服务名默认为Tomcat9
  4. 打开“服务”管理器(services.msc),找到Apache Tomcat 9.0 Tomcat9服务,可以设置其启动类型为“自动”,并可以在此启动、停止它。
  5. 卸载服务命令为:
    service.bat remove

个人体会:在本地开发时,我几乎从不安装服务,因为通过startup.bat启动能让我更直观地看到日志,用Ctrl+C停止也更快。服务模式更适合模拟生产环境或作为后台持续运行的测试服务器。手动安装配置Tomcat的过程,看似繁琐,实则是理解Java Web应用部署和运行机制的最佳实践。每一次排错,每一次调整配置,都是对底层知识的一次巩固。当你再面对Spring Boot内嵌的Tomcat时,你会清楚地知道它在背后为你做了什么,当出现问题时,你也有了更明确的排查方向。希望这篇超详细的指南,能帮你建立起对Tomcat清晰而牢固的认知。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/8 22:43:02

Windows运行Shell脚本全攻略:WSL、MSYS2、Git Bash方案对比与避坑指南

1. 为什么要在Windows上运行Shell脚本&#xff1f;如果你是一个长期在Linux或macOS环境下工作的开发者或运维工程师&#xff0c;突然切换到Windows平台&#xff0c;最不习惯的事情之一可能就是命令行环境的差异。Linux下那些得心应手的.sh脚本&#xff0c;在Windows的CMD或Powe…

作者头像 李华
网站建设 2026/8/8 22:40:41

PEEK与MobileCLIP2-S0的完美结合:视频特征提取最佳实践

MindsDB连接池管理终极指南&#xff1a;提升AI数据库并发性能的10个技巧 【免费下载链接】mindsdb mindsdb/mindsdb: 是一个基于 SQLite 数据库的分布式数据库管理系统&#xff0c;它支持多种数据存储方式&#xff0c;包括 SQL 和 NoSQL。适合用于构建分布式数据库管理系统&…

作者头像 李华
网站建设 2026/8/8 22:37:47

企业数字化转型必选项:深度解析东莞腾宇科技网站建设如何助力传统制造出海与品牌升级

最近这几年,我在东莞这片热土上跑了无数趟,见了形形色色的老板和创业者。有一个现象我观察得非常清楚:以前大家做生意,靠的是熟人介绍、是展会名片、是电话轰炸;但现在,尤其是做B2B、做制造、甚至做跨境电商的朋友们,都意识到一个冷冰冰但无比现实的事实——如果你的官网…

作者头像 李华
网站建设 2026/8/8 22:36:44

UnifoLM-VLM-Base实战教程:如何用单策略实现高质量机器人操控任务

掌握高级NLP技术&#xff1a;命名实体识别与大语言模型的终极指南 【免费下载链接】AI-For-Beginners 微软推出的人工智能入门指南项目&#xff0c;适合对人工智能和机器学习感兴趣的人士学习入门知识&#xff0c;内容包括基本概念、算法和实践案例。特点是简单易用&#xff0c…

作者头像 李华
网站建设 2026/8/8 22:30:16

Keithley源表软件全解析:从KickStart到LabVIEW,实现自动化测试与IV扫描

1. 从“手动拧旋钮”到“一键自动化”&#xff1a;源表软件的价值跃迁 如果你还在用Keithley 2400、2450这类源表时&#xff0c;手动在前面板上一个按键一个按键地设置电压、电流&#xff0c;然后盯着屏幕抄录数据&#xff0c;那你可能只发挥了它不到10%的潜力。我接触过不少硬…

作者头像 李华
网站建设 2026/8/8 22:29:59

南宁网站建设索q.479185700 为什么你的企业官网没人看?揭秘那些被忽略的流量密码

今天咱们不聊那些高大上的理论,也不整那些虚头巴脑的PPT话术。就聊聊一个很多南宁本地老板,或者说很多刚入行的互联网从业者最头疼的问题:为什么你花大价钱建的网站,就像是一个摆在沙漠深处的奢侈品店,门庭冷落,问津者寥寥?我在这一行混了不少年头,见过太多这样的案例。…

作者头像 李华