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