焦点

jsp文件最终会转换为 文件

时间:2010-12-5 17:23:32  作者:休闲   来源:娱乐  查看:  评论:0
内容摘要:JSP文件最终会转换为Servlet类文件,这是Java Web开发中最基础也最容易被忽略的事实。 你写下的每一个<% %>标签,每一次out.println()调用,在服务器眼里都不是“

JSP文件最终会转换为Servlet类文件,文为文这是最件Java Web开发中最基础也最容易被忽略的事实。

你写下的终会转换每一个<% %>标签,每一次out.println()调用,文为文在服务器眼里都不是最件“页面”,而是终会转换一段Java代码的骨架。Tomcat启动时,文为文Jasper编译器会把你那个看起来像HTML的最件JSP文件,翻译成一个.java文件——名字通常叫index_jsp.java,终会转换放在work/Catalina/localhost/目录下。文为文然后这个.java又被javac编译成.class字节码。最件真正执行的终会转换是那个Servlet对象,你写的文为文JSP只是它的“前身”。

这个过程发生得非常早。最件第一次请求某个JSP时,终会转换容器会做这件事;如果JSP文件没改动过,后续请求直接复用那个已加载的Servlet实例。所以你会发现,改完JSP要重启或等容器检测到变化,它才重新编译——你改的不是“页面”,是“源码”。

有个细节很能说明问题:你如果在JSP里写<%! int count = 0; %>,这个变量会成为Servlet类的成员变量,多线程共享。而你在<% int local = 0; %>里定义的变量,则是_jspService()方法内的局部变量,每个请求独立。同一个文件里,两种写法编译后位置完全不同——前者在类级别,后者在方法栈帧里。这就是为什么并发下成员变量会出问题,而局部变量不会。

我见过不少新手调试时,在JSP里写大量业务逻辑,然后抱怨“页面好慢”。其实慢的不是页面,是那个被转换出来的Servlet在反复做数据库查询、字符串拼接。JSP的语法糖让你觉得在写模板,实际上你写的是_jspService()方法体里那一大坨try-finally包裹的代码。每次请求进来,那个方法被调用,所有的HTML标签都被write()输出。

所以理解这个转换关系,对排查问题特别有用。比如你发现页面输出的内容有重复,去看生成的.java文件,能看到是不是某个for循环把out.write()包住了。又比如你用了自定义标签,最终也是被解析成Java方法调用,没有魔法。

这种设计有它的历史原因——早期Servlet直接输出HTML太痛苦,JSP是作为反模板出现的。但现在前后端分离流行,JSP用得少了。可只要还在用,就得记住:你写的不是页面,是Servlet的另一种写法。那个.class文件才是服务器眼睛里真正的东西。打开work目录看一眼编译后的代码,比看十篇教程都管用。

最近更新
热门排行
copyright © 2026 powered by 力不从心网   sitemap