首先记录一下自己所知道东西:
1、jsp不是直接返回给浏览器的,而是首先转化为servlet(一个后缀为.java的文件里),然后转化为.class文件;
2、在tomcat服务器下面,只有当浏览器访问了jsp文件才会发生到servlet的转换;
3、如下图1,2,3在浏览器访问对应jsp(直接访问jsp文件和访问映射url生成的servlet文件是一样的),生成servlet的一个实例:
图1
图2
图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:
图4
图5
图6
图7
6、在浏览器访问时传送request对象给服务器,服务器返回response对象给浏览器:
图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
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 以及编译的时机。