3.11 JSP
3.9.1 简介
JSP是Java Servlet Pages,java服务器端的页面,类似于html,用于动态web页面的显示和渲染。它相对于html来说,增加了嵌入java代码的功能,直接为用户提供了动态数据的获取,实现Java web应用程序的用户界面部分。它通过结合HTML代码、XHTML代码、XML元素以及嵌入JSP操作和命令来编写JSP。
JSP文件格式:***.jsp,jsp页面的访问流程:
- 浏览器发送一个 HTTP 请求给服务器。
- Web 服务器识别出这是一个对 JSP 网页的请求,并且将该请求传递给 JSP 引擎。通过使用 URL或者 .jsp 文件来完成。
- JSP 引擎从磁盘中载入 JSP 文件,然后将它们转化为 Servlet。
- JSP 引擎将 Servlet 编译成可执行的java类,并且将原始请求传递给 Servlet 引擎。
- Web 服务器调用 Servlet 引擎,然后载入并执行 Servlet 类。在执行过程中,Servlet 产生 HTML 格式的输出并将其内嵌于 HTTP response 中上交给 Web 服务器。
- Web 服务器以静态 HTML 网页的形式将 HTTP response 返回到您的浏览器中。
- 最终,Web 浏览器处理 HTTP response 中动态产生的HTML网页,就好像在处理静态网页一样。
jsp页面在转换成java类时,其中<%%>中的java代码会正常的转换,但是html标签等代码,会使用out.print(""),来输出。
3.9.2 生命周期
JSP页面从创建到销毁的几个阶段:
-
编译阶段:servlet容器编译servlet源文件,生成servlet类
- 解析JSP文件。
- 将JSP文件转为servlet。
- 编译servlet。
-
初始化阶段:加载与JSP对应的servlet类,创建其实例,并调用它的初始化方法
-
容器载入JSP文件后,它会在为请求提供任何服务前调用jspInit()方法。
public void jspInit(){ // 初始化代码 }
-
-
执行阶段:调用与JSP对应的servlet实例的服务方法
-
描述了JSP生命周期中一切与请求相关的交互行为,直到被销毁。
-
当JSP网页完成初始化后,JSP引擎将会调用_jspService()方法。
void _jspService(HttpServletRequest request,HttpServletResponse response){ // 服务端处理代码 }
-
-
销毁阶段:调用与JSP对应的servlet实例的销毁方法,然后销毁servlet实例
-
描述了当一个JSP网页从容器中被移除时所发生的一切。
public void jspDestroy(){ // 清理代码 }
-
3.9.3 jsp的使用
1、 基础语法
jsp页面中编写java代码的语法格式:
<%--注释:在jsp页面使用java代码的格式 --%>
<%
java代码,jsp中支持所有的java语法
%>
<%--jsp的java和html可以配合使用--%>
<% for(int i=0; i<10; i++){ %>
<h1>这里会循环10次</h1>
<% } %>
jsp表达式:一个JSP表达式中包含的脚本语言表达式,先被转化成String,然后插入到表达式出现的地方。由于表达式的值会被转化成String,所以您可以在一个文本行中使用表达式而不用去管它是否是HTML标签。表达式元素中可以包含任何符合Java语言规范的表达式,但是不能使用分号来结束表达式。
<%= new java.util.Date()%>
jsp注释:
<%-- 注释 --%>
jsp声明
一个声明语句可以声明一个或多个变量、方法,供后面的Java代码使用。在JSP文件中,您必须先声明这些变量和方法然后才能使用它们。
<%!
java代码
//声明中的代码会被编译到jsp生成的java类中,而其他地方的代码会生成到jspService方法中
%>
jsp页面的大致结构
<%--jsp页面的大致框架,文件头解决编码等问题--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<%String path = request.getContextPath();%> <%--jsp代码,获得项目路径--%>
<html>
<head>
<title>Title</title>
</head>
<body>
</body>
</html>
2、指令
-
<%@ page … %> 定义网页依赖属性,比如脚本语言、error页面、缓存需求等等
属性 描述 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 确定脚本元素能否被使用 <%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
-
<%@ include … %> 包含文件
<%@ include file="文件相对 url 地址" %>
-
<%@ taglib … %> 引入标签库的定义
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
3.9.4 动作元素
JSP动作元素在请求处理阶段起作用。JSP动作元素是用XML语法写成的。
-
jsp:include 在页面被请求的时候引入一个文件。
<jsp:include page="相对 URL 地址" flush="true" />
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8fK53Et6-1650208562433)(C:\Users\羽\AppData\Roaming\Typora\typora-user-images\image-20210401145640284.png)]
属性 描述 page 包含在页面中的相对URL地址。 flush 布尔属性,定义在包含资源前是否刷新缓存区。 -
jsp:useBean 寻找或者实例化一个JavaBean。
-
jsp:setProperty 设置JavaBean的属性。
-
jsp:text 在JSP页面和文档中使用写入文本的模板
-
jsp:body 设置动态定义的XML元素内容。
-
jsp:attribute 设置动态定义的XML元素属性。
-
jsp:element 定义动态XML元素
-
jsp:plugin 根据浏览器类型为Java插件生成OBJECT或EMBED标记
-
jsp:forward 把请求转到一个新的页面。
3.9.5 内置对象
JSP隐式对象是JSP容器为每个页面提供的Java对象,开发者可以直接使用它们而不用显式声明。JSP隐式对象也被称为预定义变量。和serlvet对象相同。
JSP所支持的九大隐式对象:
对象 | 描述 |
---|---|
request | HttpServletRequest 接口的实例,保存的数据在一次请求中有效,请求转发会携带 |
response | HttpServletResponse接口的实例 |
out | JspWriter类的实例,用于把结果输出至网页上 |
session | HttpSession类的实例,保存的数据在一次会话中有效,打开浏览器到关闭浏览器 |
application | ServletContext类的实例,与应用上下文有关,数据在服务器有效,打开服务到关闭服务器,所有用户可共享 |
config | ServletConfig类的实例 |
pageContext | PageContext类的实例,提供对JSP页面所有对象以及命名空间的访问,保存的数据只在一个页面中有效 |
page | 类似于Java类中的this关键字 |
Exception | Exception类的对象,代表发生错误的JSP页面中对应的异常对象 |
作用域:page→request→session→application
3.9.6 Date类
java.util.Date,主要封装了当前日期和时间。
//两种构造函数
//使用当前日期和时间来初始化对象。
public Date(){}
//2、含参数,表示从1970年1月1日凌晨至所要表示时间的毫秒数。
public Date(){long millisec}
序号 | 方法 & 描述** |
---|---|
1 | boolean after(Date date) 如果比给定的日期晚,则返回true,否则返回false |
2 | boolean before(Date date) 如果比给定的日期早,则返回true,否则返回false |
3 | Object clone( ) 获取当前对象的一个副本 |
4 | int compareTo(Date date) 如果与给定日期相等,则返回0,如果比给定日期早,则返回一个负数,如果比给定日期晚,则返回一个正数 |
5 | **int compareTo(Object obj) ** 与 compareTo(Date) 方法相同,如果 obj 不是Date类或其子类的对象,抛出ClassCastException异常 |
6 | boolean equals(Object date) 如果与给定日期相同,则返回true,否则返回false |
7 | **long getTime( ) ** 返回从1970年1月1日凌晨至此对象所表示时间的毫秒数 |
8 | int hashCode( ) 返回此对象的哈希码 |
9 | void setTime(long time) 使用给定参数设置时间和日期,参数time表示从1970年1月1日凌晨至time所经过的毫秒数 |
10 | String toString( ) 将此对象转换为字符串并返回这个字符串 |
Date类返回的时间为毫秒数,想要正常使用需要使用SimpleDateFormat来对日期进行和格式化处理:
<%
Date nowTime = new Date( );
new SimpleDateFormat ("yyyy-MM-dd HH:mm:ss").format(nowTime);
%>
SimpleDateFormat的格式码:
字符 | 描述 |
---|---|
y | 4位数年份 |
M | 月 |
d | 日 |
h | 12小时制, A.M./P.M. (1~12) |
H | 24小时制 |
m | 分钟 |
s | 秒 |
S | 毫秒 |
E | 星期 |
D | 一年中的某天 |
F | 一个月中某星期的某天 |
w | 一年中的某星期 |
W | 一个月中的某星期 |
a | A.M./P.M. 标记 |
k | 一天中的某个小时 (1~24) |
K | 一天中的某个小时,A.M./P.M. (0~11) |
z | 时区 |
’ | 文本分隔 |
" | 单引号 |
3.9.7 JSTL和EL
1、JSTL
JSTL是jsp的一个标准标签库,封装了jsp应用的通用核心功能。它支持迭代、条件判断、XML文档操作、国际化标签、SQL标签等,另外还提供了一个框架集成JSTL的自定义标签。
-
JSTL的安装
依赖
<!--JSTL的Maven依赖--> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>taglibs</groupId> <artifactId>standard</artifactId> <version>1.1.2</version> </dependency>
-
核心标签库
- 引用核心标签库
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
1、<c:out value="" > 标签 与<%= %>的作用类似 属性:value 要输出的内容,必须存在,无默认值 default 输出的默认值 escapeXml 是否忽略XML特殊字符,默认值 true 2、<c:set> 标签 用于设置变量值和对象属性。 属性:value="" 要存储的值 target="" 要修改的属性所属的对象 property 要修改的属性(如果指定了target属性,那么property属性也需要被指定。) var 存储信息的变量 scope var属性的作用域,默认为page(当前页) 3、<c:remove var="要移除的变量名称" scope="变量所属的作用域"> 标签用于移除一个变量,可以指定这个变量的作用域,若未指定,则默认为变量第一次出现的作用域。不是特别有用 4、<c:catch var="用来储存错误信息的变量">...</c:catch> 标签处理产生错误的异常状况,将错误信息储存起来。 5、<c:if test="条件" var="用于存储条件结果的变量" scope="var属性的作用域">...</c:if> 标签判断表达式的值,如果表达式的值为 true 则执行其主体内容。 6、<c:forEach items="要被循环的信息" begin="从第几个元素开始" end="到第几个结束" var="当前条目的变量名称" varStatus="循环状态的变量名称"> 循环内容 </c:forEach> 标签用于迭代循环,forEach循环 7、<c:choose> <c:when test="<boolean>"> ... </c:when> <c:when test="<boolean>"> ... </c:when> ... <c:otherwise> ... </c:otherwise> </c:choose> 标签与Java switch语句的功能一样,用于在众多选项中做出选择。 8、<c:url var="url" scope="本地网络应用程序的名称" value="URL的变量名" context="var作用域"/> 标签将URL格式化为一个字符串,然后存储在一个变量中。var属性用于存储格式化后的URL。 9、<c:param name="URL中要设置的参数的名称" value="参数的值"/> 签用于在<c:url>标签中指定参数 9、<c:redirect url="目标URL" context="地网络应用程序的名称"/> 标签通过自动重写URL来将浏览器重定向至一个新的URL
-
格式化标签
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
1、 标签用于格式化数字,百分比,货币。 <fmt:formatNumber value="要显示的数字" type="类型(NUMBER,CURRENCY,或 PERCENT类型)" pattern="格式化模式" 0 代表一位数字 E 使用指数格式 # 代表一位数字,若没有则显示 0,前导 0 和追尾 0 不显示。 . 小数点 , 数字分组分隔符 ; 分隔格式 - 使用默认负数前缀 % 百分数 ? 千分数 ¤ 货币符号,使用实际的货币符号代替 X 指定可以作为前缀或后缀的字符 currencyCode="货币码(type='currency'时使用)" currencySymbol="货币符号 (当 type='currency'时使用)" groupingUsed="是否对数字分组 (TRUE 或 FALSE)" maxIntegerDigits="整型数最大的位数" minIntegerDigits="整型数最小的位数" maxFractionDigits="小数点后最大的位数" minFractionDigits="小数点后最小的位数" var="存储格式化数字的变量" scope="var属性的作用域"/> 2、用于使用不同的方式格式化日期。 <fmt:formatDate value="要显示的日期" type="DATE, TIME, 或 BOTH" dateStyle="FULL, LONG, MEDIUM, SHORT, 或 DEFAULT" timeStyle="FULL, LONG, MEDIUM, SHORT, 或 DEFAULT" pattern="自定义格式模式" timeZone="时区" var="存储格式化日期的变量名" scope="存储格式化日志变量的范围"/> 3、<fmt:timeZone value=""/> 指定时区
-
JSTL函数
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
1、确定一个字符串是否包含指定的子串 不忽略大小写:fn:contains() <c:if test="${fn:contains(<原始字符串>, <要查找的子字符串>)}"> ... </c:if> 忽略大小写:fn:containsIgnoreCase() 2、fn:endsWith() 函数用于确定一个字符串是否以指定后缀结尾。 <c:if test="${fn:endsWith(<原始字符串>, <要查找的子字符串>)}"> ... </c:if> 3、fn:indexOf() 函数返回一个字符串中指定子串的位置。 ${fn:indexOf(<原始字符串>,<子字符串>)} 4、fn:join() 函数将一个数组中的所有元素使用指定的分隔符来连接成一个字符串。 ${fn:join([数组], <分隔符>)} 5、fn:length() 函数返回字符串长度或集合中元素的数量。 ${fn:length(""} 6、fn:replace() 函数将字符串中所有指定的子串用另外的字符串替换。 ${fn:replace(<原始字符串>, <被替换的字符串>, <要替换的字符串>)} 7、fn:split() 函数将一个字符串用指定的分隔符分裂为一个子串数组。 ${fn:split(<待分隔的字符串>, <分隔符>)} 8、fn:startsWith() 函数用于确定一个字符串是否以指定的前缀开始。 <c:if test="${fn:startsWith(<原始字符串>, <搜索的前缀>)}"> ... </c:if> 9、fn:substring() 函数返回字符串中指定开始和结束索引的子串。 ${fn:substring(<string>, <beginIndex>, <endIndex>)} 10、fn:trim()函数将字符串两端的空白符移除。 ${fn:trim(<string>)} 11、转换大小写 大写→小写:${fn.toLowerCase(<string>)} 小写→大写:${fn:toUpperCase(<string>)}
2、EL表达式
EL表达式主要配合JSTL一起使用:主要用于获取数据、执行计算、获取web开发中的常用对象。
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<%--isELIgnored="false|true" trueEL表达式就会被忽略,false将会计算EL表达式。--%>
一个简单的表达式语法如下:
${表达式}
操作符 | 描述 |
---|---|
. | 访问一个属性或者一个映射条目 |
[] | 访问一个数组或者链表的元素 |
( ) | 组织一个子表达式以改变优先级 |
+ | 加 |
- | 减或负 |
* | 乘 |
/ or div | 除 |
% or mod | 取模 |
== or eq | 测试是否相等 |
!= or ne | 测试是否不等 |
< or lt | 测试是否小于 |
> or gt | 测试是否大于 |
<= or le | 测试是否小于等于 |
>= or ge | 测试是否大于等于 |
&& or and | 测试逻辑与 |
|| or or | 测试逻辑或 |
! or not | 测试取反 |
empty | 测试是否空值 |
JSP EL允许在表达式中使用JSTL函数。这些函数必须被定义在自定义标签库中。函数的使用语法如下:
${fn:length("Get my length")} 返回字符串长度
JSP EL支持下表列出的隐含对象:
隐含对象 | 描述 |
---|---|
pageScope | page 作用域 |
requestScope | request 作用域 |
sessionScope | session 作用域 |
applicationScope | application 作用域 |
param | Request 对象的参数,字符串 |
paramValues | Request对象的参数,字符串集合 |
header | HTTP 信息头,字符串 |
headerValues | HTTP 信息头,字符串集合 |
initParam | 上下文初始化参数 |
cookie | Cookie值 |
pageContext | 当前页面的pageContext |