IDEA 部署Tomcat教程(透彻理解操作)
本文只讲 IDEA 部署 Tomcat 的各项设置,帮助你了解全流程,不再是网上那种只讲怎么做不讲为什么的教程。
图都是在 Linux 下用 frameshot 截的,所以不要好奇为什么是/home/
而不是D:\
本文作者 yucloud.cnblogs.com,转载请在明显位置注明出处和转载自哪里
在 IDEA 上控制 Tomcat 部署,我们就必须了解各项选项的详细作用:
首先我们看一下 IDEA 里的当前项目结构配置
File -》 Project Structure
设置 Web 资源目录和 Tomcat读取的 web.xml 配置文件
然后为了让 Tomcat 读取到我们需要的 Web 资源
要设置一下 Web资源路径和 web.xml 配置文件
-> Facets -> 点加号添加 -> Web
注意:这里把 Web 资源目录设置为根目录"/" ,其实是指 设置为
部署目录的根目录
(即下下张图里,提到的那个
再点 Artifacts ,这里熟悉吧?这里就是 Tomcat 部署设置的一部分
如果你还需要 module(当然Eclipse里叫项目) 里的一些文件,可以右击 Available Elements
下的模块(如右击图中的 servlet2Spring,选择 Put Into Output Root
)
Tomcat 的 Run/Debug 配置
点击菜单栏下的 Edit Configurations... (我缩小了窗口,所以在左边,但是一般都是在右边的)
这里可以点加号,添加一个 External Source...
(额外的资源目录作为服务器部署目录)
处理常见问题
让我们来处理一些常见问题
Web资源找不到
如 html jsp css js 等文件没有在 IDEA 部署目录里
检查 Facets 里是否有 Web,并且各种路径配置是否正确
我想把项目下的 README.md 也放到部署目录
可以右击 Available Elements
下的模块(如右击图中的 servlet2Spring,选择 Put Into Output Root
) 更多详见标题2
上传文件失败 404 错误
不止是上传文件错误,很多 404 问题都应该按如下步骤检查
检查一下你设置的 http 路径是否可以访问,用 GET/POST 工具试一下
比较有可能是你设置的 Tomcat 路径是 例如http://localhost:8080/Demo_war_exploded
但是你用的上传路径是 http://localhost:8080/upload
- 这时候要么把上传路径改为
http://localhost:8080/Demo_war_exploded/upload
- 要么把 Tomcat Run/Debug 配置的 URL 改为 http://localhost:8080/ 并设置 Application Context 为"/"
更多详见标题3
html 超链接打开错误
检测一下地址栏上的地址,是不是变了
假如当前 http 路径是localhost:45/Demo_war_exploded/
,点击链接之后变成了localhost:45/testa
写超链接时要注意 "/testa" "./testa" "testa"
的区别
- /testa 是指域名根路径 ,如
localhost:45/testa
- ./testa 和 testa 都是指当前的 http 路径 ,如
localhost:45/Demo_war_exploded/testa
附表
路径 | 详解 |
---|---|
/ | 域名根路径 |
./ | 当前路径 |
../ | 当前路径的上一层 |
可以看出路径是符合 Unix 规范
另外,域名根路径和部署目录不一定是对应的,这里拿上面的示例讲一下
上面示例的部署目录对应的 http路径 是
localhost:45/Demo_war_exploded
而域名是localhost:45
域名根路径是localhost:45/
可见这里的域名根路径访问的不是 JavaWeb 项目的部署路径
这里你可能有疑惑,为什么我们打开域名localhost:45
和域名根路径localhost:45/
是一样的?
- 其实,这都是浏览器或服务器的功劳,是它们帮忙搞定了这些
路径补全、重定向、转发
的问题
Tomcat 常见报错
检查 web.xml 里的过滤路径是否正确
错误代码
<url-pattern>test</url-pattern>
改正:
<url-pattern>/test</url-pattern>
url-pattern 这个元素好像没有相对路径的写法
就我知道的,它只支持
写法示例 | 写法解释 |
---|---|
*.jk | 匹配后缀名为 jk 的文件 |
/go/ | 精确绝对路径 |
/go/* | 模糊路径匹配 |
但是混合写法是错的: /go/*.do
和 /go*
都是非法的
另外匹配的原则是:详细的路径优先,后缀名匹配优先级最低
(备注:在 Tomcat 或 Spring 的 XML 配置文件里,HTTP URL 的 "/" 根路径都是域名根路径如 localhost:8081/
)
如果有不想被拦截的静态资源,可以用 servlet-name 为default
的默认拦截器(这个拦截器会放行你设置的 url ),如
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.gif</url-pattern>
</servlet-mapping>
详见: https://blog.csdn.net/hello5orld/article/details/9407905
部署原理见: Intellij idea 的tomcat原理讲解
写完文章才看到这篇,早知道不自己截图了....
最后,Tomcat 的部署目录和Home目录变量为什么是
图中为知乎陈龙的回答