JSP的执行原理、JSP的内置对象、四大作用域解析、MVC模式理解>从零开始学JAVA系列
- JSP的执行原理、JSP的内置对象、四大作用域解析、MVC模式理解
- JSP的执行原理
- 这里拿一个小例子来解析JSP是如何被访问到的
- JSP的执行过程
- 浏览器访问JSP的时候,会被tomcat的拦截器进行拦截,通过查看tomcat配置文件的web.xml中可以看到一个Servlet
- 我们在tomcat的lib目录下找到这个jar包
- 具体源码就先不了解了,通过这个JspServlet的处理后,会将JSP文件转换为一个JAVA文件,然后再编译成class文件,我们可以在项目运行后打包的目录(部署目录)中看到
- 通过查看JSP文件转换成的JAVA文件我们可以看到这个JAVA类继承了HttpJspBase,而HttpJspBase又继承了HttpServlet,由此可见,JSP本质上就是一个Servlet
- 看看通过JSP转换的JAVA文件的内部结构就能知道其实页面的标签都是通过Response对象中的out对象打印出来的
- JSP语法
- JSP的九大内置对象
- 四大作用域
- MVC模式的理解
- JSP的执行原理
JSP的执行原理、JSP的内置对象、四大作用域解析、MVC模式理解
JSP的执行原理
这里拿一个小例子来解析JSP是如何被访问到的

首先将该项目部署到tomcat,并且通过tomcat启动
通过URL访问该JSP文件:http://localhost:8080/untitled_war_exploded/
先说一下为什么能通过这个网址访问到index页面
1、部署的项目名为untitled_war_exploded

2、因为tomcat的配置文件conf文件夹中的web.xml配置了默认的welcome-file-list标签

3、为什么这个index.jsp在根路径下?因为web项目的web根目录默认会成为部署目录的根目录


通过这个小例子可以看到tomcat服务器启动后是如何访问到的
JSP的执行过程
浏览器访问JSP的时候,会被tomcat的拦截器进行拦截,通过查看tomcat配置文件的web.xml中可以看到一个Servlet
浏览器在访问该jsp文件的时候,便是该Servlet进行的处理


我们在tomcat的lib目录下找到这个jar包

具体源码就先不了解了,通过这个JspServlet的处理后,会将JSP文件转换为一个JAVA文件,然后再编译成class文件,我们可以在项目运行后打包的目录(部署目录)中看到

通过查看JSP文件转换成的JAVA文件我们可以看到这个JAVA类继承了HttpJspBase,而HttpJspBase又继承了HttpServlet,由此可见,JSP本质上就是一个Servlet


看看通过JSP转换的JAVA文件的内部结构就能知道其实页面的标签都是通过Response对象中的out对象打印出来的

JSP语法
小脚本、声明式、表达式三种语法的区别
<!-- 小脚本 -->
<%
// 这里可以写java代码,注意、这里的java代码,最后将JSP转换为java文件的时候
// 这里的java代码都是放在执行的方法 _jspService 中的
%>
<!-- 声明式 -->
<%!
// 这里用于定义一些成员变量,当然,也可以定义静态
%>
<!-- 表达式,用于输出表达式的值 -->
<%=10%>
声明式的例子


EL表达式及使用EL表达式获取四个作用域
<!-- JSP中的EL表达式的格式为: ${这里写表达式} -->
使用EL表达式获取四个作用域
${pageContext} // page作用域
${requestScope}// request作用域
${sessionScope}// session作用域
${applicationScope}// 服务器作用域,其实就是ServletContext对象
使用JSP中的JSTL
- 引入jar包,放在WEB-INF/lib目录下

- 将jar包添加到库文件
- 在JSP文件添加taglib引入JSTL,前缀为c,接下来就可以在jsp文件中使用c标签了
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

JSP的九大内置对象
| 内置对象 | 所属类型 | 主要用途 |
|---|---|---|
| request | javax.servlet.HttpServletRequest | 包含了请求方的数据 |
| response | javax.servlet.HttpServletResponse | 包含了响应给客户端的数据 |
| out | javax.servlet.jsp.JspWriter | response中的标准输出 |
| session | javax.servlet.Http.HttpSesssion | 解决HTTP无状态的问题 |
| application | javax.serlvet.ServletContext | 实现多用户多请求之间数据的共享,全局配置 |
| config | javax.servlet.ServletConfig | Servlet的配置信息 |
| pageContext | javax.servlet.jsp.PageServlet | 提供当前页面的属性 |
| page | java.lang.Object | 相当于JSP编译成java文件后的this |
| exception | java.lang.Throwable | 用于异常处理 |
exception异常处理对象的使用
- 在需要进行异常处理的JSP页面中,需要配置errorPage属性

- 在error页面中,需要配置isErrorPage为true

四大作用域
page作用域(作用范围仅限当前页面,使用率很低)
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<base href="<%=request.getContextPath() + "/"%>">
<%
pageContext.setAttribute("pageKey","pageValue");
%>
</head>
<body>
<%--可以获取到 √ --%>
<%=pageContext.getAttribute("pageKey")%><br>
<%-- 动态导入,相当于方法调用,因为实质上还是2个页面,demo1.jsp页面中无法访问到该 pageKey × --%>
<jsp:include page="demo1.jsp"></jsp:include>
<br>
<%-- 静态导入,相当于将该jsp的内容复制到了这个jsp文件中,所以相当于是同一个页面,可以访问到该 pageKey √ --%>
<%@include file="demo2.jsp"%>
</body>
</html>
request作用域(作用范围为一个请求之内)
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<base href="<%=request.getContextPath() + "/"%>">
<%
request.setAttribute("requestKey","requestValue");
%>
</head>
<body>
<%-- 动态导入,相当于方法调用,但是还是在一个请求当中,所以demo1.jsp中能够获取到值 √ --%>
<jsp:include page="demo1.jsp"></jsp:include>
<br>
<%-- 静态导入,相当于将该jsp的内容复制到了这个jsp文件中,所以相当于是同一个页面,可以访问到该request作用域的值 √ --%>
<%@include file="demo2.jsp"%>
</body>
</html>
session作用域(作用范围为一个会话,浏览器关闭则会话结束)
// 在demo1中为session作用域设置一个值
session.setAttribute("hello","你好呀,我很好哦!");
// 在demo2中访问依然能够获得。
// 但是如果关闭掉浏览器,再次来访问时,就无法获取到了
application作用域(作用范围为整个服务器)
// 在demo1中为application作用域中设置一个值
application.setAttribute("appKey","我是一个小皮匠");
// 在当前浏览器中访问demo2,demo2中可以通过表达式获取到,(当然不止这一种获取方式)
${applicationScope.get("appKey")}
// 即使切换一个浏览器再次访问demo2.jsp文件,依然能够获取到该作用域中的值
MVC模式的理解
MVC对应的英文是什么?
M -> Model 模型 > javaBean
V -> View 视图 > JSP、html等
C -> Control 控制 > servlet
如何理解Model模型层
Model本质其实就是JavaBean,而JavaBean的定义为> 符合规范的JAVA类、是一种可重用的组件。
符合如下规范的java类就是JavaBean
- 该类必须是public class修饰
- 该类中的属性必须为private私有的
- 如果需要访问该类的属性,则需要添加对应的 getter setter方法
按照功能分类,可以将JavaBean分为如下两种 - 封装数据的JavaBean:例如实体(Entity)
- 封装业务的JavaBean:Dao持久层(Mapper)、Service业务层
View视图层
View视图层的本质就是为了给页面展示数据,实现浏览器与用户之间的交互。
JSP、Html、jquery、js等都是视图层的内容
Control控制层
Control控制层的本质就是用于接收客户端的请求、获取需要的数据、响应给客户端。
Servlet就是控制层的代表
JSP的执行原理、JSP的内置对象、四大作用域解析、MVC模式理解>从零开始学JAVA系列的更多相关文章
- JSP脚本中的9个内置对象
JSP脚本中包含9个内置对象,这9个内置对象都是Servlet API接口的实例,只是JSP规范对它们进行了默认初始化.也就是说它们已经是对象,可以直接使用. 我们随意打开一个由JSP页面生成的Ser ...
- JSP 脚本中的 9 个内置对象
JSP 脚本中包含了 9 个内置对象,这 9 个内置对象都是 Servlet API 接口的实例,只是 JSP 规范对它们进行了默认初始化. 这 9 个内置对象如下: 1.application:ja ...
- JSP学习笔记(1)——Jsp指令、动作元素和内置对象
简单来说,javaweb技术就是让服务器端能够执行Java代码,之后返回数据给客户端(浏览器)让客户端显示数据 jsp页面中可以嵌套java代码(java小脚本)和嵌套Web前端(html,css,j ...
- JSP最常用的五种内置对象(out,request,response,session,application)
为了简化开发过程,JSP提供了一些内置对象,它们由容器实现和管理.开发者在JSP页面中无需声明,无需实例化就可使用.主要有out,request,response,session,applicatio ...
- javaweb九大个内置对象,四大域
9个内置对象如下: 1.session对象:会话对象 当客户端第一次访问服务器的页面时,web服务器会自动为该客户端创建一个session对象并分配一个唯一的id号 常常用它来在多个页面间共享数据,如 ...
- jsp提交表单数据乱码,内置对象,以及过滤器
jsp提交表单数据乱码解决方案 通过form表单给服务器提交数据的时候,如果提交的是中文数据,那么可能会出现乱码,如果表单的请求方式是post请求,那么可以使用如下方案解决乱码: 在调用getPara ...
- JAVAWEB - Servlet原理及其使用>从零开始学JAVA系列
目录 Servlet原理及其使用 什么是Servlet Servlet的使用 编写一个Servlet,使用继承HttpServlet的方式 配置web.xml 很简单的几个JSP文件 小提示,如果继承 ...
- JAVAWEB的基本入门(JSP、Tomcat)>从零开始学JAVA系列
目录 JAVAWEB的基本入门(JSP.Tomcat) 使用idea创建web项目的两种方式 1.直接创建一个web项目(这样创建好的项目可以直接运行) 2.创建一个普通的java项目并配置web模块 ...
- Session与Cookie的原理以及使用小案例>从零开始学JAVA系列
目录 Session与Cookie的原理以及使用小案例 Cookie和Session所解决的问题 Session与Cookie的原理 Cookie的原理 Cookie的失效时机 小提示 Session ...
随机推荐
- 性能工具之linux常见日志统计分析命令
引言 我前几天写过的性能工具之linux三剑客awk.grep.sed详解,我们已经详细介绍 linux 三剑客的基本使用,接下来我们看看具体在性能测试领域的运用,本文主要介绍的是在 Tomcat 和 ...
- 对标 Spring Boot & Cloud ,轻量框架 Solon 1.5.8 发布
Solon 是一个轻量的Java基础开发框架.强调,克制 + 简洁 + 开放的原则:力求,更小.更快.更自由的体验.支持:RPC.REST API.MVC.Job.Micro service.WebS ...
- excel VBA正则匹配单元格符号,并按符号把单元格拆分行(这里是按第一列分行,分行是从活动单元格的行开始,分行前需要选择所有需要填充内容的列,否则需要后期手动填充)
Sub W() ' MsgBox "行数:" & Selection.Rows.Count Dim rows_count As Integer Dim ro ...
- python之tuple元组,基础篇
元组:它是一个序列,跟列表一样,里面存放多个元素 特点:1.有序的2.每个元素不可以被更改,不可以增加,不可以删除3.元组每个元素可以是任何数据类型1,定义一个非空元组 name_tuple = (& ...
- Docker:docker部署Tomcat运行web项目
查找Docker Hub上的tomcat镜像 docker search tomcat 拉取官方的镜像 docker pull tomcat 启动Tomcat服务 方式1: 通过dockerfile生 ...
- springboot集成swagger添加消息头(header请求头信息)
springboot集成swagger上篇文章介绍: https://blog.csdn.net/qiaorui_/article/details/80435488 添加头信息: package co ...
- 基于Vue/React项目的移动端适配方案
本文的目标是通过下文介绍的适配方案,使用vue或react开发移动端及H5的时候,不需要再关心移动设备的大小,只需要按照固定设计稿的px值布局,提升开发效率. 下文给出了本人分别使用create-re ...
- 深入浅出图神经网络 GCN代码实战
GCN代码实战 书中5.6节的GCN代码实战做的是最经典Cora数据集上的分类,恰当又不恰当的类比Cora之于GNN就相当于MNIST之于机器学习. 有关Cora的介绍网上一搜一大把我就不赘述了,这里 ...
- SpEL表达式总结(转)
前言 SpEL(Spring Expression Language),即Spring表达式语言,是比JSP的EL更强大的一种表达式语言.为什么要总结SpEL,因为它可以在运行时查询和操作数据,尤其是 ...
- .NET 6 Preview 6 正式发布: 关注网络开发
微软.NET 团队的项目经理在博客上发布了.NET 6 Preview 6, 在候选发布阶段之前的倒数第二个预览版,也就是8月份还会发布一个Preview 7,9月份开始进入RC,两个候选版本将专注 ...