JavaWeb Tomcat (六)JSP(上)

动力节点JavaWeb视频
从底层源码开始讲起, 讲解的非常详细,对比过尚硅谷的视频,推荐动力节点。
视频是直播的录像,有些时候比较啰嗦,尤其到EL表达式之后,1小时的内容能讲3小时。

系列文章目录

JavaServer Page的缩写。(基于Java语言实现的服务器端的页面)
功能:JSP做数据的展示;Servlet做逻辑处理、业务处理、连接数据库、数据处理······。

JSP文件的执行过程

  1. 创建新的Module,启动服务器,在浏览器打开根路径地址,系统会自动执行框架中自动生成的index.jsp文件。此时页面上会显示 $END$

打开下面的路径:

在这里插入图片描述
继续从上面的路径进入到:
\4bd61bbb-e235-4c43-8474-40431d3219c7\work\Catalina\localhost\jsp\org\apache\jsp

  1. 可以看到以jsp文件的文件名开头的两个文件:
    在这里插入图片描述
  2. 系统在执行jsp文件时,就是在执行index_jsp.class文件。
  • jsp文件执行过程总结:
    用户访问到jsp文件时:Tomcat会将jsp文件按照JSP规范将其翻译为java文件,而后编译成为.class文件,然后执行。

源码分析

打开翻译后的.java文件

  1. 继承关系:继承自org.apache.jasper.runtime.HttpJspBase
public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase
  1. HttpJspBase类中可以看到继承自HttpServlet
public abstract class HttpJspBase extends HttpServlet
  1. HttpServlet继承自Servlet,所以index_jsp类最终继承的是Servlet
  2. Servlet在创建时先执行init()service()
  3. 同样,HttpJspBase类被Tomcat调用时,也会执行init()service()
  4. 通过HttpJspBase类中的service()会调用子类也就是index_jsp类中的_jspService()

总结: .jsp文件中的所有内容,最终都是放在_jspService()方法体内执行的。

JSP文件的书写规范

  1. <%@ page 属性=值 %>:Page指令
    contentType属性:浏览器输出中文乱码,与response.setContentType("text/html;charset=UTF-8");功能相同

    contentType="text/html;charset=UTF-8">
    
  2. <% Java代码 %>:使用Java代码

    Java代码只能使用可以在方法体内使用的代码。
    本质:JSP文件翻译为.java文件时,把代码放入到service()方法体中。

  3. 字符串&HTML:不需要符号,与HTML文件格式一样

    所有没有被JSP中定义的特殊符号包裹的字符,都会被当成字符串,通过out.write("字符串");输出到浏览器中,HTML标签会被浏览器解释执行。

  4. <%-- 注释 --%>:注释

    注释只会出现在JSP文件中,翻译后的java文件中是没有的。

  5. <%=(表达式) %>:输出变量或表达式

    翻译为:out.print(表达式);表达式可以是变量

  6. <%! 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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值