JavaWeb 16 JSP 原理剖析

6.1 什么是 JSP


跟 html 长的 一样,就多了 一些 java 的代码。

JSP:Java Server Pages (Java 服务器端页面,也和 Servlet 一样,用于 开发 动态 Web 技术!)

知道为什么 JSP 会诞生吗?我们学习 Servlet 的时候,难道 没感觉到一个问题吗?哈哈 ~

虽然 确实 根据 Servlet 的各种特性 和 功能,实现了 所谓的 动态开发网web。但是 使用 Servlet 去写 一个 网页 页面是 极其困难的。

在这里插入图片描述
看一下。。这是在 干嘛。。。

所以 JSP 就出现了。

特点:

  • 写 JSP 就像在 写 HTML
  • 区别:
  1. HTML 只给 用户提供静态的数据。
  2. JSP 页面中 可以 嵌入 Java 的代码,为 用户提供动态的数据。

6.2 JSP 原理

思路:

首先 JSP 是如何 执行的 ?

  • 代码层面没有任何问题(我们根本看不出来啥!)

  • 服务器内部工作(一下子就能看出来猫腻

tomcat 中有一个 work 目录;IDEA 在使用 Tomcat的时候 也会在 IDEA的 tomcat 中生成一个 work 目录。

  1. 寻找 work 目录,准备揭秘!
    比如说 我们找到 session 的 work 在其下面 一直 点击,会有一个 jsp 的文件夹,在这个文件夹下面,会发现 没有 jsp 文件!!!而对应的却是 java 的可执行文件!!

在这里插入图片描述
在这里插入图片描述
可以看到 里面 继承了一个 类,这个类 我们看一下 是啥。

直接 在 代码那里 输入 HttpJspBase,然后 ALT+回车
选择 add maven 就可以自动的添加 一下 这个 包。在这里插入图片描述
你会惊奇的 发现 这个 类,居然 继承了 servlet。难道说 我们的jsp 变成了 java 程序?而且 还是 基于 servlet 的 java 程序吗?

  1. 再次 观察 java 文件
    在这里插入图片描述
    石锤了!确实 是 把 jsp 文件的内容 翻译 成了 servlet java 程序 的代码。

  2. 记录一下 核心的 方法

//初始化部分
public void _jspInit() {
  }
//销毁部分
public void _jspDestroy() {
  }
//JSPService 
public void _jspService(final jakarta.servlet.http.HttpServletRequest request, final jakarta.servlet.http.HttpServletResponse response)
      throws java.io.IOException, jakarta.servlet.ServletException {

    if (!jakarta.servlet.DispatcherType.ERROR.equals(request.getDispatcherType())) {}  
  1. 判断请求是什么方式
  if (!jakarta.servlet.DispatcherType.ERROR.equals(request.getDispatcherType())) {
      final java.lang.String _jspx_method = request.getMethod();
      if ("OPTIONS".equals(_jspx_method)) {
        response.setHeader("Allow","GET, HEAD, POST, OPTIONS");
        return;
      }
      if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method)) {
        response.setHeader("Allow","GET, HEAD, POST, OPTIONS");
        response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "JSP 只允许 GET、POST 或 HEAD。Jasper 还允许 OPTIONS");
        return;
      }
    }
  1. 内置一些 需要用到的 对象
final jakarta.servlet.jsp.PageContext pageContext;//页面上下文
jakarta.servlet.http.HttpSession session = null;//session
final jakarta.servlet.ServletContext application;// applicationContext
final jakarta.servlet.ServletConfig config;//config
jakarta.servlet.jsp.JspWriter out = null;//out
final java.lang.Object page = this;// page 当前页面
jakarta.servlet.jsp.JspWriter _jspx_out = null;
jakarta.servlet.jsp.PageContext _jspx_page_context = null;

application 其实就是 servlet 的 ServletContext。

  1. 输出页面需要增加的代码
  response.setContentType("text/html");
      pageContext = _jspxFactory.getPageContext(this, request, response,
      			null, true, 8192, true);
      _jspx_page_context = pageContext;
      application = pageContext.getServletContext();
      config = pageContext.getServletConfig();
      session = pageContext.getSession();
      out = pageContext.getOut();
      _jspx_out = out;

      out.write("<html>\n");
      out.write("<body>\n");
      out.write("<h2>Hello World!</h2>\n");
      out.write("</body>\n");
      out.write("</html>\n");
  1. 探索 当页面动态生成的时候,work 目录是否会自动的生成 java 文件?

当我们运行 程序的时候,你会发现 work 文件夹 会被干掉!然后 好像再 重新 生成。

在这里插入图片描述
在这里插入图片描述
又出现了。。
当我们 去访问 hello.jsp 的时候 又会发生变化。在这里插入图片描述
在这里插入图片描述

所以所谓的 动态生成,原来就是 访问 请求的时候,生成对应的 java 文件呀!哈哈。挺简单的吗。

  1. JSP 整体的流程

在这里插入图片描述
6. 简单的测试一下 jsp 代码

<%--
  Created by IntelliJ IDEA.
  User: muqua
  Date: 2021/8/13
  Time: 9:04
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%
    String name = "哞哞";
%>
name:<%=name%>
</body>
</html>

在这里插入图片描述

JSP 为什么会被淘汰?

答:耦合性太强了,现如今的 前后端分离 已经不再 对 JSP 有太大的 好感。在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值