jsp是如何工作的?

我想知道JSP有没有被编译? 我之所以要问的原因是因为每当我在Web服务器上部署我的Java EE应用程序时,我只会在WEB-INF文件夹中看到那些servlet和beans类文件,因为它们是编译的,但不是那个JSP,所以它是如何工作的什么是正常请求/响应周期的逻辑流程和大图。

基本上:

  • 在servlet容器中,JSP servlet映射到以.jsp结尾的任何URL(通常)

  • 当请求其中一个.jsp URL时,请求将转到JSP servlet。 然后,此servlet检查JSP是否已编译。

  • 如果尚未编译JSP,则JSP servlet会将JSP转换为实现Servlet接口的某些Java源代码。 然后,它将此Java源代码编译为.class文件。 此.class文件通常位于servlet容器的应用程序工作目录中的某个位置。

  • 一旦JSP servlet从JSP源代码编译了servlet类,它就会将请求转发给这个servlet类。

问题是,除非您专门预编译JSP,否则所有这些都在运行时发生,并隐藏在servlet容器的工作目录中,因此它是“不可见的”。 另外请记住,这是“概念上”发生的事情,在此工作流程中可以进行多项优化。

JSP编译为Servlets。 它们只有一个特殊的编译器,通常嵌入在容器中。

来自good ole维基百科:

从架构上讲,JSP可以被视为Java servlet的高级抽象。 JSP在运行时被转换为servlet; 每个JSP的servlet都被缓存并重新使用,直到修改了原始JSP。

是的,他们被编译了!

较旧的编译器甚至生成了java和类文件。

对于较新的编译器(至少从Sun JDK 6 update 30开始),它们可以在内存中执行所有字节码生成,因此您在应用程序worktemp目录中看不到任何痕迹。

在运行时,JSP代码解释JSP代码,JSP编译器解析JSP代码中的所有特殊function并将它们转换为Java代码。 从每个JSP创建的Java类实现Servlet 。 然后,Java代码经历与通常相同的循环。 仍然在运行时,它被编译成字节码然后编译成机器代码。 最后,JSP-turned-Servlet像任何其他Servlet一样响应请求。

如果查看* _jsp.java文件,您应该找到的是扩展org.apache.jasper.runtime.HttpJspBase的类。 这个抽象类扩展了HttpServletHttpJspBase提供了一些将由Tomcat编译的所有JSP使用的基本function,并且在执行JSP时,最终会执行该Servlet上的服务方法,最终执行_jspService方法。 如果检查_jspService方法,您将发现一系列将HTML写入输出流的方法调用。 这段代码对您来说应该非常熟悉,因为它与您用此JSP替换的Java代码没有什么不同。

当然,JSP Servlet类在每个Web容器上看起来都不一样。 例如,org.apache.jasper类是特定于Tomcat的类。 您的JSP在运行它的每个不同Web容器上编译的方式不同。 重要的是,JSP的行为和语法有一个标准规范,只要您使用的Web容器符合规范,您的JSP就应该在所有这些上运行相同,即使它们是Java代码翻译成完全不同的外观。

Nicholas S Williams专业Java for Web Applications中获取 (并转述)