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 ...
随机推荐
- Spring Cloud专题之三:Hystrix
在微服务架构中,我们将系统拆分成很多个服务单元,各单位的应用间通过服务注册与订阅的方式相互依赖.由于每个单元都在不同的进程中运行,依赖通过远程调用的方式执行,这样就有可能因为网络原因或是依赖服务自身问 ...
- android动画系列
Android 属性动画(Property Animation) 完全解析 (上 动画系列 - 传统View动画与Property动画基础及比较 [Android 基础]Animation 动画介绍和 ...
- npm ERR! Unexpected end of JSON input while parsing near '...'解决方法
npm install时出现npm err! Unexpected end of JSON input while parsing near'...'错误 输入 npm cache clean -- ...
- hdu5438 拓扑排序+DFS
解析 对一个有向无环图(Directed Acyclic Graph,简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若<u,v> ∈E(G),则 ...
- Redis i/o timeout
1.背景 公司项目使用国外ucloud云,发现公司业务服务器时常连接redis服务,发生i/o timeout的问题.研发以及服务器侧查看没有异常,反馈给ucolud解决问题.所以这里做一个记录. 2 ...
- flutter中ListView的详细讲解
1.ListView的简单介绍 ListView是最常用的可以滚动组件之一, 它可以沿一个方向进行线性排列所有的子组件. 下面是ListView的属性值介绍: scrollDirection:列表的滚 ...
- 3、mysql的多实例配置(3)
8.mysql多实例故障排错:
- css实现文字过度变色效果
html: <div class="news text-center"> <a href="#"> <span>新</ ...
- APDU:APDU常用指令
APDU= ApplicationProtocol data unit, 是智能卡与智能卡读卡器之间传送的信息单元, (给智能卡发送的命令)指令(ISO 7816-4规范有定义) CLA INS P1 ...
- redis集群环境配置
为什么需要集群 redis是一个开源的 key->value 高速存储系统,但是由于redis单线程运行,在系统中,只能利用单核的性能 当redis的调用越来越频繁时,可能会出现redis过于繁 ...