1.1 JSP 简介
1.1.1 概述
JSP(全称JavaServer Pages)是由 Sun Microsystems 公司主导创建的一种动态网页技术标准。JSP 部署于网络服务器上,可以响应客户端发送的请求,并根据请求内容动态地生成 HTML、XML 或其他格式文档的 Web 网页,然后返回给请求者。JSP 技术以 Java 语言作为脚本语言,为用户的 HTTP 请求提供服务,并能与服务器上的其它 Java 程序共同处理复杂的业务需求。 JSP 将 Java 代码和特定变动内容嵌入到静态的页面中,实现以静态页面为模板,动态生成其中的部分内容。JSP 引入了被称为“ JSP 动作”的 XML 标签,用来调用内建功能。另外,可以创建 JSP 标签库,然后像使用标准 HTML 或 XML 标签一样使用它们。标签库能增强功能和服务器性能,而且不受跨平台问题的限制。JSP 文件在运行时会被其编译器转换成更原始的 Servlet 代码。JSP 编译器可以把 JSP 文件编译成用 Java 代码写的 Servlet,然后再由 Java 编译器来编译成能快速执行的二进制机器码,也可以直接编译成二进制码。
1.1.2 JSP 为什么会诞生
我们知道,浏览器可以解析 HTML 文档并渲染成页面,例如:
而我们在服务端想要响应一个 HTML 页面回去就需要再 Servlet 中写相当冗长的代码。通常情况是前端写好 HTML 静态页面后,Java 程序员在 Servlet 中逐句复制静态页面上的 HTML 语句到 Servlet 的中,根据情况将后端的数据与 HTML 片段拼接在一起,这个年代简直是程序员的黑暗年代,疯狂的输入着“无意义”的代码。
按这种方式,要想拼接数据并完整输出一个 HTML 页面,没个几百上千行 out.println() 是不可能的。而同时期的 PHP 就优秀多了,它们在 HTML 页面中嵌入相应语言来引入动态数据,避免了手动拷贝 HTML 片段输出的尴尬局面。一部分 Java 程序员一看,我靠,PHP 是世界上最好的语言,Web开发竟然如此之简单!老子再也不想 CV 了!投向了 PHP 的怀抱,因此 Java 流失了一部分程序员。SUN 为了稳住局面,于是,JSP 应运而生。
1.2 JSP 语法
一个特殊的页面,其中既可以指定定义 HTML 标签,又可以定义 Java 代码
1.2.1 声明区
代码语言:javascript复制// Java 中代表类中方法外,属于成员位置
<%! %>
1.2.2 表达式
代码语言:javascript复制// 这里输出到页面,在 service 方法中
<%= %>
1.2.3 代码块
代码语言:javascript复制// 在 service 方法中的代码片段
<% %>
1.2.4 注释
代码语言:javascript复制// 它是要发给浏览器的
<!-- 标记语言注释 -->
// 不发给浏览器
<%-- JSP 注释 --%>
// 不发给浏览器
java语言注释 // /**/ /** */
1.2.5 示例
代码语言:javascript复制<%--
Created by IntelliJ IDEA.
User: Demo_Null
Date: 2020/6/23
Time: 11:17
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>
<%
System.out.println("hello jsp");
int i = 5;
String contextPath = request.getContextPath();
out.print(contextPath);
%>
<%!
int i = 3;
%>
<br />
<%= i 1 "rn"%>
<br />
System.out.println("hello jsp");
<h1>hi~ jsp!</h1>
<% response.getWriter().write("response.....rn"); %>
</body>
</html>
注意
JSP 的实质是一个 Servlet,所以无法双击直接打开.当浏览器请求对应的 JSP 时,JSP 经过转义形成对应的 java 文件,java 文件经过编译链接形成 .class 文件。.class 文件会用来创建 servlet 对象这个对象就可以提供动态 html 响应。
1.3 JSP 指令
JSP 指令用来设置整个 JSP 页面相关的属性,如网页的编码方式和脚本语言。语法格式:<%@ directive attribute="value" %>
1.3.1 page 指令
用来导包 和做一些页面属性的设置一个JSP页面可以包含多个page指令。
相关属性
属性 | 描述 |
---|---|
buffer | 指定 out 对象使用缓冲区的大小 |
autoFlush | 控制 out 对象的 缓存区 |
contentType | 指定当前 JSP 页面的 MIME 类型和字符编码 |
errorPage | 指定当 JSP 页面发生异常时需要转向的错误处理页面 |
isErrorPage | 指定当前页面是否可以作为另一个 JSP 页面的错误处理页面 |
extends | 指定 servlet 从哪一个类继承 |
import | 导入要使用的 Java 类 |
info | 定义 JSP 页面的描述信息 |
isThreadSafe | 指定对 JSP 页面的访问是否为线程安全 |
language | 定义 JSP 页面所用的脚本语言,默认是 Java |
session | 指定 JSP 页面是否使用 session |
isELIgnored | 指定是否执行 EL 表达式 |
isScriptingEnabled | 确定脚本元素能否被使用 |
示例
代码语言:javascript复制<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<p>
今天的日期是: <%= (new java.util.Date()).toLocaleString()%>
</p>
1.3.2 taglib 指令
JSP API 允许用户自定义标签,一个自定义标签库就是自定义标签的集合。Taglib 指令引入一个自定义标签集合的定义,包括库路径、自定义标签。语法格式:<%@ taglib uri="uri" prefix="prefixOfTag" %>
相关属性
属性 | 描述 |
---|---|
prefix | 前缀 用来指定标签库的代号 短名 |
uri | 统一资源标识 用来指定标签库的位置 |
1.3.3 include 指令
JSP 可以通过 include 指令来包含其他文件。被包含的文件可以是 JSP 文件、HTML 文件或文本文件。包含的文件就好像是该 JSP 文件的一部分,会被同时编译执行。语法格式:<%@ include file="文件相对 url 地址" %>
相关属性
属性 | 描述 |
---|---|
file | 一个相对的 URL 地址。如果您没有给文件关联一个路径,JSP 编译器默认在当前路径下寻找 |
1.4 JSP 动作
与 JSP 指令元素不同的是,JSP 动作元素在请求处理阶段起作用。JSP 动作元素是用 XML 语法写成的。利用 JSP 动作可以动态地插入文件、重用 JavaBean 组件、把用户重定向到另外的页面、为 Java 插件生成 HTML 代码。动作元素只有一种语法,它符合 XML 标准:<jsp:action_name attribute="value" />
。动作元素基本上都是预定义的函数,JSP规范定义了一系列的标准动作,它用JSP作为前缀,可用的标准动作元素如下:
语法 | 描述 |
---|---|
jsp:include | 在页面被请求的时候引入一个文件 |
jsp:useBean | 寻找或者实例化一个 JavaBean |
jsp:setProperty | 设置 JavaBean 的属性 |
jsp:getProperty | 输出某个 JavaBean 的属性 |
jsp:forward | 把请求转到一个新的页面 |
jsp:plugin | 根据浏览器类型为 Java 插件生成 OBJECT 或 EMBED 标记 |
jsp:element | 定义动态 XML 元素 |
jsp:attribute | 设置动态定义的 XML 元素属性 |
jsp:body | 设置动态定义的 XML 元素内容 |
jsp:text | 在 JSP 页面和文档中使用写入文本的模板 |
所有的动作要素都有两个属性:id 属性和 scope 属性。 ♞ id 属性:id 属性是动作元素的唯一标识,可以在 JSP 页面中引用。动作元素创建的 id 值可以通过 PageContext 来调用。 ♞ scope 属性:该属性用于识别动作元素的生命周期。 id 属性和 scope 属性有直接关系,scope 属性定义了相关联 id 对象的寿命。 scope 属性有四个可能的值: page, request,session, application。
1.4.1 <jsp:include>
<jsp:include>动作元素用来包含静态和动态的文件。该动作把指定文件插入正在生成的页面。语法格式:<jsp:include page="相对 URL 地址" flush="true" />
相关属性
属性 | 描述 |
---|---|
page | 包含在页面中的相对URL地址 |
flush | 布尔属性,定义在包含资源前是否刷新缓存区 |
示例
代码语言:javascript复制<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>示例</title>
</head>
<body>
<h2>include</h2>
<jsp:include page="date.jsp" flush="true" />
</body>
</html>
1.4.2 <jsp:forward>
<jsp:forward>动作把请求转到另外的页面。语法格式如下所示:<jsp:forward page="相对 URL 地址" />
。<jsp:forward>标记只有一个属性 page,page 属性包含的是一个相对 URL。page 的值既可以直接给出,也可以在请求的时候动态计算,可以是一个 JSP 页面或者一个 Java Servlet。
示例
代码语言:javascript复制<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>示例</title>
</head>
<body>
<h2>forward</h2>
<jsp:forward page="date.jsp" />
</body>
</html>
1.5 JSP 九大内置对象
JSP 隐式对象是 JSP 容器为每个页面提供的 Java 对象,开发者可以直接使用它们而不用显式声明。JSP 隐式对象也被称为预定义变量。JSP 所支持的九大隐式对象:
对象 | 描述 |
---|---|
request | HttpServletRequest 接口的实例 |
response | HttpServletResponse 接口的实例 |
out | JspWriter 类的实例,用于把结果输出至网页上 |
session | HttpSession 类的实例 |
application | ServletContext 类的实例,与应用上下文有关 |
config | ServletConfig 的实例 |
pageContext | PageContext 类的实例,提供对 JSP 页面所有对象以及命名空间的访问 |
page | 类似于 Java 类中的 this 关键字,代表 JSP 页面本身 |
Exception | Exception 类的对象,代表发生错误的 JSP 页面中对应的异常对象 |
1.5.1 request 对象
request 对象是 javax.servlet.http.HttpServletRequest 类的实例。每当客户端请求一个 JSP 页面时,JSP 引擎就会制造一个新的 request 对象来代表这个请求。request 对象提供了一系列方法来获取 HTTP 头信息,cookies,HTTP方法等等。
1.5.2 response 对象
response 对象是 javax.servlet.http.HttpServletResponse 类的实例。当服务器创建 request 对象时会同时创建用于响应这个客户端的 response 对象。response 对象也定义了处理 HTTP 头模块的接口。通过这个对象,开发者们可以添加新的 cookies,时间戳,HTTP 状态码等等。
1.5.3 out 对象
out 对象是 javax.servlet.jsp.JspWriter 类的实例,用来在 response 对象中写入内容。最初的 JspWriter 类对象根据页面是否有缓存来进行不同的实例化操作。可以在 page 指令中使用 buffered=‘false’ 属性来轻松关闭缓存。JspWriter 类包含了大部分 java.io.PrintWriter 类中的方法。不过,JspWriter 新增了一些专为处理缓存而设计的方法。还有就是,JspWriter 类会抛出 IOExceptions 异常,而 PrintWriter 不会。常用方法有:
♞ out.print(dataType dt)
:输出Type类型的值
♞ out.println(dataType dt)
:输出Type类型的值然后换行
♞ out.flush()
:刷新输出流
1.5.4 session 对象
session 对象是 javax.servlet.http.HttpSession 类的实例。和 Java Servlets 中的 session 对象有一样的行为。session 对象用来跟踪在各个客户端请求间的会话。
1.5.5 application 对象
application 对象直接包装了 servlet 的 ServletContext 类的对象,是 javax.servlet.ServletContext 类的实例。这个对象在 JSP 页面的整个生命周期中都代表着这个 JSP 页面。这个对象在 JSP 页面初始化时被创建,随着 jspDestroy() 方法的调用而被移除。通过向 application 中添加属性,则所有组成 web 应用的 JSP 文件都能访问到这些属性。
1.5.6 config 对象
config 对象是 javax.servlet.ServletConfig 类的实例,直接包装了servlet 的 ServletConfig 类的对象。这个对象允许开发者访问 Servlet 或者 JSP 引擎的初始化参数,比如文件路径等。使用方法:config.getServletName();
1.5.7 pageContext 对象
pageContext 对象是 javax.servlet.jsp.PageContext 类的实例,用来代表整个 JSP 页面。这个对象主要用来访问页面信息,同时过滤掉大部分实现细节。这个对象存储了 request 对象和 response 对象的引用。application 对象,config 对象,session 对象,out 对象可以通过访问这个对象的属性来导出。pageContext 对象也包含了传给 JSP 页面的指令信息,包括缓存信息,ErrorPage URL,页面 scope 等。
1.5.8 page 对象
这个对象就是页面实例的引用。它可以被看做是整个 JSP 页面的代表。page 对象就是 this 对象的同义词。
1.5.9 exception 对象
exception 对象包装了从先前页面中抛出的异常信息。它通常被用来产生对出错条件的适当响应。