JSP与JSTL
JSP基础
简介
JSP全称Java Server Page。是SUN 公司提供的动态网页编程技术,是 Java Web 服务器端的动态资源。
- 相比 html 而言,html 只能为用户提供静态数据,而 Jsp 技术允许在页面中嵌套java 代码,为用户提供动态数据。
- 相比 servlet 而言,servlet 很难对数据进行排版,而 jsp 除了可以用 java 代码产生动态数 据的同时,也很容易对数据进行排版。
- 其实 Jsp 就是一个 Servlet,当我们第一次访问 Jsp 的时候,Jsp 引擎都会将这个Jsp 翻译 成一个 Servlet,这个文件存放在 Tomcat 中的 work 目录中。
注释
-
显示注释:客户端可以看到的注释
- 继承HTML风格的注释:<!-- -->
-
隐式注释:客户端无法看到的注释
- JSP自己的注释:<%-- --%>
- 继承Java风格的注释(写在脚本中的)
- // 单行注释
- /* 多行注释 */
<!-- 这是继承HTML风格的注释 --> <%-- 这是JSP自己的注释 --%> <% /* 这是多行注释 */ int a = 1; // 定义一个变量 %>
Scriptlet
在 JSP 中最重要的部分就是 Scriptlet(脚本小程序),所有嵌入在 HTML 代码中的Java 程序,都必须使用 Scriptlet 标记出来
-
在 JSP 中一共有三种 Scriptlet 代码:
名称 作用 语法 说明 JAVA脚本段 定义局部变量 <% Java语句 %> 生成的源码在编译后的Servlet类的service方法体中 声明表达式 声明全局变量、方法等 <%! 声明表达式 %> 生成的源码在编译后的Servlet类的类体中 输出表达式 输出变量、字面值 <%= 输出表达式 %> 生成的源码在编译后的Servlet类的service方法体中
JSP指令标签
page
- 语法格式:
- <%@ page 属性名=“属性值” 属性名=“属性值” … %>
- 常用属性:
- language:语言,language="java"表示当前是Java
- contentType:响应类型及编码格式
- pageEncoding:编码格式
- 说明:JSP页面的编码格式以 contentType 中的 charset 为准;若未设置 caherset 的值,则以 pageEncoding 的属性值为准;若都未设置,则使用默认编码ISO-8859-1。
- import:导包
- 说明:在page指令中只有 import 属性可以设置多次
- isErrorPage:是否是处理错误的页面,默认是false;一般与errorPage结合使用
- errorPage:处理错误信息的页面(当页面报错时,统一跳转处理的页面);一般与isErrorPage结合使用
taglib
-
当使用到第三方标签库时需要通过 taglib 标签进行导入。
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
include静态包含
- 语法格式:
- <%@include file=“要包含的页面路径” %> (一般为相对路径)
- 静态包含特点:
- 只会生成一个源码文件,相当于将内容进行直接替换
- 不能出现同名变量名
- 耦合度高,不够灵活,但效率会快一点
include动态包含
-
语法格式:
- <jsp:include page=“要包含的页面路径”></jsp:include>
-
动态包含特点:
- 生成多个源码文件
- 可以定义同名变量
- 耦合度低,比较灵活
-
<jsp:include>双标签之间不要有任何内容,包括空格和换行。(除非传递参数)
-
需要传递参数的格式:
<jsp:include page="要包含的页面路径"> <jsp:param name="参数名" value="参数值" /> <jsp:param name="参数名" value="参数值" /> </jsp:include>
- 接收参数:
request.getParameter("参数名");
- name属性不支持任何表达式,value属性支持。
-
include静态包含和include动态包含的区别:
- 静态包含只生成一个源代码文件,动态包含会生成多个
- 静态包含不能出现同名变量,动态包含可以
- 静态包含是单标签,动态包含是双标签
- 静态包含不能传递参数,动态包含可以
- 静态包含耦合度高,不够灵活;动态包含耦合度低,比较灵活
JSP内置对象
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tztHcRSp-1573691361650)(D:\SHSXT\中级班\JSP\video\1572433369315.png)]
-
JSP四大域对象
对象名 范围 说明 pageContext page范围 只在一个页面中保存属性,跳转之后无效 request request范围 只在一次请求中保存,服务器跳转后依然有效 session session范围 在一次会话范围中,无论何种跳转都可以使用 application application范围 在整个服务器上保存 - 使用原则:在合理范围尽可能小
- 方法:
- setAttribute(String name, Object o):设置属性的名称及内容
- getAttribute(String name):根据属性名称取属性
- removeAttribute(String name):删除指定的属性
EL表达式***
语法格式
- ${域对象的键}
EL表达式的特点
- EL表达式一般操作的都是域对象,不能操作变量
- EL表达式取值时,会从小范围到大范围中去找,找到即止
- 如果四个域范围都没找到,则返回空字符串""
- 查找范围:page ——> request ——> session ——> application
- 范围依次是,本页面,一次请求, 一次会话,整个应用程序
- 获取指定域范围的域对象:pageScope, requesScope, sessionScope, applicationScope
- 格式:${pageScope.域对象的键}
EL 表达式的使用
- 获取JavaBean对象中的属性字段:
- ${对象的限域变量名.属性字段名}或者${对象的限域变量名.get属性字段()}
- 注:JavaBean对象中的属性字段需要提供getter()和setter()方法
- ${对象的限域变量名.属性字段名}或者${对象的限域变量名.get属性字段()}
- 判断域对象是否为空
- ${empty 对象的限域变量名}
- 如果是字符串,会判断是否为null和是否为空字符串
- 如果是JavaBean对象,会判断对象是否为null
- 如果是List集合,会判断是否为null和集合的长度是否大于0
- 如果是Map对象,会判断是否为null和集合的长度是否大于0
- ${empty 对象的限域变量名}
- 操作集合
- List集合:
- 获取集合的长度:${对象的限域变量名.size() }
- 取值:${对象的限域变量名[下标] }
- Map对象:
- 取值:${对象的限域变量名.map对象的key} 或 ${对象的限域变量名[“map对象的key”]}
- List集合:
- 运算
- 注:所有的操作,都是写在{}里面的
- 例如:${对象的限域变量名1 + 对象的限域变量名2}
- 比较
- 等值比较:返回boolean类型
- ${对象的限域变量名1 == 对象的限域变量名2}
- ${对象的限域变量名1 eq 对象的限域变量名2}
- 大小比较:返回boolean类型
- ${对象的限域变量名1 > 某个值(普通字面量或域对象)}
- ${对象的限域变量名1 + 某个值(普通字面量或域对象) < 某个值(普通字面量或域对象)}
- 等值比较:返回boolean类型
JSTL标签库
JSTL简介
Java Server Pages Standard Tag Libray(JSTL):JSP 标准标签库
一个定制标签类库的集合,用于解决一些常见的问题,例如迭代一个映射或者集合、条件测试、XML 处理,甚至数据库和访问数据库操作等。
- 两个常用标签库:
- 核心标签库:
- http://java.sun.com/jsp/jstl/core 包含 Web 应用的常见工作,比如:循环、表达式赋值、基本输入输出等。
- 格式化标签库:
- http://java.sun.com/jsp/jstl/fmt 用来格式化显示数据的工作,比如:对不同区域的日期格式化等。
- 核心标签库:
JSTL的使用
-
将jar包拷贝到项目的lib目录下
- jstl.jar
- stardard.jar
-
在需要使用标签库的页面导入具体的标签库
-
核心标签库:
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
- prefix:前缀,可以定义任意,一般使用"c"
-
格式化标签库:
<%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
-
- JSTL标签操作的一般都是域对象,所以都是结合el表达式一起使用
条件标签
-
if标签
-
语法格式:
-
无主体内容
<c:if test="条件(true/false)" var="限域变量名" scope="page|request|session|application"></c:if>
-
有主体内容
<c:if test="条件(true/false)"> 主体内容 </c:if>
-
-
常用属性:
- test:接收返回值为true或false的条件
- var:限域变量名,接收判断结果的
-
JSTL中没有else标签,为了模拟 else 的情景,需要使用两个 if 标签,并且这两个标签为相反的条件。
-
-
choose、when、otherwise标签
-
语法格式:
<c:choose> <c:when test="条件(true/false)"> 主体内容 </c:when> <c:when test="条件(true/false)"> 主体内容 </c:when> <c:otherwise> 主体内容 </c:otherwise> </c:choose>
-
注:
- choose和otherwise没有属性,而when标签必须要有test属性
- choose标签中只能存在when标签和otherwise标签,但是when标签和otherwise标签可以嵌套其它标签
- 否则报错:Illegal child tag in “c:choose” tag
- choose标签中至少要有一个when标签,可以没有otherwise标签
- 否则报错:Illegal “choose” without child “when” tag
- otherwise标签必须放在最后一个when标签之后,在所有的when标签不满足条件时,才会执行
- 否则报错:Illegal “c:when” after “c:otherwise” tag in “c:choose” tag
-
迭代标签
-
forEach标签:
-
迭代主体内容多次
-
语法格式:
<c:forEach begin="开始数" end="结束数" var="限域变量名,当前成员别名"> 主体内容 </c:forEach>
-
常用属性:
属性 说明 begin 开始数,可以接收字面量和域对象,支持el表达式 end 结束数,可以接收字面量和域对象,支持el表达式 var 限域变量名,接收每次循环的结果 step 间隔数
-
-
遍历集合
-
语法格式:
<c:forEach items="要遍历的对象" var="限域变量名"> 主体内容 </c:forEach>
-
常用属性:
属性 说明 items 要遍历的对象,可以是List或Map等 var 限域变量名,用来接收遍历到的每一个成员 varStatus 指代当前循环状态的变量,可以通过其属性获得具体信息
-
-
格式化标签
-
formatNumber 标签
-
将数值型的数据转换成指定格式的字符串
<!-- 没有主体内容 --> <fmt:formatNumber value="要格式化的数值" type="类型" /> <!-- 有主体内容 --> <fmt:formatNumber type="类型"> 要格式化的数值 </fmt:formatNumber>
-
常用属性:
- value:要格式化的数值
- type:要格式化的类型
- number:数值型字符串
- currency:货币型字符串
- percent:百分比字符串
- var:限域变量名,接收格式化的结果
- 如果设置过var属性,则不会直接将结果打印出来,需要通过el表达式获取var的属性值
-
-
formatDate 标签
-
将日期型数据转换成指定格式的字符串
<% request.setAttribute("myDate", new Date()); %> ${myDate }<br> <fmt:formatDate value="${myDate }"/><br> <fmt:formatDate value="${myDate }" type="date"/><br> <fmt:formatDate value="${myDate }" type="time"/><br> <fmt:formatDate value="${myDate }" type="both"/><br> <fmt:formatDate value="${myDate }" type="date" dateStyle="FULL"/><br> <fmt:formatDate value="${myDate }" type="date" dateStyle="short"/><br> <fmt:formatDate value="${myDate }" type="time" timeStyle="long"/><br> <fmt:formatDate value="${myDate }" pattern="yyyy/MM/dd HH:mm:ss"/><br>
-
常用属性:
- value:要格式化的日期类型数据
- type:date、time、both
- pattern:自定义日期格式化格式
- var:限域变量名,接收格式化的结果
- 如果设置过var属性,则不会直接将结果打印出来,需要通过el表达式获取var的属性值
-
-
parseNumber 标签
-
将指定格式的字符串转换成数值型
<fmt:parseNumber type="percent"> 100% </fmt:parseNumber><br/> <fmt:parseNumber type="currency"> $100.00 </fmt:parseNumber>
-
-
parseDate 标签
-
将指定格式的字符串转换成日期型
<fmt:parseDate pattern="dd-MM/yyyy"> 11-10/2018 </fmt:parseDate><br/> <fmt:parseDate pattern="yyyy/MM/dd HH:mm:ss"> 2019/10/30 16:17:37 </fmt:parseDate>
-