JSP的简单回顾
什么是JSP
SJP:Java Server Pages Java服务器端页面。
JSP就是HTML+Java代码+JSP自身的东西。
JSP的由来
Servlet技术生成动态网页的时候很麻烦,需要通过response获得输出流,调用printf方法进行打印的。这种编程的方式很麻烦,而且美工也不容易出路,SUN公司为了简化动态网页的开发,推出的JSP。
JSP的运行原理
JSP在执行时,会被服务器先翻译为Serviet编译执行,JSP就是一个Servlet。
JSP脚本元素
<%! %>:JSP声明翻译成servlet成员部分的内容。声明变量,方法,内部类。
<%= %>:翻译为out.print(),在service方法内部。用于生成HTML页面源码。
<% %>:嵌入Java代码,翻译为service方法内部的代码块。声明变量,内部类。
JSP的注释(三种)
HTML的注释
写法:
< !–html的注释–>
存在的时机:
存在JSP的源码中,翻译成servlet后这个注释也存在,在生成HTML响应到页面的时候这个注释也会存在。
Java代码的注释
写法:
<%
//单行注释
/* 多行注释 /
/* 文档注释*/
%>
存在时机:
存在JSP的源码中,翻译成Servlet后Java代码的注释也会存在,但是生成HTML响应到页面中后,这种注释就消失了。
JSP自身注释
写法:
<%-- JSP的注释 --%>
存在的时机:
存在JSP的源码中,翻译Servet后注释就没有了。
注释:Java代码的注释,不要使用HTML的注释!!!
JSP的指令元素的概述
JSP的指令元素的作用
用于指示JSP执行的某些步骤
用于指示JSP表现特定行为
指令元素的语法
语法:
<%@ 指令名称 属性名称=属性的值 属性名称=属性的值 %>
JSP指令的分类
page指令:指示JSP的页面设置属性和行为。
include指令:指示JSP包含哪些其他页面。
taglib指令:指示JSP页面包含哪些标签库。
JSP指令
page指令
page指令的简介
写法:
<%@ page 属性名=属性值 %>
page指令用来定义JSP文件的全局属性。
这些属性可以单独使用,也可以几个或者多个同时使用。
在JSP页面中,只有import属性可以多次出现,其他的属性都只能出现一次。
page指令属性
language属性:声明使用脚本的语言。只能是Java。
extends属性:声明JSP编译成Servet的时候继承的类。默认值:HttpJspBase
session属性:标明JSP中是否可以直接使用session对象。默认值:true
buffer属性:标明JSP对客户端输出缓冲区大小。默认值:8kb
autoflush属性:如果缓冲区大小溢出,是否自动刷出。默认值:true
import属性:用于导入Java的包或者类。
contentType属性:标明JSP被浏览器解析和打开的时候采用的默认字符集。
pageEncoding属性:JSP文件及JSP翻译后的Servlet保存到硬盘上采用的默认字符集。
isErrorPage属性:处理JSP页面的异常。默认值:false。
isErrorPage=“true”
<%= exception.getMessage() %>显示异常信息
errorPage属性:处理JSP页面的异常。
errorPage=“出错之后需要跳转的页面”
isELIgnored属性:通知JSP是否忽略EL表达式。默认值:false。格式:${ }
Include指令
Include指令简介
写法:
<%@ include 属性名=属性值%>
作用:
在JSP页面中静态包含一个文件,同时由该JSP解析包含的文件内容。
Include指令属性
file属性:指示JSP页面包含页面路径。、
<@ include file=“目标路径” %>
Include指令原理(静态包含)
注意:
应该将被包含的页面的结构去掉。例如:< head>< /head>等这些结构。
在被包含的页面中定义的变量,在包含的页面中还可以使用。
taglib指令
taglib指令简介
写法:
<% @ taglib 属性名=属性值%>
作用:
用于在JSP页面中引入标签库。
taglib指令属性
uri属性:引入的标签库的路径。
prefix属性:引入标签库的别名。
JSP内置对象
JSP内置对象的概述
什么是JSP的内置对象
JSP的内置对象:指的是可以直接在JSP页面中使用的对象。
JSP的内置对象有哪些
JSP当中有9大内置对象:
request对象:从客户端向服务器发送的请求对象;
response对象:从服务器端向客户端做出的响应对象;
session对象:服务器为客户端所创建的会话对象;
application对象:代表应用。获得ServletContext对象;
out对象:向输出流写入内容的对象;
page对象:当前的JSP翻译成Servlet后的对象的引用;
pageContext对象:本JSP页面的上下文对象;
config对象:本JSP的ServletConfig对象;
exception对象:表示JSP页面运行时产生的异常对象;
JSP的内置对象具体类型
request HttpServletRequest
response HttpServletResponse
session HttpSession
application ServletContext
config ServletConfig
page Object
pageContext PageContext
out JspWriter
exception Throwable
pageContext对象作用
提供了page范围的数据存取的方法:
从page范围内存入数据:
从page范围内取数据:
从page范围内移除数据:
查找属性的方法:
通过pageContext对象获得其它8个内置对象:
获得其他8个内置对象的方法:
JSP的四个作用范围
JSP四个作用范围的概述
PageScope:页面范围
页面范围:指的是在当前页面内有效,出了这个页面,用pageContext保存的数据就无效了。
RequestScope:请求范围
请求范围:从客户端向服务器发送一次请求,服务器对这次请求做出了响应之后,用request保存的数据就无效了。
SessionScope:会话范围
会话范围:指的是每个浏览器向服务器发送请求(多次请求)。将该会话结束。
ApplicationScope:应用范围
应用范围:指的是在整个应用任意的地方都可以获取。
JSP的四个作用范围演示
<%--
Created by IntelliJ IDEA.
User: James
Date: 2021/1/16
Time: 13:16
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>JSP的四个作用范围</h1>
<h3>page范围(pageContext)</h3>
<%
//page范围(pageContext)
pageContext.setAttribute("name", "张三");
//request范围
request.setAttribute("name", "李四");
//session范围
session.setAttribute("name", "王五");
//application范围
application.setAttribute("name", "赵六");
%>
<h1>当前页面获取值</h1>
<%= pageContext.getAttribute("name") %>
<%= request.getAttribute("name") %>
<%= session.getAttribute("name") %>
<%= application.getAttribute("name") %>
<%
//转发到demo2.jsp
//request.getRequestDispatcher("/demo03/demo02.jsp").forward(request,response);
//跳转之后页面的地址栏不会变化,四个值只能取到后面三个,pageContext无法取到。因为pageContext只在当前页面有效。
%>
<a href="/demo04/demo03/demo02.jsp">跳转</a>
<!--
这次跳转相当于两次请求了,所以我们无法的到request和pageContext的数据。
-->
<!--
如果将浏览器关闭后本次会话结束,再重新打开那么就无法得到session的数据
-->
<!--
application对象在将服务器关闭之后,就不能访问到了
-->
</body>
</html>
pageContext对象四个域范围存取数据
findAttribute方法:
查找属性方法:先根据小范围的名称进行查找,如果找到了就返回,如果没有找到就去比其大一个域的范围进行查找。
<%--
Created by IntelliJ IDEA.
User: James
Date: 2021/1/16
Time: 13:16
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>JSP的四个作用范围</h1>
<h3>page范围(pageContext)</h3>
<%
//page范围(pageContext)
//pageContext.setAttribute("name", "张三");
//request范围
request.setAttribute("name", "李四");
pageContext.setAttribute("name", "李四",pageContext.REQUEST_SCOPE);
//session范围
session.setAttribute("name", "王五");
pageContext.setAttribute("name", "王五",pageContext.SESSION_SCOPE);
//application范围
//application.setAttribute("name", "赵六");
pageContext.setAttribute("name", "赵六",pageContext.APPLICATION_SCOPE);
%>
<h1>当前页面获取值</h1>
<%= pageContext.getAttribute("name") %>
<%= request.getAttribute("name") %>
<%= session.getAttribute("name") %>
<%= application.getAttribute("name") %>
<%--
和上面的写法效果相同
<%= pageContext.getAttribute("name",pageContext.REQUEST_SCOPE)%>
<%= pageContext.getAttribute("name",pageContext.SESSION_SCOPE)%>
<%= pageContext.getAttribute("name",pageContext.APPLICATION_SCOPE)%>
--%>
<%
//转发到demo2.jsp
//request.getRequestDispatcher("/demo03/demo02.jsp").forward(request,response);
//跳转之后页面的地址栏不会变化,四个值只能取到后面三个,pageContext无法取到。因为pageContext只在当前页面有效。
%>
<h1>findAttribute方法</h1>
<%= pageContext.findAttribute("name") %></>br>
<a href="/demo04/demo03/demo02.jsp">跳转</a>
<!--先从pageContext开始找,如果没有则找request,如果没有再则找session,如果没有再则找application,还没有返回空-->
<!--
这次跳转相当于两次请求了,所以我们无法的到request和pageContext的数据。
-->
<!--
如果将浏览器关闭后本次会话结束,再重新打开那么就无法得到session的数据
-->
<!--
application对象在将服务器关闭之后,就不能访问到了
-->
</body>
</html>
JSP的动作标签
JSP的动作标签的概述
什么是JSP的动作标签
JSP的动作标签用于在JSP页面中提供业务逻辑功能,避免在JSP页面中直接编写Java代码,造成JSP页面难以维护。
常用的动作标签
< jsp:forword/>:请求转发;
< jsp:include/>:包含(动态包含);
< jsp:param/>:传递参数;
演示JSP的动作标签
静态包含和动态包含的区别
动态包含的原理: