jsp编译后生成的文件是java servlet。因为web服务器无法直接执行jsp源码,必须将其转换为java虚拟机能加载和运行的标准servlet类,才能处理http请求并生成动态html响应。

因为Web服务器无法直接执行JSP源码,必须将其转换为Java虚拟机能加载和运行的标准类——Servlet,才能处理HTTP请求并生成动态HTML响应。
JSP为什么不能像HTML一样直接解析
浏览器只能渲染纯HTML、CSS、JavaScript,而JSP文件里混着、这类Java代码片段,【服务器端根本不会把JSP原样发给浏览器】。如果强行当作静态文件发送,Java代码会暴露在网页源码里,造成严重安全风险。
Tomcat等容器必须在服务端完成逻辑执行,再把结果(纯HTML)返回给浏览器。
JSP编译成Servlet的具体动因
第一步:JSP本质是语法糖,不是独立语言——它没有自己的虚拟机,也没有运行时环境。
第二步:Servlet是Java EE规范定义的标准组件模型,所有Java Web容器(Tomcat、Jetty、WebLogic)都内置了Servlet生命周期管理、线程池、请求分发、会话跟踪等完整能力。
第三步:把JSP转成Servlet,等于把页面逻辑“归位”到已有成熟机制中——【不用重造轮子,直接复用Servlet的init()、service()、destroy()整套执行框架】。
第四步:每次请求都实时解析JSP文本?效率极低。编译一次生成.class文件,后续请求直接调用字节码,性能接近原生Servlet。
不编译成Servlet会怎样
方法一:若跳过编译,直接逐行解释JSP文本——每次请求都要重新读取文件、拆解标签、拼接字符串、执行Java表达式,CPU和IO开销巨大,高并发下迅速崩溃。
方法二:若试图让JVM直接加载.jsp文件——JVM只认.class或.java,.jsp是自定义文本格式,【加载器根本无法识别,抛出ClassNotFoundException】。
方法三:若由前端JavaScript执行JSP逻辑——Java代码根本无法在浏览器里运行,new java.util.Date()这种写法会直接报语法错误。










