明明tomcat配置了SSI 前后端也没报错,为啥就是出不来效果?
注: 本文适用于任何版本的tomcat!
(绝非标题党!!!)
一.前戏
说来, 也是笔者最近一次偷懒引发的惨案: 由于笔者讨厌繁重冗长html代码,想着有没有类似jsp
这样可以动态引入模块的功能, 这样就可以分而治之,这是个不错的idea(笔者一向爱装…), 很明显这个时候需要求救度娘, 百度一圈后发现HTML本身是不支持模块化的, 所要在服务端配置SSI
去解析它
于是乎笔者就立刻搜索tomcat配置SSI服务, 搜了一大堆,无外乎有这样的共同操作(后面细说), 但是效果是: 前端不报错,后端也妥妥的 ,这就很难受了, 甚至想过放弃了. 但是!
(一波思考之后-----峰回路转,柳暗花明)
二.柳暗
我下面的前两条按照 网上的操作之后,发现一点问题都没有, 使用导入标签后啥也没有
<!--#include file="_head.html"-->
网上给的建议是
- 进入tomcat的conf目录下进行如下配置
- 在context.xml中找到context节点添加privileged
<Context privileged="true"></Context> //让tomcat开启特权模式
- 在web.xml中配置
- 找到含有
SSI
的servlet将注释打开 并添加参数 和下面一样就行
- 找到含有
<servlet>
<servlet-name>ssi</servlet-name>
<servlet-class>
org.apache.catalina.ssi.SSIServlet
</servlet-class>
<init-param>
<param-name>buffered</param-name>
<param-value>1</param-value>
</init-param>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>expires</param-name>
<param-value>666</param-value>
</init-param>
<init-param>
<param-name>isVirtualWebappRelative</param-name>
<param-value>false</param-value>
</init-param>
<!--手动配置编码-->
<init-param>
<param-name>inputEncoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>outputEncoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<load-on-startup>4</load-on-startup>
</servlet>
- 同时还要打开
SSI
的<servlet-mapping>
注释
<servlet-mapping>
<servlet-name>ssi</servlet-name>
<url-pattern>*.shtml</url-pattern>
<url-pattern>*.html</url-pattern>
</servlet-mapping>
到这是普通网上给出的, 结果是 tomcat6.0及以前的版本运行没有问题, 可惜笔者使用tomcat8.5却突然暴毙 还是出不来
三. 花明
于是乎 我想到是不是少配置了什么(我可真是个小机灵鬼) ,通过上面发现几乎核心配置都在web.xml
中 ,我就想是不是这里面少了什么, 说起来就是干, ctrl+f搜索shtml
发现了意外之喜
原来 tomcat 7以后追加了验证:不仅仅要取消上面的注释,还有这一块: 大概在3543行 打开注释:
重启tomcat 验证一下: 完美!
哦,对了 还有几个坑 给各位填一下:
- 你们在页面引入模块的时候切记按照我这个格式:
方框的前后不可以有空格
- 引入时候有两种方式
<!--#include virtual="static/_header.html"-->
<!--#include file="_header.html"-->
第一种方式: 就是虚拟路径:相对于项目而言
第二种: 是和调用模块的页面在同一目录下
四. 收尾
有的时候,偷懒也是要付出一番代价的哈 累死了,搞了一个早上,睡了睡了…