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 ...
随机推荐
- .Net Core with 微服务 - Elastic APM
上一次我们介绍了Seq日志聚合组件.这次要给大家介绍的是Elastic APM ,一款应用程序性能监控组件.APM 监控围绕对应用.服务.容器的健康监控,对接口的调用链.性能进行监控.在我们实施微服务 ...
- Golang超时机制--2秒内某个函数没被调用就认为超时
Golang超时机制--2秒内某个函数没被调用就认为超时 需求描述 当一整套流程需要其他程序来调用函数完成时通常需要一个超时机制,防止别人程序故障不调你函数导致你的程序流程卡死 实现demo pack ...
- Vue前端访问控制方案
1.前端访问控制的常规处理方法 前端访问控制,一般针对界面元素dom element进行可见属性或enable属性进行控制,有权限的,相关元素可见或使能:没权限的,相关元素不可见或失能.这样用户可 ...
- 关于Excel中表格转Markdown格式的技巧
背景介绍 Excel文件转Markdown格式的Table是经常会遇到的场景. Visual Studio Code插件 - Excel to Markdown table Excel to Mark ...
- LCA总结
作为一名合格的 OIer ,一定要有自我总结的意识,一定要通过写博客的方式来验证自己的掌握程度 ----沃.茨基硕德 目录 作为一名合格的 OIer ,一定要有自我总结的意识,一定要通过写博客的方式来 ...
- iOS如何提升,首先得知自己的处境!(欢迎评论留言)
聊聊行情?为什么总有人在乎旁人的看法而忽略自己的初衷?虽然iOS开发市场说不上好但也绝不算坏,想没想过那些煽风点火说iOS不行的人在做什么?真的转行从头开始?错.大错特错!在劝退你的同时他们会默默的学 ...
- sonarqube 8.9版本配置项目访问权限
soanrqube设置项目权限 admin->项目->要设置的项目 进行项目权限配置 选择权限 权限配置(公开,私有)如果是公司项目建议选择私有 根据项目团队成员的角色需求,进行勾选配置 ...
- promise的基本使用
// 什么情况下适用promise? // 一般情况下是有异步请求操作时,使用promise对这个异步操作进行封装 // new ->构造函数(1.保存了一些状态信息 2.执行传入的函数) // ...
- 我用段子讲.NET之依赖注入其二
<我用段子讲.NET之依赖注入其二> "随着我们将业务代码抽象化成接口和实现两部分,这也使得对象生命周期的统一管理成为可能.这就引发了第二个问题,.NET Core中的依赖注入框 ...
- Cent OS下安装JDK11
自己云服务器以前装了个JDK1.7,最近发现出了jdk11,所以修改一下JDK版本: 我这里用的是Xshell和XFtp工具,下载地址:https://www.netsarang.com/downlo ...