首先记录一下自己所知道东西:

1、jsp不是直接返回给浏览器的,而是首先转化为servlet(一个后缀为.java的文件里),然后转化为.class文件;

2、在tomcat服务器下面,只有当浏览器访问了jsp文件才会发生到servlet的转换;

3、如下图1,2,3在浏览器访问对应jsp(直接访问jsp文件和访问映射url生成的servlet文件是一样的),生成servlet的一个实例:

Java将jsp转成图片 jsp如何转换成servlet_html

图1



Java将jsp转成图片 jsp如何转换成servlet_servlet_02

图2


Java将jsp转成图片 jsp如何转换成servlet_html_03

图3


4、可以了解到,是函数_jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)处理返回的html文件;


5、例如我在jsp中写的代码的为图4这样,对应的处理代码(以红框框出的为例)由一个函数_jspx_meth_s_005fproperty_005f0(_jspx_page_context)来进行处理(图5,6),我现在还不清楚函数里面到底怎样处理,现在算是有个感性的认识,生成的html代码如图7:

Java将jsp转成图片 jsp如何转换成servlet_jsp_04

图4


Java将jsp转成图片 jsp如何转换成servlet_Java将jsp转成图片_05

图5



Java将jsp转成图片 jsp如何转换成servlet_服务器_06

图6


Java将jsp转成图片 jsp如何转换成servlet_服务器_07

图7


6、在浏览器访问时传送request对象给服务器,服务器返回response对象给浏览器:


Java将jsp转成图片 jsp如何转换成servlet_jsp_08

图8


7、在函数_jspService中(图3中)可以看到9大对象的传入,故而在程序员在编写jsp页面时可以直接使用者9大对象。




1、关于servlet:



Servlet 没有 main 方法,不能够独立的运行,它的运行需要容器的支持,Tomcat 是最常用的 JSP/Servlet 容器。

Servlet 运行在 Servlet 容器中,并由容器管理从创建到销毁的整个过程。

对于用户到达Servlet的请求,Servlet容器会创建特定于这个请求的ServletRequest对象和ServletResponse对象,然后调用Servlet的service方法。service方法从ServletRequest对象获得客户请求信息,处理该请求,并通过ServletResponse对象向客户返回响应信息。




2、JSP运行原理和九大隐式对象:



每个JSP 页面在第一次被访问时,WEB容器都会把请求交给JSP引擎(即一个Java程序)去处理。JSP引擎先将JSP翻译成一个_jspServlet(实质上也是一个servlet) ,然后按照servlet的调用方式进行调用。

由于JSP第一次访问时会翻译成servlet,所以第一次访问通常会比较慢,但第二次访问,JSP引擎如果发现JSP没有变化,就不再翻译,而是直接调用,所以程序的执行效率不会受到影响。

JSP引擎在调用JSP对应的_jspServlet时,会传递或创建9个与web开发相关的对象供_jspServlet使用。JSP技术的设计者为便于开发人员在编写JSP页面时获得这些web对象的引用,特意定义了9个相应的变量,开发人员在JSP页面中通过这些变量就可以快速获得这9大对象的引用。

这9个对象分别是哪些,以及作用也是笔试经常考察的知识点。
request
response
config
application
exception
Session
page
out
pageContext

JSP九大隐式对象对应关系
request HttpServletRequest
response HttpServletResponse
session HttpSession
application servletContext
config  servletConfig
out     JspWriter  ----->   PrintWriter
exception
page   this
pageContext


Java将jsp转成图片 jsp如何转换成servlet_servlet_09

3.JSP 工作原理



结合右边给出的流程图:

当客户端浏览器向服务器请求一个 JSP 页面时,服务器收到该请求后,首先检查所请求的这个JSP 文件内容 ( 代码 ) 是否已经被更新,或者是否是 JSP 文件创建后的第一次被访问:

--如果是,那么,这个 JSP 文件就会在服务器端的 JSP 引擎作用下转化为一个 Servlet 类的 Java 源代码文件。紧接着,这个 Servlet 类会在 Java 编译器的作用下被编译成一个字节码文件,并装载到 jvm 解释执行。剩下的就等同于 Servlet 的处理过程了。

--如果被请求的 JSP 文件内容 ( 代码 ) 没有被修改,那么它的处理过程也等同于一个 Servlet 的处理过程。即直接由服务器检索出与之对应的 Servlet 实例来处理。


需要注意的是,JSP 文件不是在服务器启动的时候转换成 Servlet 类的。而是在被客户端访问 的时候才可能发生转换的 ( 如 JSP 文件内容没有被更新等,就不再发生 Servlet 转换 )。


就 Tomcat 而言,打开目录 %Tomcat%/work/%您的工程文件目录%,然后会看到里面有 3

个子目录:org/apache/jsp,若没有这 3 个目录,说明项目的 JSP 文件还没有被访问过, 打开进到 jsp 目录下,会看到一些 *_jsp.java 和 *_jsp.class 文件,这就是 JSP 文件被转换成


Servlet 类的源文件和字节码文件了。


有兴趣的话,可以使用浏览器访问服务器中的 JSP,然后观察 JSP 转换 Servlet 以及编译的时机。