JSP引擎与JDK、Servlet引擎与JRE的区别及Tomcat相关技术问询
JSP/Servlet核心问题解答
根据相关JSP/Servlet教程:JSP引擎首先将JSP文件转换为Servlet(.java),然后编译为类文件(.class),由此可见JSP引擎=转换器+编译器。
问题1:Tomcat的内置编译器是什么?是JDK的javac吗?若不是,Tomcat为何需要知晓JAVA_HOME环境变量(Java安装根目录)?二者存在怎样的关联?
其实Tomcat自带的内置编译器是Eclipse JDT Compiler(简称ECJ),这是一个纯Java实现的编译器,不需要依赖完整的JDK就能完成编译工作。不过它也支持切换使用JDK的javac,所以很多人会误以为它默认用的是javac。
至于Tomcat为啥需要JAVA_HOME,主要有这几个原因:
- 首先,Tomcat本身是用Java开发的,它的启动和运行依赖JRE(Java运行时环境),而
JAVA_HOME指向的JDK目录里包含了完整的JRE环境,Tomcat需要通过这个环境变量找到运行自身的基础依赖。 - 其次,如果用户配置Tomcat使用
javac作为编译器(而不是内置的ECJ),那么就必须通过JAVA_HOME定位到JDK的安装路径,才能调用javac工具完成编译。 - 另外,Tomcat的一些扩展功能、第三方插件或者内部工具类,可能需要调用JDK中的特定API或工具,
JAVA_HOME能确保这些功能正常运行。
总结一下:Tomcat自己带了“独立编译器”,但它的运行基础和可选的javac编译支持,都需要JAVA_HOME来定位完整的Java环境根目录。
问题2:Servlet引擎负责执行类文件,看起来属于运行时环境。它是否和JSP引擎是同一组件?二者的关系是什么?
Servlet引擎和JSP引擎并不是完全独立的两个组件,在Tomcat这类Web容器中,它们是紧密结合的:
- JSP引擎的职责是把JSP文件转成Servlet的
.java源码,再编译成.class文件,这个过程属于编译阶段。 - Servlet引擎则负责加载、实例化并执行这些Servlet类文件,处理HTTP请求和响应,属于运行阶段。
在Tomcat里,这两个功能是集成在同一个容器中的——JSP引擎处理完JSP的编译后,会把生成的Servlet类交给Servlet引擎去执行。可以说,JSP引擎是Servlet引擎的“前置辅助模块”,专门用来处理JSP这种特殊的Servlet形式,而Servlet引擎是整个Web容器的核心运行时基础。
当然,如果你只部署纯Servlet类文件,JSP引擎可以不用工作,但只要涉及JSP,就必须依赖JSP引擎完成编译,再交给Servlet引擎运行。
内容的提问来源于stack exchange,提问作者Peng
相关产品推荐
相关产品推荐

