(1)什么Expression Language 表达式语言
前言
回顾一下学习并对JavaWeb的学习过程中对笔记总结进行记录,同时进行思考过程中的理解加入其中,方便自己进行后续的学习和回顾
1. JSP的指令
JSP指令用来设置整个JSP页面相关的属性,如网页的编码方式和脚本语言。
语法格式如下:
<%@ directive attribute="value" %>
directive:指令名称 attribute 属性名 value:属性值
指令名称 | 描述 |
---|---|
page | 定义网页依赖属性,比如脚本语言、error页面、缓存需求等等 |
include | 包含其他文件 |
taglib | 引入标签库的定义 |
(1)Page指令
Page指令为容器提供当前页面的使用说明一个JSP页面可以包含多个page指令
Page指令的语法格式:
这个使用指向错误页面,导入页面以及编码方式都是比较常用的属性
<%@ page attribute="value" %>
属性名 | 属性值 | 描述 |
---|---|---|
language | java | 解释该JSP文件时采用的语言,一般为java语言,默认为java |
extends | 任何类的全名 | 编译该JSP文件时继承哪个类,JSP为Servlet,因此当指明继承普通类时需要实现Servlet的init、destroy等方法 |
import | 任何包名、类名 | 引入该JSP中用到的类、包等,import是唯一可以声明多次的page指令属性,一个import可以引用uogelei,中间用英文逗号隔开<%@ page import=包名.类名,包名.类名%> |
session | true、false | 该JSP内是否内置Session对象,如果为true,则内置Session对象,可直接使用,否则反之,默认为true |
autoFlush | true,false | 是否运行缓存,如果为true,则使用out.println()等方法输出的字符串并不是立刻到达客户端服务器的,而是暂时存到缓存里,缓存满了或者程序行完毕或者执行out.flush()操作时才到客户端,默认为true。 |
buffer | none或者数字KB | 指定缓存大小,当autoFlush设为true时有效,例如<%@ page buffer=10kb%> |
isThreadSafe | true,false | 是否线程安全,如果为true,则运行多个线程同时运行该jsp程序,否则只运行一个线程,其余线程等待,默认为false |
isErrorPage | true,false | 指定该页面是否为错误显示页面,如果为true,则该JSP内置有一个Exception对象exception,可直接使用,否则没有,默认为false |
errorPage | 某个JSP页面的相对路径 | 指明一个错误页面,如果该JSP程序抛出一个未捕捉的异常,则转到errorPage指定的页面,errorPage指定的页面通常isErrorPage属性为true,且内置的exception对象为未捕捉的异常 |
contentType | 有效的文档类型 | 客户端浏览器根据该属性判断文档类型,例如 HTML格式为text/html、纯文本格式为text/plain、JPG图像为image/jpeg、GIF图像为image/gifWORD文档为application/msword,该属性常跟着charset设置编码一起,作用是通知服务器和浏览器都使用同一个码表 |
pageEncoding | UTF-8,ISO-8859-1等 |
(2) Include指令
JSP可以通过include指令来包含其他文件。被包含的文件可以是JSP文件、HTML文件或文本文件。包含的文件就好像是该JSP文件的一部分,会被同时编译执行。
Include指令的语法格式如下:
<%@ include file="文件相对 url 地址" %>
include 指令中的文件名实际上是一个相对的 URL 地址。
如果您没有给文件关联一个路径,JSP编译器默认在当前路径下寻找。
(3)Taglib指令
总之这个我不多说,反正用起来很吊,也非常好用
JSP API允许用户自定义标签,一个自定义标签库就是自定义标签的集合。
Taglib指令引入一个自定义标签集合的定义,包括库路径、自定义标签。
<%@ taglib uri="uri" prefix="" %>
uri属性确定标签库的位置,prefix属性指定标签库的前缀(可自定义)。
2. JSP出现的状态码
状态码 | 消息 | 描述 |
---|---|---|
100 | Continue | 只有一部分请求被服务器接收,但只要没被服务器拒绝,客户端就会延续这个请求 |
101 | Switching Protocols | 服务器交换机协议 |
200 | OK | 请求被确认 |
201 | Created | 请求时完整的,新的资源被创建 |
202 | Accepted | 请求被接受,但未处理完 |
300 | Multiple Choices | 一个超链接表,用户可以选择一个超链接并访问,最大支持5个超链接 |
301 | Moved Permanently | 被请求的页面已经移动到了新的URL下 |
302 | Found | 被请求的页面暂时性地移动到了新的URL下 |
303 | See Other | 被请求的页面可以在一个不同的URL下找到 |
400 | Bad Request | 服务器无法识别请求 |
403 | Forbidden | 禁止访问所请求的页面 |
404 | Not Found | 服务器无法找到所请求的页面 |
405 | Method Not Allowed | 请求中所指定的方法不被允许 |
500 | Internal Server Error | 请求不完整,服务器遇见了出乎意料的状况 |
501 | Not Implemented | 请求不完整,服务器不提供所需要的功能 |
502 | Bad Gateway | 请求不完整,服务器从上游服务器接受了一个无效的响应 |
503 | Service Unavailable | 请求不完整,服务器暂时重启或关闭 |
504 | Gateway Timeout | 网关超时 |
505 | HTTP Version Not Supported | 服务器不支持所指定的HTTP版本 |
3. EL表达式
(1)什么Expression Language 表达式语言
最初定义于JSTL1.0部分
在JSP2.0中,EL从JSTL中剥离出来,放置在JSP规范中,称为JSP2.0规范的一部分
在JSP中使用EL表达式,可以简化对象和变量的访问是EL表达式
(2)EL表达式语法
代入这个表达式后,对于页面之间的数据传输,以及代码的编写都有了很多简化,更加方便和节省时间
语法格式:${需要展示信息的名字}
注意:
当表达式没有指定变量或者对象的范围时,那么容器会依次从pageContext—>request—>session—>application中查找该变量或对象,我们可以通过隐含对象获得指定作用域的值:
pageScope对象,用于获取当前页面的属性值
requestScope对象,用于获取请求范围的属性值
sessionScope对象,用于获取会话范围的属性值
applicationScope对象,用于获取程序范围的属性值
语法:
${requestScope.key}
(3)EL中基础操作符
术语 | 定义 |
---|---|
算术型 | + 、-、 * /(div) 除 、 %(mod) 余数 |
逻辑型 | and、&&、or、||、!、not |
关系型 | ==、eq、!=、ne、、gt、<=、le、>=、ge。可以与其他值进行比较,或与布尔型、字符串型、整型或浮点型文字进行比较。 |
Empty | Empty操作符是一个前缀操作符用于判断一个值是否为null或者为empty如String str = “”; ${empty str} 返回值为true; |
条件型 | A ?B :C。根据 A 赋值的结果来赋值 B 或 C。 |
示例:
单个变量:${a+10}<br>
单个变量:${s}<br>
单个对象:${key.属性名}
//对象类型
Users u=new Users();
u.setName("王老五");
u.setPass("abc");
pageContext.setAttribute("u1",u);
user.name=${u1.name}
user.pass=${u1.pass}
// list集合对象:
List list=new ArrayList();
list.add("刘能");
list.add(30);
list.add(u);
pageContext.setAttribute("list2",list);
list1=${list2[0]}<br/>
list2=${list2[1]}<br/>
list3=${list2[2].pass}<br/>
// map集合:
k1=${map1.k1}<br>
k2=${map1.k2.username}--- ${map1.k2.password}
判断变量是否有值或是否存在:${empty key值}
List list2=new ArrayList();
list2.add("aa");
request.setAttribute("list222",list2);
判断list中是否有数据:${empty list222}
4. JSTL
(1) 什么是JSTL
JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能。
JSTL支持通用的、结构化的任务,比如迭代,条件判断,XML文档操作,国际化标签,SQL标签。 除了这些,它还提供了一个框架来使用集成JSTL的自定义标签。
根据JSTL标签所提供的功能,可以将其分为5个类别。核心标签 格式化标签 sql标签 xml标签 jstl函数(后面详细解释
(2) JSTL的作用和语法格式
作用:简化jsp页面编写代码
语法格式:
-
下载 jakarta-taglibs-standard-1.1.2.zip 包并解压,将 jakarta-taglibs-standard-1.1.2/lib/ 下的两个 jar 文件:standard.jar 和 jstl.jar 文件拷贝到 /WEB-INF/lib/ 下。
-
在JSP页面中引入<%@ taglib prefix=”页面使用的名称” uri=”功能范围的路径”%>
功能范围 | Uri | 前缀 |
---|---|---|
core | Oracle Java Technologies | Oracle | c |
i18n | Oracle Java Technologies | Oracle | fmt |
sql | Oracle Java Technologies | Oracle | sql |
xml | Oracle Java Technologies | Oracle | x |
functions | Oracle Java Technologies | Oracle | fn |
(3) 核心标签
①核心标签是最常用的 JSTL标签。引用核心标签库的语法如下:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
② 核心标签的分类
主要我们还是以使用第一个和第三个为主
表达式操作 out、set、remove、catch
流程控制 if、choose、when、otherwise
迭代操作 forEach、forTokens
URL操作 import、param、url、redirect
Set标签
<c:set> 主要用来将变量存储至JSP范围中 或是JavaBean的属性或Map对象中
名称 | 说明 | 是否必须写 | 默认值 |
---|---|---|---|
Value | 要被存储的值 | 否 | 无 |
var | 存入的变量名称 | 否 | 无 |
scope | var变量的JSP范围 | 否 | Page |
target | JavaBean或Map对象 | 否 | 无 |
property | 指定target对象的属性 | 否 | 无 |
<c:out>主要用来显示数据的内容
名称 | 说明 | 是否必须写 | 默认值 |
---|---|---|---|
value | 需要显示出来的值 | 是 | 无 |
default | 如果value的值为null,则显示default的值 | 否 | 无 |
escapeXml | 是否转换特殊字符,如:<转换成 & lt; | 否 | True |
<c:remove> 主要负责移除变量
名称 | 说明 | 是否必须写 | 默认值 |
---|---|---|---|
Var | 欲移除的变量名称 | 是 | 无 |
Scope | var变量的jsp范围 | 否 | Page |
<c:if> 主要用于进行if判断,如果为true,则输出标签体中的内容
名称 | 说明 | 是否必须写 | 默认值 |
---|---|---|---|
Test | 表达式的结果为true,则执行体内容,false则相反 | 是 | 无 |
var | 如果 用来存储test运算的结果(true或false) | 否 | 无 |
scope | Var变量的JSP范围 | 否 | page |
<c:choose>,<c:when>,<c:otherwise> 作用相当于if-else
名称 | 说明 | 必须 | 默认 |
---|---|---|---|
test | 如果表达式的结果为true,则执行体内容,false则相反 | 是 | 无 |
<c:forEach> 循环控制,它可以将数组,集合(Collection)中的成员循序浏览一遍。
名称 | 说明 | 必须 | 默认值 |
---|---|---|---|
var | 用来存放现在指定的成员 | 是 | 无 |
items | 被迭代的集合对象 | 否 | 无 |
varStatus | 用来存放现在指的相关成员信息 | 否 | 无 |
begin | 开始的位置 | 否 | 0 |
end | 结束的位置 | 否 | 最后一个成员 |
step | 每次迭代的间隔数 | 否 | 1 |
(4)格式化标签
1、fmt:formatDate
作用:将日期类型格式化为指定模式的字符串
属性
value:将要被格式化的数据
pattern:格式化的模式,与SimpleDateFormat的参数设置一样
var:格式化后的字符串所要存放的变量,若不指定var,则会将格式化的结果直接显示在页面
scope:变量存放的域属性空间,默认page
type:其取值为date、time、both,表示给出的value是日期、时间、还是两者都包含,默认是date
2、fmt:parseDate
作用:用于将指定字符串转化为日期类型
<fmt:parseDate value="${now }" pattern="yyyy-MM-dd" var="today"/>
Value服务器获取的时间
Pattern:转换的格式
Var:页面显示的变量
3、fmt:formatNumber
按照指定格式对数字进行格式化
属性
maxIntegerDigits:整数部分最多的位数
minIntegerDigits:整数部分最少的位数
maxFrctionDigits:小数部分最多的位数
minFrctionDigits:小数部分最少的位数
var:存储格式化结果的变量
scope:var属性的作用域
integerOnly:是否只解析整型数true或者浮点数false
就目前来说的话,只有在做一些算法题中,以及在显示页面的时间数据时使用这个比较好用