当前位置: 首页 > news >正文

Java Web 10 JSP 10.3 JSP 原理

Java Web

【黑马程序员新版JavaWeb基础教程,Java web从入门到企业实战完整版】

10 JSP

文章目录

      • Java Web
      • 10 JSP
        • 10.3 JSP 原理

10.3 JSP 原理

JSP 中可以写HTML标签,这好像是个页面,但是为何它还能写Java 代码。

Because JSP的本质就是一个Servlet。!

【访问jsp 的流程】

在这里插入图片描述

  1. 浏览器第一次访问 hello.jsp 页面
  2. tomcat 会将 hello.jsp 转换为名为 hello_jsp.java 的一个 Servlet
  3. tomcat 再将转换的 servlet 编译成字节码文件 hello_jsp.class
  4. tomcat 会执行该字节码文件,向外提供服务

查看target目录:

在这里插入图片描述

看看这是啥

/*
 * Generated by the Jasper component of Apache Tomcat
 * Version: Apache Tomcat/7.0.47
 * Generated at: 2022-09-12 08:13:33 UTC
 * Note: The last modified time of this file was set to
 *       the last modified time of the source file after
 *       generation to assist with modification tracking.
 */
package org.apache.jsp;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;

public final class hello_jsp extends org.apache.jasper.runtime.HttpJspBase
    implements org.apache.jasper.runtime.JspSourceDependent {

  private static final javax.servlet.jsp.JspFactory _jspxFactory =
          javax.servlet.jsp.JspFactory.getDefaultFactory();

  private static java.util.Map<java.lang.String,java.lang.Long> _jspx_dependants;

  private javax.el.ExpressionFactory _el_expressionfactory;
  private org.apache.tomcat.InstanceManager _jsp_instancemanager;

  public java.util.Map<java.lang.String,java.lang.Long> getDependants() {
    return _jspx_dependants;
  }

  public void _jspInit() {
    _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
    _jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig());
  }

  public void _jspDestroy() {
  }

  public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
        throws java.io.IOException, javax.servlet.ServletException {

    final javax.servlet.jsp.PageContext pageContext;
    javax.servlet.http.HttpSession session = null;
    final javax.servlet.ServletContext application;
    final javax.servlet.ServletConfig config;
    javax.servlet.jsp.JspWriter out = null;
    final java.lang.Object page = this;
    javax.servlet.jsp.JspWriter _jspx_out = null;
    javax.servlet.jsp.PageContext _jspx_page_context = null;


    try {
      response.setContentType("text/html;charset=UTF-8");
      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("\r\n");
      out.write("\r\n");
      out.write("\r\n");
      out.write("<html>\r\n");
      out.write("<head>\r\n");
      out.write("    <title>Title</title>\r\n");
      out.write("</head>\r\n");
      out.write("<body>\r\n");
      out.write("<h1>Hello JSP</h1>\r\n");

    System.out.println("Hello,JSP.");

      out.write("\r\n");
      out.write("</body>\r\n");
      out.write("</html>\r\n");
    } catch (java.lang.Throwable t) {
      if (!(t instanceof javax.servlet.jsp.SkipPageException)){
        out = _jspx_out;
        if (out != null && out.getBufferSize() != 0)
          try { out.clearBuffer(); } catch (java.io.IOException e) {}
        if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
        else throw new ServletException(t);
      }
    } finally {
      _jspxFactory.releasePageContext(_jspx_page_context);
    }
  }
}

在这里插入图片描述

看看代码:

在这里插入图片描述

可以看到这个类继承了一个叫 HttpJspBase 的类。

查看Tomcat 源码

在这里插入图片描述

在这里插入图片描述

OMG,可以看到这个类继承了 HttpServlet ,那这样子的话 hello_jsp 这个类就间接的继承了 HttpServlet ,也就说明 hello_jsp 是一个 servlet 。 【Java 多重继承】

再看下面

在这里插入图片描述

这个方法就是每次访问 JSP 时自动执行的方法,和 servlet 中的 service 方法一样 。

它往浏览器中的写了标签代码。

像上次那个JD案例,HTML 代码是咱们自己通过writer 对象写进浏览器的,但是现在有了JSP 后,由Tomcat 完成这个功能。

OMG。

相关文章:

  • extern “C“
  • 基于ARM9平台的网络可视电话设计
  • [Qualcomm][GPIO]高通芯片引脚相关知识记录
  • 平衡二叉树之红黑树
  • 【python-Unet】计算机视觉~舌象舌头图片分割~机器学习
  • 【云原生】Hive on k8s 环境部署
  • 一起来学Kotlin:概念:1. Kotlin ArrayListOf 的使用案例
  • 基于MATLAB/GUI的自组网仿真平台,对比leach,ADOV协议
  • 四、哈希表相关题目
  • 【WSN定位】基于改进chan算法和talor算法实现多基站目标定位附matlab代码
  • 【LeetCode每日一题】2022-10-02 777. 在LR字符串中交换相邻字符 Java实现
  • 网络安全从业人员能力图谱
  • 从程序员的角度看人类通信史
  • OpenCV之识别银行卡号
  • 回归-线性回归算法(房价预测项目)
  • JavaScript 如何正确处理 Unicode 编码问题!
  • eclipse(luna)创建web工程
  • Fabric架构演变之路
  • flask接收请求并推入栈
  • golang中接口赋值与方法集
  • iOS 颜色设置看我就够了
  • Java到底能干嘛?
  • JS题目及答案整理
  • k个最大的数及变种小结
  • mysql 5.6 原生Online DDL解析
  • PHP CLI应用的调试原理
  • vue-cli3搭建项目
  • 爱情 北京女病人
  • 翻译 | 老司机带你秒懂内存管理 - 第一部(共三部)
  • 极限编程 (Extreme Programming) - 发布计划 (Release Planning)
  • 深度学习在携程攻略社区的应用
  • 十年未变!安全,谁之责?(下)
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • C# - 为值类型重定义相等性
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • #《AI中文版》V3 第 1 章 概述
  • (1综述)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练
  • (2009.11版)《网络管理员考试 考前冲刺预测卷及考点解析》复习重点
  • (C语言)fread与fwrite详解
  • (笔试题)分解质因式
  • (原)Matlab的svmtrain和svmclassify
  • .net core 3.0 linux,.NET Core 3.0 的新增功能
  • .net core 6 集成 elasticsearch 并 使用分词器
  • .NET 设计一套高性能的弱事件机制
  • .Net 应用中使用dot trace进行性能诊断
  • .net程序集学习心得
  • .NET设计模式(2):单件模式(Singleton Pattern)
  • [] 与 [[]], -gt 与 > 的比较
  • [AIGC] Nacos:一个简单 yet powerful 的配置中心和服务注册中心
  • [Angular] 笔记 6:ngStyle
  • [asp.net core]project.json(2)
  • [bzoj1901]: Zju2112 Dynamic Rankings
  • [C# 网络编程系列]专题六:UDP编程
  • [C++11 多线程同步] --- 条件变量的那些坑【条件变量信号丢失和条件变量虚假唤醒(spurious wakeup)】
  • [CentOs7]搭建ftp服务器(2)——添加用户