JSP的执行原理、JSP的内置对象、四大作用域解析、MVC模式理解>从零开始学JAVA系列

时间:2024-05-05 20:06:55
目录

JSP的执行原理、JSP的内置对象、四大作用域解析、MVC模式理解

JSP的执行原理

这里拿一个小例子来解析JSP是如何被访问到的

JSP的执行原理、JSP的内置对象、四大作用域解析、MVC模式理解>从零开始学JAVA系列

首先将该项目部署到tomcat,并且通过tomcat启动

通过URL访问该JSP文件:http://localhost:8080/untitled_war_exploded/

先说一下为什么能通过这个网址访问到index页面

1、部署的项目名为untitled_war_exploded

JSP的执行原理、JSP的内置对象、四大作用域解析、MVC模式理解>从零开始学JAVA系列

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

JSP的执行原理、JSP的内置对象、四大作用域解析、MVC模式理解>从零开始学JAVA系列

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

JSP的执行原理、JSP的内置对象、四大作用域解析、MVC模式理解>从零开始学JAVA系列

JSP的执行原理、JSP的内置对象、四大作用域解析、MVC模式理解>从零开始学JAVA系列

通过这个小例子可以看到tomcat服务器启动后是如何访问到的

JSP的执行过程

浏览器访问JSP的时候,会被tomcat的拦截器进行拦截,通过查看tomcat配置文件的web.xml中可以看到一个Servlet

浏览器在访问该jsp文件的时候,便是该Servlet进行的处理

JSP的执行原理、JSP的内置对象、四大作用域解析、MVC模式理解>从零开始学JAVA系列

JSP的执行原理、JSP的内置对象、四大作用域解析、MVC模式理解>从零开始学JAVA系列

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

JSP的执行原理、JSP的内置对象、四大作用域解析、MVC模式理解>从零开始学JAVA系列

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

JSP的执行原理、JSP的内置对象、四大作用域解析、MVC模式理解>从零开始学JAVA系列

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

JSP的执行原理、JSP的内置对象、四大作用域解析、MVC模式理解>从零开始学JAVA系列

JSP的执行原理、JSP的内置对象、四大作用域解析、MVC模式理解>从零开始学JAVA系列

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

JSP的执行原理、JSP的内置对象、四大作用域解析、MVC模式理解>从零开始学JAVA系列

JSP语法

小脚本、声明式、表达式三种语法的区别

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

声明式的例子

JSP的执行原理、JSP的内置对象、四大作用域解析、MVC模式理解>从零开始学JAVA系列

JSP的执行原理、JSP的内置对象、四大作用域解析、MVC模式理解>从零开始学JAVA系列

EL表达式及使用EL表达式获取四个作用域

<!-- JSP中的EL表达式的格式为: ${这里写表达式} -->

使用EL表达式获取四个作用域

${pageContext} // page作用域
${requestScope}// request作用域
${sessionScope}// session作用域
${applicationScope}// 服务器作用域,其实就是ServletContext对象

使用JSP中的JSTL

  • 引入jar包,放在WEB-INF/lib目录下

    JSP的执行原理、JSP的内置对象、四大作用域解析、MVC模式理解>从零开始学JAVA系列
  • 将jar包添加到库文件
  • 在JSP文件添加taglib引入JSTL,前缀为c,接下来就可以在jsp文件中使用c标签了

    <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

    JSP的执行原理、JSP的内置对象、四大作用域解析、MVC模式理解>从零开始学JAVA系列

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属性

    JSP的执行原理、JSP的内置对象、四大作用域解析、MVC模式理解>从零开始学JAVA系列
  • 在error页面中,需要配置isErrorPage为true

    JSP的执行原理、JSP的内置对象、四大作用域解析、MVC模式理解>从零开始学JAVA系列

四大作用域

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就是控制层的代表