详解JSP——从源码分析
何为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——从源码分析相关推荐
- FPGA学习之路—接口(3)—SPI详解及Verilog源码分析
FPGA学习之路--SPI详解及Verilog源码分析 概述 SPI = Serial Peripheral Interface,是串行外围设备接口,是一种高速,全双工,同步的通信总线. 优点 支持全 ...
- 【Swagger】配置信息详解(涉及源码分析)
先来说说 Swagger 有什么用,相较于使用 markdown 或者 word 写接口文档,Swagger 自动生成 API 文档,然后在 web 端暴露,并且 API 文档与 API 定义同步更新 ...
- 【Java 代码实例 14】BeanUtils用法详解,附源码分析
目录 一.org.apache.commons.beanutils.BeanUtils简介 二.使用的前置条件 三.添加pom 四.org.apache.commons.beanutils.BeanU ...
- @AliasFor注解详解(结合源码分析)
一. 概述 网上关于该注解的描述大都抄来抄去,没有涉及到最本质的源码问题, 下面是笔者结合注解源码, 以及其他常用的注解源码, 来分析@AliasFor注解的主要功能以及展示实际使用场景 描述:@Al ...
- android WebView详解,常见漏洞详解和安全源码(下)
上篇博客主要分析了 WebView 的详细使用,这篇来分析 WebView 的常见漏洞和使用的坑. 上篇:android WebView详解,常见漏洞详解和安全源码(上) 转载请注明出处:http ...
- 【Python】基金/股票 最大回撤率计算与绘图详解(附源码和数据)
如果你想找的是求最大回撤的算法,请跳转:[Python] 使用动态规划求解最大回撤详解 [Python]基金/股票 最大回撤率计算与绘图详解(附源码和数据) 0. 起因 1. 大成沪深300指数A 5 ...
- 生成对抗网络入门详解及TensorFlow源码实现--深度学习笔记
生成对抗网络入门详解及TensorFlow源码实现–深度学习笔记 一.生成对抗网络(GANs) 生成对抗网络是一种生成模型(Generative Model),其背后最基本的思想就是从训练库里获取很多 ...
- CNN入门详解及TensorFlow源码实现--深度学习笔记
CNN入门详解及TensorFlow源码实现–深度学习笔记 ##一.卷积神经网络 ###1.简介 卷积神经网络是一种前馈神经网络,它的人工神经元可以响应一部分覆盖范围内的周围单元,对于大型图像处理有出 ...
- JAVA文件上传详解(附源码)
文章目录 JAVA文件上传详解(附源码) 1.准备工作 2.使用类介绍 FileItem类 ServletFileUpload类 3.代码编写 JAVA文件上传详解(附源码) 在web应用中,文件上传 ...
最新文章
- C#下用P2P技术实现点对点聊天
- mac下软件包管理brew
- java 实现部门树_(java实现)哈夫曼(Huffman)树编码(自编压缩项目基础)
- 老男孩教育参观云计算公司
- 8万级自动挡智能SUV,舒适好开是亮点,众泰T600Coupe要逆天?
- windows下python SSH-Client模块paramiko的安装与修改
- 火狐中javascript
- java类型强转会有性能消耗吗_Java代码性能优化总结(转)
- 硬盘播出系统_昌吉广播电视台中型多功能演播室系统概述
- 机器学习自动写诗-学习笔记
- 问的书写规则是什么意思_汉字笔顺规则表
- 手机录制视频然后一帧一帧分析
- CodeForces 1015 C Songs Compression
- SpringMVC整合websocket实现消息推送及触发
- 小傻蛋的妹妹跟随小甲鱼学习Python的第十三节013
- python读取多个txt文件数据恢复_多个文件内容
- mplab哪个版本编译c语言,mplab c18编译器下载-mplab c18软件下载(正版MPLAB C18 C编译器) 3.0 完整版 - 河东下载站...
- Tomcat 服务器的部署与虚拟主机配置
- [work] python从字符串中提取所有数字到list
- 一文读懂无线信道传播的各种特性