tomcat是干嘛用的
```html 你写了一个Java网站,用IDE跑得好好的,但想让隔壁工位的同事也能在浏览器里打开看看,怎么办?总不能让人家把整个项目拷过去再装个Eclipse吧。这时候Tomcat就派上用场了——它就是一个能让你把写好的Java Web应用“挂”上去,然后别人通过IP和端口就能访问的东西。说白了,Tomcat是一个Servlet容器,也叫Web服务器,专门跑Java的Web程序。 我第一次接触Tomcat是大二做课程设计,用JSP写了个简陋的留言板。当时根本不懂什么叫“容器”,只知道把项目打成war包往webapps文件夹里一丢,启动bin目录下的 Tomcat的核心工作其实就两件事:接收HTTP请求,交给对应的Java代码处理,再把结果拼成HTTP响应发回去。你写的Servlet或者Spring MVC的Controller,本质上都是被Tomcat调用的。它内部维护了一个线程池,每个请求进来就分配一个线程去执行你的业务逻辑。所以为什么有时候请求多了会卡?因为线程池满了,后面的请求就得排队。这个细节说明Tomcat不只是个“转发器”,它还要管并发、管生命周期、管会话。 很多人把Tomcat和Apache HTTP Server搞混。后者是C语言写的,主要处理静态文件、做反向代理;Tomcat是Java写的,擅长动态内容。实际生产环境里经常是Nginx在前头扛静态资源和负载均衡,Tomcat在后面跑Java应用。我见过一个创业公司的架构,Nginx配了三个Tomcat实例,每个实例跑同一个war包,数据库连接池各自独立——这种部署方式Tomcat自己就能搞定,不需要额外装什么重型中间件。 一个容易忽略的点:Tomcat默认端口是8080,但你可以改成80。改 Tomcat的目录结构也值得说一嘴。 版本选择上,Tomcat 9和10差别挺大。9用的是 说到内嵌Tomcat,现在用Spring Boot的人可能都没单独装过Tomcat。Spring Boot把Tomcat打包进了jar里, 那Tomcat能不能跑PHP?不能。它只认Java的Servlet规范。你非要把PHP文件丢进webapps,它只会当普通文本下载下来。同样,Tomcat也不适合跑纯静态的大文件下载,Nginx处理这些效率高得多。工具各有各的活,Tomcat的定位很清晰——Java Web应用的运行环境。 最后提一个实际场景。你本地开发用Tomcat 9,测试环境用Tomcat 8.5,生产环境用Tomcat 9。不同版本对Servlet规范的支持有细微差别,比如 Tomcat不复杂,但细节不少。它就像Java Web世界里的空气——平时感觉不到存在,一旦出问题,整个应用就喘不上气。tomcat是干嘛用的
startup.bat,浏览器敲localhost:8080/留言板,页面就出来了。那种感觉挺神奇的——明明没装什么大型软件,就一个压缩包解压出来的文件夹,居然能让我写的Java代码变成网页。conf/server.xml里的<Connector port="8080">就行。不过Linux下用80端口需要root权限,所以很多人还是老老实实跑8080,前面挂个Nginx转发。bin放启动脚本,conf放配置文件,webapps是你丢war包的地方,logs里能看到访问日志和错误堆栈。有次我帮同事排查一个404问题,翻了半天代码没毛病,最后发现他把war包放到了webapps/ROOT外面,Tomcat压根没解压。这种坑踩过一次就记住了。javax.servlet包,10换成了jakarta.servlet。如果你用Spring Boot 2.x,默认内嵌的是Tomcat 9;升到Spring Boot 3.x,内嵌的就是Tomcat 10。很多老教程还在讲javax,你照着做在Tomcat 10上跑,启动就报ClassNotFound。这不是Tomcat的错,是Java EE改名Jakarta EE带来的连锁反应。java -jar一跑,Tomcat就悄悄启动了。但本质上还是那个Tomcat,只是启动方式从startup.sh变成了Spring Boot的SpringApplication.run()。你打开Maven依赖树,能看到spring-boot-starter-tomcat,里面就是Tomcat的核心jar包。HttpServletRequest.getParts()在8.5和9里的行为就不完全一样。所以别随便混用,至少大版本要对齐。我见过有人本地跑得好好的文件上传,部署到测试环境就报错,查了一下午发现是Tomcat版本差了一个小版本号。
-
上一篇
-
下一篇