动力节点JavaWeb视频
从底层源码开始讲起, 讲解的非常详细,对比过尚硅谷的视频,推荐动力节点。
视频是直播的录像,有些时候比较啰嗦,尤其到EL表达式之后,1小时的内容能讲3小时。
系列文章目录
- 第一章 配置环境、配置IDEA
- 第二章 GenericServlet源码解析 特别重要
- 第三章 HttpServlet
- 第四章 HttpServletRequest
- 第五章 重定向 使用注解简化配置文件
- 第六章 JSP (上)
- 第七章 JSP (下)EL表达式 JTSL标签库
- 第八章 Session、Cookie
- 第九章 Filter过滤器、Listner 监听器
JavaServer Page的缩写。(基于Java语言实现的服务器端的页面)
功能:JSP做数据的展示;Servlet做逻辑处理、业务处理、连接数据库、数据处理······。
JSP文件的执行过程
- 创建新的Module,启动服务器,在浏览器打开根路径地址,系统会自动执行框架中自动生成的index.jsp文件。此时页面上会显示
$END$
打开下面的路径:
继续从上面的路径进入到:
\4bd61bbb-e235-4c43-8474-40431d3219c7\work\Catalina\localhost\jsp\org\apache\jsp
- 可以看到以jsp文件的文件名开头的两个文件:
- 系统在执行jsp文件时,就是在执行index_jsp.class文件。
- jsp文件执行过程总结:
用户访问到jsp文件时:Tomcat会将jsp文件按照JSP规范将其翻译为java文件,而后编译成为.class文件,然后执行。
源码分析
打开翻译后的.java文件
- 继承关系:继承自
org.apache.jasper.runtime.HttpJspBase
public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase
- 从
HttpJspBase
类中可以看到继承自HttpServlet
public abstract class HttpJspBase extends HttpServlet
HttpServlet
继承自Servlet
,所以index_jsp
类最终继承的是Servlet
- Servlet在创建时先执行
init()
和service()
。 - 同样,
HttpJspBase
类被Tomcat调用时,也会执行init()
和service()
。 - 通过
HttpJspBase
类中的service()
会调用子类也就是index_jsp
类中的_jspService()
。
总结: .jsp文件中的所有内容,最终都是放在_jspService()
方法体内执行的。
JSP文件的书写规范
-
<%@ page 属性=值 %>
:Page指令
contentType属性:浏览器输出中文乱码,与response.setContentType("text/html;charset=UTF-8");
功能相同contentType="text/html;charset=UTF-8">
-
<% Java代码 %>
:使用Java代码Java代码只能使用可以在方法体内使用的代码。
本质:JSP文件翻译为.java文件时,把代码放入到service()
方法体中。 -
字符串&HTML:不需要符号,与HTML文件格式一样
所有没有被JSP中定义的特殊符号包裹的字符,都会被当成字符串,通过
out.write("字符串");
输出到浏览器中,HTML标签会被浏览器解释执行。 -
<%-- 注释 --%>
:注释注释只会出现在JSP文件中,翻译后的java文件中是没有的。
-
<%=(表达式) %>
:输出变量或表达式翻译为:
out.print(表达式);
表达式可以是变量 -
<%! Java代码 %>
:Java代码将被翻译到service()
方法体外Java代码成为类的一部分:类成员属性、类的成员方法。jsp也是Servlet,生命周期会一直延续到服务器关闭,涉及线程安全问题,不建议使用
JSP示例
jsp文件:
<body>
<% for (int i = 0; i < 10; i++) { %>
<h2>
这是for循环输出的:i = <%= i %>
</h2>
<%}%>
</body>
翻译为java后,在Service方法中的代码:
out.write("<body>\n");
for (int i = 0; i < 10; i++) {
out.write("<h2>\n");
out.write("这是for循环输出的:i = ");
out.print(i);
out.write("</h2>\n");
}
out.write("\n");
out.write("</body>\n");
JSP指令集Page的属性
- 设置响应内容的类型和字符集
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
- 开启或关闭session
<%@ page session="false|true" %>
- 导包
<%@ page import="java.util.*" %>
- 设置发生错误时要跳转的页面
<%@ page errorPage="/error.jsp" %>
- 当前页面是否为错误页面
发生异常时只会显示错误页面的内容,不会显示具体的异常信息,需要使用exception将错误信息打印在控制台,方便调试。
<%@ page isErrorPage="true" %>
<%
exception.printStackTrace();
%>
- 忽略EL表达式
在这里插入代码片
JSP 的九大内置对象
- 域类型:
作用的范围:页面域 < 请求域 < 会话域 < 应用域。优先使用最小的域
都有setAttribute () getAttribute() removeAtrribute()方法用来传递数据。
jakarta.servlet.jsp.PageContext pageContext 页面域
jakarta.servlet.http.HttpServletRequest request 请求域
jakarta.servlet.http.HttpSession session 会话域
jakarta.servlet.ServletContext application 应用域
- 输出类型
jakarta.servlet.jsp.JspWriter out 输出到屏幕显示
jakarta.servlet.http.HttpServletResponse response 输出给浏览器
- 异常
java.lang.Throwable exception
- Servlet 配置信息
jakarta.servlet.ServletConfig config
- 页面(说是没用,暂时不知道干什么用的)
java.lang.Object page