JSP底层原理分析
-
在WEB-INF目录外创建一个index.jsp文件
-
将项目部署成功之后启动服务器,浏览器访问该jsp页面,在服务器启动页面可以看到CATALINE_BASE这个信息
- org.apache.catalina.startup.VersionLoggerListener.log CATALINA_BASE: C:\Users\Edimd\AppData\Local\JetBrains\IntelliJIdea2021.3\tomcat\eb4eabe6-8276-4635-85ed-a2c10a0735f6
- 我们打开这个文件夹
- 赫然看到,这个jsp被Tomcat翻译为了java程序,并且被编译为index_jsp.class文件
- 我们访问index.jsp实际上是访问index_jsp.class中的方法
-
JSP实际上就是一个Servlet
- 在访问index.html时会Tomcat会自动翻译生成index_jsp.java,会自动编译生成index_jsp.class,所以JSP是一个类
- index_jsp.java继承了HttpJspBase,而HttpJspBase继承了HttpServlet,所以JSP本质上还是一个Servlet
- jsp的生命周期和Servlet完全相同,没有任何区别
- jsp和Servlet都是单例的(假单例)
-
jsp第一次访问的时候比较慢,为什么?
-
第一次访问
- 要把jsp文件翻译为java源文件
- java源文件要编译生成class文件
- 然后通过class创建servlet对象
- 调用servlet的init方法
- 调用servlet的service方法
-
第二次访问
- 直接调用单例对象的service方法
-
-
jsp是什么?
- jsp是java程序
- jsp是:JavaServer Page的缩写(基于java实现的服务端页面)
- jsp是JavaEE的13个子规范之一
-
对JSP执行错误调试时,要打开JSP文件对应的java文件,检查java代码
-
JSP基础语法
-
在JSP中编写的文字,都会被自动翻译到Servlet类当中的out.write("这里当中"),被java程序当作普通字符串打印输出到浏览器当中。
-
解决中文乱码
-
<%@page contentType="text/html; charset=utf-8" %>
-
-
怎么在JSP中编写java代码
- <% java 语句%>
- 在这个语句内写的语句被视为java代码被翻译到service方法内部
- <%%>这里本质上是在service方法体中写java代码,只有能出现在方法体的代码才能写上
- <%--%>jsp注释,使用该注释,注释内容不会被翻译到java源文件中
- service方法体中写的代码要遵循顺序,依次逐行执行
- <%! %>这是在service方法之外,类体里面写代码
- <% java 语句%>
-
-
Jsp和Servlet有什么区别?
- 职责不同
- Servlet的职责是什么?收集数据(纯java,连接数据库收集数据,逻辑业务处理)
- JSP的职责是什么?展示数据,(jsp的强项是做数据的展示)
- 本质上JSP是Servlet,只是擅长的方向不一样
- 职责不同
-
怎么在jsp中输出java变量
- 使用jsp内置对象,out.write("i =" + i);
- 如果输出的内容含有java代码
- <%=%>在=后面编写要输出的内容:<%=i%>
- <%=%>这个符号会被翻译到哪个地方?什么时候用到?
- 当你输出的内容中含有变量时
- 最终被翻译到service方法中的out.print()代码
-
JSP基础语法总结
- JSP中直接编写普通字符串
- 翻译到service方法的内部,翻译为:out.write("");
- <%%>
- 翻译到service方法内部,里面是一条一条java语句
- <%!%>
- 翻译到service方法体外部,类体内部
- <%=%>
- 翻译到service方法内部,翻译为:out.print();
- JSP中直接编写普通字符串