何为JSP

Java Server Pages:java服务器端页面 和Servlet一样 用于动态web技术

特点:

跟在写HTML一样

区别:

HTML只给用户提供静态的数据
JSP页面中可以嵌入Java代码 为用户提供动态数据

JSP原理分析:

jsp执行流程
服务器内部:
tomcat内部有个work目录

IDEA使用tomcat会在IDEA的tomcat中生成一个work目录

看了这两处地方 我们可以发现 我们所写的jsp页面最终变成了java程序
浏览器向服务器发送请求 ,不管访问什么资源 ,其实都是在访问Servlet
JSP最终也会转换成一个Java类

打开此文件

1:验证JSP本身就是一个Servlet类

public final class index_jsp extends org.apache.jasper.runtime.HttpJspBaseimplements org.apache.jasper.runtime.JspSourceDependent,org.apache.jasper.runtime.JspSourceImports

发现extends org.apache.jasper.runtime.HttpJspBase
然而HttpJspBase 又继承了HttpServlet
所以这个类本身就是Servlet

最终还是变成以前那种手动输出页面的方式实现

2:查看该Java类的代码 就是Servlet接口中三个代表生命周期的方法

public void _jspInit() {//初始化方法}public void _jspDestroy() {//销毁方法}public void _jspService(HttpServletRequest request,HttpServletResponse response){//调用JSP的Service}

3:查看该_jspService方法中的代码

 public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)throws java.io.IOException, javax.servlet.ServletException {if (!javax.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;}}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");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");} catch (java.lang.Throwable t) {if (!(t instanceof javax.servlet.jsp.SkipPageException)){out = _jspx_out;if (out != null && out.getBufferSize() != 0)try {if (response.isCommitted()) {out.flush();} else {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);}}

3_1:判断请求类型(执行 get | post )

if (!javax.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;}}

3_2:内置对象

 final javax.servlet.jsp.PageContext pageContext;    //页面上下文javax.servlet.http.HttpSession session = null;  //sessionfinal javax.servlet.ServletContext application;    //applicationContext 就是ServletContext改名而已final javax.servlet.ServletConfig config;      //configjavax.servlet.jsp.JspWriter out = null;            //outfinal java.lang.Object page = this;               //page代表当前页HttpServletRequest request                       //请求HttpServletResponse response                    //响应

3_3:输出页面前的代码用途

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;

以上这些对象 我们可以在JSP页面中直接使用

执行流程图解:

下面我们来编写一个简单的JSP Demo看一下

<%@ page pageEncoding="utf-8" %>
<html>
<body>
<h2>哈喽 潮汕奴仔</h2>
<%String name ="潮汕奴仔";
%>
欢迎:<%= name %>
</body>
</html>

在<% 代码 %>的代码就是Java代码

运行显示


运行的时候如果你没关闭原来的最终文件 他会提示

接下来查看最终的Java文件


对比之下 整个Java文件中只有输出页面的这部分代码发生变化

结论:

在JSP页面中,只要是Java代码就会原封不动的输出
如果是HTML代码 ,就会被转换为 out.print() 的格式输出

详解JSP——从源码分析相关推荐

  1. FPGA学习之路—接口(3)—SPI详解及Verilog源码分析

    FPGA学习之路--SPI详解及Verilog源码分析 概述 SPI = Serial Peripheral Interface,是串行外围设备接口,是一种高速,全双工,同步的通信总线. 优点 支持全 ...

  2. 【Swagger】配置信息详解(涉及源码分析)

    先来说说 Swagger 有什么用,相较于使用 markdown 或者 word 写接口文档,Swagger 自动生成 API 文档,然后在 web 端暴露,并且 API 文档与 API 定义同步更新 ...

  3. 【Java 代码实例 14】BeanUtils用法详解,附源码分析

    目录 一.org.apache.commons.beanutils.BeanUtils简介 二.使用的前置条件 三.添加pom 四.org.apache.commons.beanutils.BeanU ...

  4. @AliasFor注解详解(结合源码分析)

    一. 概述 网上关于该注解的描述大都抄来抄去,没有涉及到最本质的源码问题, 下面是笔者结合注解源码, 以及其他常用的注解源码, 来分析@AliasFor注解的主要功能以及展示实际使用场景 描述:@Al ...

  5. android WebView详解,常见漏洞详解和安全源码(下)

    上篇博客主要分析了 WebView 的详细使用,这篇来分析 WebView 的常见漏洞和使用的坑.  上篇:android WebView详解,常见漏洞详解和安全源码(上)  转载请注明出处:http ...

  6. 【Python】基金/股票 最大回撤率计算与绘图详解(附源码和数据)

    如果你想找的是求最大回撤的算法,请跳转:[Python] 使用动态规划求解最大回撤详解 [Python]基金/股票 最大回撤率计算与绘图详解(附源码和数据) 0. 起因 1. 大成沪深300指数A 5 ...

  7. 生成对抗网络入门详解及TensorFlow源码实现--深度学习笔记

    生成对抗网络入门详解及TensorFlow源码实现–深度学习笔记 一.生成对抗网络(GANs) 生成对抗网络是一种生成模型(Generative Model),其背后最基本的思想就是从训练库里获取很多 ...

  8. CNN入门详解及TensorFlow源码实现--深度学习笔记

    CNN入门详解及TensorFlow源码实现–深度学习笔记 ##一.卷积神经网络 ###1.简介 卷积神经网络是一种前馈神经网络,它的人工神经元可以响应一部分覆盖范围内的周围单元,对于大型图像处理有出 ...

  9. JAVA文件上传详解(附源码)

    文章目录 JAVA文件上传详解(附源码) 1.准备工作 2.使用类介绍 FileItem类 ServletFileUpload类 3.代码编写 JAVA文件上传详解(附源码) 在web应用中,文件上传 ...

最新文章

  1. C#下用P2P技术实现点对点聊天
  2. mac下软件包管理brew
  3. java 实现部门树_(java实现)哈夫曼(Huffman)树编码(自编压缩项目基础)
  4. 老男孩教育参观云计算公司
  5. 8万级自动挡智能SUV,舒适好开是亮点,众泰T600Coupe要逆天?
  6. windows下python SSH-Client模块paramiko的安装与修改
  7. 火狐中javascript
  8. java类型强转会有性能消耗吗_Java代码性能优化总结(转)
  9. 硬盘播出系统_昌吉广播电视台中型多功能演播室系统概述
  10. 机器学习自动写诗-学习笔记
  11. 问的书写规则是什么意思_汉字笔顺规则表
  12. 手机录制视频然后一帧一帧分析
  13. CodeForces 1015 C Songs Compression
  14. SpringMVC整合websocket实现消息推送及触发
  15. 小傻蛋的妹妹跟随小甲鱼学习Python的第十三节013
  16. python读取多个txt文件数据恢复_多个文件内容
  17. mplab哪个版本编译c语言,mplab c18编译器下载-mplab c18软件下载(正版MPLAB C18 C编译器) 3.0 完整版 - 河东下载站...
  18. Tomcat 服务器的部署与虚拟主机配置
  19. [work] python从字符串中提取所有数字到list
  20. 一文读懂无线信道传播的各种特性

热门文章

  1. Qt4.8.2 模仿QQ右下角弹窗提示
  2. 2023年全国最新二级建造师精选真题及答案6
  3. 盘点基于ARM的十一种嵌入式操作系统
  4. 苹果审核reject理由大全(1): 兑换码、奖品是iphone
  5. 1,Python13_day1
  6. VScode调试C++代码时无法查看STL容器(string、vector等)
  7. bash 统计当前目录文件数量
  8. vim 详细用法解释总结
  9. 2017第八届蓝桥杯省赛c/c++本科B组试题总结及解题答案
  10. 如何搜索带颜色的隐蔽的美女靓图?