总体说明
在 CentOS 上运行 JSP 并不存在系统层面的“不兼容”,关键在于 JDK 版本、Servlet/JSP 规范版本(由 Tomcat 决定)以及字符编码等是否与应用一致。常见组合是 JDK 8 + Tomcat 9(JSP 2.3),在 CentOS 7/8 上被广泛使用;若版本不匹配或编码链路不统一,就容易出现编译失败、页面乱码、类找不到等问题。
常见兼容性问题与修复
- 版本不匹配导致无法编译 JSP
现象:出现 org.apache.jasper.JasperException: Unable to compile class for JSP。
原因:如 JDK 8 搭配过老的 Tomcat 7 小版本。
修复:升级到 Tomcat 8/9(与 JDK 8 兼容良好),或统一开发/测试/生产使用相同版本。
- JSTL 标签库不可用
现象:使用 JSTL 报错,如 ClassNotFoundException 或属性未闭合。
修复:在 WEB-INF/lib/ 放置标准 JSTL 实现(如 javax.servlet.jsp.jstl:javax.servlet.jsp.jstl-api 与 org.glassfish.web:javax.servlet.jsp.jstl),Maven 项目使用官方 BOM 或明确版本,避免运行时缺失。
- 页面与请求参数乱码
现象:中文显示为 ? 或 æ³。
修复:
- JSP 顶部统一声明:
<%@ page language=“java” contentType=“text/html; charset=UTF-8” pageEncoding=“UTF-8” %>
- 表单提交使用 UTF-8:
- 数据库连接串显式指定字符集(如 characterEncoding=UTF-8)
- 服务端获取参数优先使用 request.setCharacterEncoding(“UTF-8”)(在解析参数前调用)
- 避免使用已废弃的 new String(bytes, “GBK”) 式“转码”,统一全链路 UTF-8。
- IDE 与服务器运行库冲突
现象:在 IDE 中能运行,部署到 CentOS 的 Tomcat 后类找不到或日志异常。
修复:在 IDE 的 Tomcat Server Runtime 配置中移除冲突的 tomcat-juli.jar,指向服务器实际的 tomcat/bin/tomcat-juli.jar;清理工作目录并重新部署。
- 端口与防火墙阻断访问
现象:本机能访问,外网访问不了。
修复:放行 8080/tcp(如 firewall-cmd --zone=public --add-port=8080/tcp --permanent && firewall-cmd --reload),或改用系统服务方式部署并开放对应端口,同时确保云安全组策略同步放行。
版本匹配与规范对应
- Tomcat 5:支持 Servlet 2.4 / JSP 2.0
- Tomcat 7:支持 Servlet 2.5 / JSP 2.2
- Tomcat 8:支持 Servlet 3.1 / JSP 2.3
- Tomcat 9:支持 Servlet 4.0 / JSP 2.3
在 CentOS 7.x 上常见搭配为 JDK 8 + Tomcat 9(JSP 2.3);在 CentOS 6.7 上常见 Tomcat 7(JSP 2.2)。选择组合时以应用所需规范与依赖为基准,避免跨大版本带来的 API 差异。
快速自检与最小示例
部署与运维要点
- 使用系统包管理器安装 Tomcat(如 yum install -y tomcat)时,注意其目录结构与运行用户(常见为 tomcat 用户),并为服务创建 systemd 单元,设置 JAVA_HOME/CATALINA_HOME 等环境变量,便于开机自启与统一运维。
- 目录与权限:确保 Tomcat 用户对 webapps/、logs/、work/ 具备读写权限;避免在 webapps 下直接放源码,优先使用 WAR 包自动部署。
- 安全与加固:在 conf/web.xml 将 listings 设为 false 禁止目录浏览;删除不必要的示例与管理应用;按需调整连接器参数(如 connectionTimeout、maxThreads)。