常用 jsp 标签
一、介绍
1. 什么是 JSTL
- JSTL 是 java 中的一个定制标记库集
2. 为什么要使用 JSTL
实现了 JSP 页面中的代码复用
基于标签库原理,重复率较高的代码块支持复用,提高效率
书写 JSP 页面时可读性更强
长得很像 XML,方便前端查看和参与开发
3. 使用方法
- 导入 jstl.jar 和 standard.jar
- <%@ taglib uri=”http://java.sun.com/jsp/jstl/core” prefix=”c”%>
- 正常书写 JSTL
4. JSTL 标签的四大分类及 JSTL 函数
- 核心标签
- 格式化标签
- SQL 标签
- XML 标签
5. EL 表达式
什么是 EL 表达式
全名是 Expression Language
经常与 JSTL 配合使用,使得 JSP 页面更直观,写法更方便写法对比
- 普通写法:
<%=session.getValue("name") %>
- EL 表达式写法:
<c:out value="${sessionScope.name}" />
- 普通写法:
EL 表达式的格式
用美元符号” $ “定界,内容包含在花括号” { } “中
${表达式}
“ . ” 与 “ [ ] ” 运算符
通常情况是通用的
${user.sex}
=${user["sex"]}
” [ ] ” 还可以用来进行集合元素中的定位
${booklist[0].price}
除两种情况外
- 包含特殊字符
${user.first-name}
×${user["first-name"]}
✔- 通过变量动态取值,只能使用 ” [ ] “
EL 变量
JSP 内置对象 | EL 名称 |
---|---|
Page | PageScope |
Request | RequestScope |
Session | SessionScope |
Application | ApplicationScope |
当没有限定范围,如 ${username}
,依此从上到下查找,如果都没找到,返回一个空字符串
EL 自动类型转换
要取得文本框中的输入,我们需要做类型转换
常规:
String str_count = request.getParameter("count"); int count = Integer.parseInt(str_count); count += 20;
EL:
${param.count + 20} <!-- param.count 等价于 request.getParameter("count")-->
- EL 运算符
类别 | 运算符 |
---|---|
算术运算符 |
|
关系运算符 | == != < > <= >= |
逻辑运算符 | && || ! |
验证运算符 | empty(为空返回 ture) |
二、JSTL 标签
1. 常用核心标签介绍
- JSTL 的核心标签库共 13 个,从功能上可以分为 4 类
- 表达式控制标签:out set remove catch
- 流程控制标签:if choose when otherwise
- 循环标签:forEach forTokens
- URL 操作标签:import url redirect
2. out 标签
用法
- 输出常量
可在 value 属性中直接赋值
- 输出变量
变量不存在可配合 defalut 属性输出默认值,还可通过 escapeXml 控制转义字符的输出方法
Demo
<%@ page language="java" contentType="text/html; charset=utf-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <h1>out 标签</h1> <hr> <!-- 使用 out 标签输出常量 --> <c:out value="这是常量"></c:out> <br> <!-- 使用 out 标签输出变量 --> <!-- 直接输出变量 --> <% session.setAttribute("name", "这是变量"); %> <c:out value="${name}"></c:out> <br> <!-- 当变量不存在,通过 defalut 属性输出默认值 --> <c:out value="${user}" default="默认值"></c:out> <br> <!-- 设置输出转义后的字符需要将 escapeXml 属性设置为 false --> <c:out value="<转义>" escapeXml="false"></c:out> <br> <c:out value="<没转义>" escapeXml="true"></c:out>
3. set 标签
用法
- 存值到 scope 中
可将值以变量形式存放在指定的范围中(两种方式,以 value 属性,或者以标签的值)
- 存值到 JavaBean 的属性中
需要配合 target 属性指定对象并且通过 property 属性指定要赋值给对象中的哪个属性
Demo
<%@ page language="java" contentType="text/html; charset=utf-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <jsp:useBean id="person" class="beans.Person"></jsp:useBean> <h1>set 标签</h1> <hr> <!-- 存值到 scope 中 --> <!-- 以 value 属性性质存值 --> <c:set value="today" var="day" scope="session"></c:set> <!-- 同 session.setAttribute("day","today") --> <c:out value="${day}"></c:out><br> <!-- 以标签值形式存值 --> <c:set var="month" scope="application">8</c:set> <c:out value="${month}"></c:out><br> <!-- 通过 set 标签向 person 中赋值 --> <c:set target="${person}" property="name" value="二狗"></c:set> <!-- target 对应上面的 useBean 中的 id 属性 --> <!-- name 代表要赋值 javaBean 的属性 --> <c:out value="${person.name}"></c:out> <c:set target="${person}" property="age" value="22"></c:set> <c:out value="${person.age}"></c:out><br> <!-- 或者 --> <c:set target="${person}" property="name">二狗</c:set> <c:out value="${person.name}"></c:out> <c:set target="${person}" property="age">22</c:set> <c:out value="${person.age}"></c:out>
4. remove 标签
用法
- remove 掉某个变量
- var 属性必选
- scope 属性可选
Demo
<%@ page language="java" contentType="text/html; charset=utf-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <h1>remove 标签</h1> <hr> <!-- 先为 day 赋值 today --> <c:set value="today" var="day" scope="session"></c:set> <!-- 有输出 --> <c:out value="${day}"></c:out> <br> <!-- remove 掉 day --> <c:remove var="day"></c:remove> <!-- 已经没有 day 属性,没有输出 --> <c:out value="${day}"></c:out>
5. catch
用法
- catch 标签中可以包含那些容易出错的 JSTL 标签
Demo
<%@ page language="java" contentType="text/html; charset=utf-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <h1>catch 标签</h1> <hr> <!-- 用 catch 捕捉出错信息并存储到 error 变量 --> <c:catch var="error"> <!-- 写数据到不存在的 javaBean 属性中 --> <!-- 以便抛出错误 --> <c:set property="22" target="${222}" >ss</c:set> </c:catch> <!-- 输出 error --> <c:out value="${error}"></c:out>
6. if 标签
用法
同程序中的 if 作用相同,用来实现分支条件控制
- test 属性用于存放判断的条件,一般使用 EL 表达式来编写
- var 指定名称用来存放判断的结果类型为 true 或 false
- scope 用来存放 var 属性存放的范围
Demo
<%@ page language="java" contentType="text/html; charset=utf-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <h1>if 标签</h1> <hr> <form action="if.jsp" method="post"> <input type="text" name="score" value="${param.score}"/> <input type="submit"/> </form> <!-- 当 90<=成绩 为优秀 --> <c:if test="${param.score >= 90}" scope="session" var="status"> <c:out value="恭喜您!您的成绩是优秀"></c:out> </c:if> <!-- 当 80<=成绩<90 为良好 --> <c:if test="${param.score >= 80 && param.score < 90}" scope="session" var="status"> <c:out value="恭喜您!您的成绩是良好"></c:out> </c:if> <!-- 当 70<=成绩<80 为中等 --> <c:if test="${param.score >= 70 && param.score < 80}" scope="session" var="status"> <c:out value="恭喜您!您的成绩是中等"></c:out> </c:if> <!-- 当 60<=成绩<70 为及格 --> <c:if test="${param.score >= 60 && param.score < 70}" scope="session" var="status"> <c:out value="恭喜您!您的成绩是及格"></c:out> </c:if> <!-- 当 成绩<60 为不及格 --> <c:if test="${param.score < 60}" scope="session" var="status"> <c:out value="恭喜您!您的成绩是不及格"></c:out> </c:if>
7. choose、when、otherwise 标签
用法
类似于 switch,实现分支控制
- 通常三个标签配合使用
- choose 标签内嵌套 when 和 otherwise 标签使用
- 或 choose 标签嵌套 when 标签使用
Demo
<%@ page language="java" contentType="text/html; charset=utf-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <h1>choose、when、otherwise 标签</h1> <hr> <form action="choose.jsp" method="post"> <input type="text" name="score" value="${param.score}"/> <input type="submit"/> </form> <!-- 第一种,choose 内嵌套 when 和 otherwise --> <!-- 当符合条件时为 when,否则为 otherwise --> <c:choose> <c:when test="${param.score >= 90 && param.score <=100}"> <c:out value="恭喜您!您的成绩是优秀"></c:out> </c:when> <c:when test="${param.score >= 80 && param.score < 90}"> <c:out value="恭喜您!您的成绩是良好"></c:out> </c:when> <c:when test="${param.score >= 70 && param.score < 80}"> <c:out value="恭喜您!您的成绩是中等"></c:out> </c:when> <c:when test="${param.score >= 60 && param.score < 70}"> <c:out value="恭喜您!您的成绩是及格"></c:out> </c:when> <c:when test="${param.score >= 00 && param.score < 60}"> <c:out value="恭喜您!您的成绩是不及格"></c:out> </c:when> <c:otherwise> <c:out value="你的输入有误!!"></c:out> </c:otherwise> </c:choose> <br> <!-- 第二种,choose 内嵌套 when --> <c:choose> <c:when test="${param.score==100}"> <c:out value="您是第一名!!"></c:out> </c:when> </c:choose>
8. forEach 标签
用法
根据循环条件遍历集合中的元素
- var 设定变量名用于存储从集合中取出的元素
- items 指定要遍历的集合
- begin、end 用于指定遍历的起始位置和终止位置,默认分别为 0 和 items.size()-1
- step 指定循环的步长,默认为 1
- varStatus 通过几个状态值,描述 [begin,end] 子集中元素的状态
- index 返回当前元素在整个集合中的索引值
- count 返回当前元素在子集中的计数值
- first 当前元素是否是子集第一个元素,是返回 true
- last 当前元素是否是子集最后一个元素,是返回 true
Demo
“`jsp
<%@ page language=”java” contentType=”text/html; charset=utf-8”%>
<%@ page import=”java.util.*” %>
<%@ taglib uri=”http://java.sun.com/jsp/jstl/core” prefix=”c”%>foreach 标签
8. forTokens 标签
用法
用于浏览字符串,并根据指定的字符将字符截取
- items 指定被迭代的字符串
- delims 指定使用的分隔符
- var 指定用来存放分割的子串名称
- begin、end 用于指定遍历的起始位置和终止位置,默认分别为 0 和 items.size()-1
- step 指定循环的步长,默认为 1
- varStatus 通过几个状态值,描述 [begin,end] 子集中元素的状态
- index 返回当前元素在整个集合中的索引值
- count 返回当前元素在子集中的计数值
- first 当前元素是否是子集第一个元素,是返回 true
- last 当前元素是否是子集最后一个元素,是返回 true
Demo
<%@ page language="java" contentType="text/html; charset=utf-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <h1>forTokens 标签</h1> <hr> <!-- 从 items 指定的字符串中,以 - 为分隔符分割 --> <c:forTokens items="123-456-789-987" delims="-" var="num"> <c:out value="${num}"></c:out><br> </c:forTokens>
9. import 标签
用法
可以把其他动态或静态文件包含到本 jsp 页面中
- 与 < jsp:include> 区别:
- include 只能包含同一个 web 应用中的文件
- import 可以包含其他 web 应用中的文件,甚至是网络上的资源
- url 被导入资源的 URL 路径
- context 相同服务器下其他的 web 工程,必须以 “/” 开头
- var 以 String 类型存入被包含文件的内容
- scope var 变量的 jsp 范围
- charEncoding 被导入文件的编码格式
- varReader 以 Reader 类型存储被包含文件内容
Demo
<%@ page language="java" contentType="text/html; charset=utf-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <h1>import 标签</h1> <hr> <!-- 导入网络上的路径 --> <!-- 由于导入的是网络上的资源,可能抛出错误 --> <c:catch var="error00"> <c:import url="https://www.baidu.com/" charEncoding="utf-8"></c:import> </c:catch> <c:out value="${error00}"></c:out> <!-- 导入相对路径的文件 --> <c:catch var="error01"> <!-- 将 out.jsp 页面导入到该 jsp 页面,并将网页内容以 String 类型保存入 ss --> <c:import url="out.jsp" charEncoding="utf-8" var="ss"></c:import> <c:out value="${ss}"></c:out><br> </c:catch> <c:out value="${error01}"></c:out>
10. redirect 标签
用法
用来实现请求的重定向,同时可以在 url 中加入指定的参数
- url 指定重定向页面的地址
- context 用于导入其他 web 页面中的页面
Demo
<%@ page language="java" contentType="text/html; charset=utf-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <h1>redirect 标签</h1> <hr> <!-- 重定向到其他页面 --> <c:redirect url="if.jsp"> <!-- 包含重定向时要传递的参数 --> <!-- 参数键值对会跟着重定向的 url 地址后 --> <c:param name="username" value="2333"></c:param> <c:param name="password" value="123"></c:param> </c:redirect>
11. url 标签
用法
用于动态生成一个 String 类型的 URL
- value 表示 url 路径值
- var 存储 url 路径的变量名
- scope var 变量的范围
Demo
<%@ page language="java" contentType="text/html; charset=utf-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <h1>url 标签</h1> <hr> <!-- 判断是否添加 partUrl 变量 --> <c:if test="${3>=1}"> <c:set var="partUrl">aa</c:set> </c:if> <!-- 拼接成新 Url 地址 --> <c:url value="http://localhost:8080/${partUrl}" var="newUrl" scope="session"></c:url> <a href="${newUrl}">URL</a>