1. JSTL
- 描述:JSP Standard Tag Library,JSP标准标签库
- 作用
- 提供给Java Web开发人员一个标准通用的标签函数库
- 取代传统直接在页面嵌入Java代码,以提高程序可读性、维护性和方便性
- 依赖:
- 引入:
<%@ taglib prefix=*"c"* uri=*"http://java.sun.com/jsp/jstl/core" %>
2. out标签
2.1 用法
<!-- 语法 -->
<c:out value="${requestScope.username}"/>
<!-- 参数 -->
value:要输出的值
default:默认值(value指定的值找不到就输出默认值)
escapeXml:是否进行转义,默认为true转义
2.2 实例
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%-- 引入JSTL标签库 --%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>测试</title>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
<meta name="author" content="周威"/>
</head>
<body>
<%-- 通过页面嵌套Java代码向request域中存入一个username变量 --%>
<%
request.setAttribute("username", "张三");
%>
<%-- 通过JSTL的out标签从request域中取出username变量的值 --%>
<c:out value="${requestScope.username}"/>
</body>
</html>
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/43b34b1a1da583a25ad3984d893ae7e5.png#pic_center)
3. set标签
3.1 用法
<!-- 语法 -->
<c:set var="password" value="123456" scope="request"/>
<!-- 参数 -->
var:变量标识
value:变量值
scope:指定变量存入的域
3.2 实例
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%-- 引入JSTL标签库 --%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>测试</title>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
<meta name="author" content="周威"/>
</head>
<body>
<%-- 通过JSTL的set标签向request域中存入一个username变量 --%>
<c:set var="username" value="张三" scope="request"/>
<%-- 通过JSTL的out标签从request域中取出username变量的值 --%>
<c:out value="${requestScope.username}"/>
</body>
</html>
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/65763d946fc2cabe56579b43c6804805.png#pic_center)
4. if标签
4.1 用法
<!-- 语法 -->
<c:if test="${requestScope.username eq 'baby'}">
执行块
</c:if>
<!-- 参数 -->
test:判断条件
4.2 实例
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%-- 引入JSTL标签库 --%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>测试</title>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
<meta name="author" content="周威"/>
</head>
<body>
<%-- 通过JSTL的set标签向request域中存入一个status变量 --%>
<c:set var="status" value="true" scope="request"/>
<%-- 通过JSTL的if标签从request域中取出status变量的值进行判断 --%>
<c:if test="${requestScope.status}">
Hello World
</c:if>
</body>
</html>
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/884c6c2289c90adb3b43674839155e22.png#pic_center)
5. choose标签
5.1 用法
<!-- 语法 -->
<c:choose>
<c:when test="判断条件1">
执行块1
</c:when>
<c:when test="判断条件2">
执行块2
</c:when>
<c:when test="判断条件3">
执行块3
</c:when>
<c:otherwise>
执行块n
</c:otherwise>
</c:choose>
<!-- 参数 -->
test:判断条件
如果所有的when都不满足就执行otherwise块类似java中的多重if...else结构
if(判断条件1)
{
执行块1
}
else if(判断条件2)
{
执行块2
}
else if(判断条件3)
{
执行块3
}
else
{
执行块n
}
5.2 实例
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%-- 引入JSTL标签库 --%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>测试</title>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
<meta name="author" content="周威"/>
</head>
<body>
<%-- 通过JSTL的set标签向request域中存入一个age变量 --%>
<c:set var="age" value="50" scope="request"/>
<%-- 通过JSTL的choose标签从request域中取出age变量的值进行判断 --%>
<c:choose>
<c:when test="${requestScope.age > 0 and requestScope.age < 18 }">
未成年
</c:when>
<c:when test="${requestScope.age < 25}">
年轻人
</c:when>
<c:when test="${requestScope.age < 40}">
中年人
</c:when>
<c:when test="${requestScope.age < 120}">
老年人
</c:when>
<c:otherwise>
这个超出了年龄范围
</c:otherwise>
</c:choose>
</body>
</html>
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/e3e51d4ca4798e35c6e6e14d38eeb3be.png#pic_center)
6. forEach标签
6.1 用法
<!-- 语法 -->
<c:forEach var="user" items="${requestScope.users}">
循环体
</c:forEach>
<!-- 类比 -->
for(User user : users)
{
循环体
}
<!-- 参数 -->
var:每次遍历得到的变量
items:指定需要遍历的集合
<!-- 语法 -->
<c:forEach begin="0" end="10" step="1" var="index" items="requestScope.array">
循环体
</c:forEach>
<!-- 类比 -->
for(int i = 0;i < 10;i++)
{
循环体
}
<!-- 参数 -->
begin:起始索引
end:结束索引
step:步长
var:每次遍历得到的变量
items:指定需要遍历的集合
6.2 普通for循环
<%@ page import="java.util.*" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%-- 引入JSTL标签库 --%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>测试</title>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
<meta name="author" content="周威"/>
</head>
<body>
<%-- 通过嵌套Java代码向request域中存入一个List集合 --%>
<%
List<Integer> list = new ArrayList<Integer>();
for(int index=0;index < 10;index++)
list.add(index);
request.setAttribute("list", list);
%>
<%-- 通过JSTL的forEach标签对集合进行普通for循环遍历 --%>
<c:forEach var="index" items="${requestScope.list}" begin="0" end="${requestScope.list.size()}" step="2">
${index}<br/>
</c:forEach>
</body>
</html>
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/e48e584f9d6556e425caba2c86fb56b6.png#pic_center)
6.3 增强for循环
<%@ page import="java.util.*" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%-- 引入JSTL标签库 --%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>测试</title>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
<meta name="author" content="周威"/>
</head>
<body>
<%-- 通过嵌套Java代码向request域中存入一个List集合 --%>
<%
List<Integer> list = new ArrayList<Integer>();
for(int index=0;index < 10;index++)
list.add(index);
request.setAttribute("list", list);
%>
<%-- 通过JSTL的forEach标签对集合进行增强for循环遍历 --%>
<c:forEach var="index" items="${requestScope.list}">
${index}<br/>
</c:forEach>
</body>
</html>
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/590245e5d079831e11bb8f85d89bb18f.png#pic_center)
6.4 遍历map
<%@ page import="java.util.*" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%-- 引入JSTL标签库 --%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>测试</title>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
<meta name="author" content="周威"/>
</head>
<body>
<%-- 通过嵌套Java代码向request域中存入一个Map集合 --%>
<%
Map<Integer, String> map = new HashMap<Integer, String>();
map.put(1, "Tom");
map.put(2, "Angle");
map.put(3, "Baby");
request.setAttribute("map", map);
%>
<%-- 通过JSTL的forEach标签对Map集合进行增强for循环遍历 --%>
<c:forEach var="entry" items="${requestScope.map}">
<p>${entry.key}-----${entry.value}</p>
</c:forEach>
</body>
</html>
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/520c94166b8fddc98c87b98e608d956e.png#pic_center)
7. EL函数库
7.1 用法
- 描述:JSTL标签库提供了一些操作字符相关的函数,通过它我们可以对字符串进行一些简单处理
- 引入:
<%-- 引入JSTL对EL表达式操作字符串的函数库 --%>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
# 操作字符串
${fn:函数名(参数列表)}
7.2 实例
<%@ page import="java.util.*" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%-- 引入JSTL标签库 --%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%-- 引入JSTL对EL表达式操作字符串的函数库 --%>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<html>
<head>
<title>测试</title>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
<meta name="author" content="周威"/>
</head>
<body>
<%-- 通过页面嵌套Java代码向request域中存入一个content字符串变量 --%>
<%
String content = "abcdefg";
request.setAttribute("content", content);
%>
<c:set var="content" value="abcdefg" scope="request"/>
<%-- 通过JSTL的EL函数库对字符串进行小写转大写 --%>
${fn:toUpperCase(requestScope.content)}
</body>
</html>
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/d9718e179cd426aa3fe216f5c4103272.png#pic_center)
8. 日期格式化
8.1 用法
- 描述:STL标签库提供了一些操作日期相关的标签,通过它我们可以日期进行一些简单处理
- 引入
<%-- 引入JSTL对日期操作标签库 --%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
# 操作日期
<fmt:formatDate value="${requestScope.date}" pattern="yyyy-MM-dd HH:mm:ss"/>
8.2 实例
<%@ page import="java.util.*" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%-- 引入JSTL标签库 --%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%-- 引入JSTL对EL表达式操作日期的函数库 --%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<html>
<head>
<title>测试</title>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
<meta name="author" content="周威"/>
</head>
<body>
<%-- 通过页面嵌套Java代码向request域中存入一个date日期变量 --%>
<%
Date date = new Date();
request.setAttribute("date", date);
%>
<%-- 通过JSTL的EL函数库对日期进行格式化 --%>
<fmt:formatDate value="${requestScope.date}" pattern="yyyy-MM-dd HH:mm:ss" />
</body>
</html>
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/088200f7d15c5b892e2c7297c1bb535b.png#pic_center)
9. 自定义EL函数
- 步骤:
- (1)编写一个Java类,提供一个方法,该方法必须是静态方法,必须有返回值
- (2)在WEB-INF目录下编写一个以.tld结尾的文件进行函数配置
- (3)在JSP页面引入自己编写的EL函数库
- (4)使用自定义的EL函数
9.1 El.java
package zw.demo.el;
public class El
{
public static String sayHello(String name)
{
return "Hello " + name;
}
}
9.2 el.tld
<?xml version="1.0" encoding="UTF-8"?>
<taglib
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
version="2.0">
<tlib-version>1.0</tlib-version>
<short-name>zw</short-name>
<uri>http://zw.jstl.el</uri>
<function>
<name>sayHello</name>
<function-class>zw.demo.el.El</function-class>
<function-signature>java.lang.String sayHello(java.lang.String)</function-signature>
</function>
</taglib>
9.3 index.jsp
<%@ page language="java" contentType="text/html;charset=utf-8" %>
<%-- 引入JSTL标签库 --%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%-- 引入自定义EL函数库 --%>
<%@ taglib prefix="zw" uri="http://zw.jstl.el"%>
<html>
<head>
<title>测试</title>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
<meta name="author" content="周威"/>
</head>
<body>
<%-- 使用自定义EL函数 --%>
${zw:sayHello("tom")}
</body>
</html>
9.4 运行结果
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/be75900d54f87956e49bf0e31b1f5dd5.png#pic_center)
10. 自定义标签
- 步骤
- (1)编写一个Java类,继承SimpleTagSupport类,重写三个方法
- (2)在WEB-INF目录下编写一个以.tld结尾的文件进行标签配置
- (3)在JSP页面引入自己编写的标签库
- (4)使用自己的标签
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/a466b6a0e9319b4636ce487e91a094da.png#pic_center)
10.1 自定义不带主体的标签
10.1.1 Tag.java
package zw.demo.tag;
import javax.servlet.jsp.JspContext;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.SimpleTagSupport;
import java.io.IOException;
public class Tag extends SimpleTagSupport
{
private PageContext pc;
private JspFragment bd;
@Override
public void setJspContext(JspContext pc)
{
this.pc = (PageContext) pc;
}
@Override
public void setJspBody(JspFragment bd)
{
this.bd = bd;
}
@Override
public void doTag() throws JspException, IOException
{
JspWriter jw = pc.getOut();
jw.write("Hello World");
}
}
10.1.2 tag.tld
<?xml version="1.0" encoding="UTF-8"?>
<taglib
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
version="2.0">
<tlib-version>1.0</tlib-version>
<short-name>zw</short-name>
<uri>http://zw.jstl.tag</uri>
<tag>
<name>out</name>
<tag-class>zw.demo.tag.Tag</tag-class>
<body-content>empty</body-content>
</tag>
</taglib>
10.1.3 index.jsp
<%@ page language="java" contentType="text/html;charset=utf-8" %>
<%-- 引入JSTL标签库 --%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%-- 引入自定义标签库 --%>
<%@ taglib prefix="zw" uri="http://zw.jstl.tag"%>
<html>
<head>
<title>测试</title>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
<meta name="author" content="周威"/>
</head>
<body>
<%-- 使用自定义标签 --%>
<zw:out/>
</body>
</html>
10.1.4 运行结果
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/938cf6ca315c688993cccd563d93d5f3.png#pic_center)
10.2 自定义带标签主体的标签
10.2.1 Tag.java
package zw.demo.tag;
import javax.servlet.jsp.JspContext;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.SimpleTagSupport;
import java.io.IOException;
import java.io.Writer;
public class Tag extends SimpleTagSupport
{
private PageContext pc;
private JspFragment bd;
@Override
public void setJspContext(JspContext pc)
{
this.pc = (PageContext) pc;
}
@Override
public void setJspBody(JspFragment bd)
{
this.bd = bd;
}
@Override
public void doTag() throws JspException, IOException
{
Writer writer = pc.getOut();
bd.invoke(writer);
}
}
10.2.2 tag.tld
<?xml version="1.0" encoding="UTF-8"?>
<taglib
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
version="2.0">
<tlib-version>1.0</tlib-version>
<short-name>zw</short-name>
<uri>http://zw.jstl.tag</uri>
<tag>
<name>print</name>
<tag-class>zw.demo.tag.Tag</tag-class>
<body-content>scriptless</body-content>
</tag>
</taglib>
10.2.3 index.jsp
<%@ page language="java" contentType="text/html;charset=utf-8" %>
<%-- 引入JSTL标签库 --%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%-- 引入自定义标签库 --%>
<%@ taglib prefix="zw" uri="http://zw.jstl.tag"%>
<html>
<head>
<title>测试</title>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
<meta name="author" content="周威"/>
</head>
<body>
<%-- 使用自定义标签 --%>
<zw:print>Hello World</zw:print>
</body>
</html>
10.2.4 运行结果
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/91751de4213a1e23e39c5561703608ca.png#pic_center)
10.3 自定义带标签属性的标签
10.3.1 Tag.java
package zw.demo.tag;
import javax.servlet.jsp.JspContext;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.SimpleTagSupport;
import java.io.IOException;
public class Tag extends SimpleTagSupport
{
private PageContext pc;
private JspFragment bd;
private boolean test;
@Override
public void setJspContext(JspContext pc)
{
this.pc = (PageContext) pc;
}
@Override
public void setJspBody(JspFragment bd)
{
this.bd = bd;
}
@Override
public void doTag() throws JspException, IOException
{
if(test)
bd.invoke(pc.getOut());
}
public void setTest(boolean test)
{
this.test = test;
}
}
10.3.2 tag.tld
<?xml version="1.0" encoding="UTF-8"?>
<taglib
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
version="2.0">
<tlib-version>1.0</tlib-version>
<short-name>zw</short-name>
<uri>http://zw.jstl.tag</uri>
<tag>
<name>if</name>
<tag-class>zw.demo.tag.Tag</tag-class>
<body-content>scriptless</body-content>
<attribute>
<name>test</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
<type>java.lang.Boolean</type>
</attribute>
</tag>
</taglib>
10.3.3 index.jsp
<%@ page language="java" contentType="text/html;charset=utf-8" %>
<%-- 引入JSTL标签库 --%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%-- 引入自定义标签库 --%>
<%@ taglib prefix="zw" uri="http://zw.jstl.tag"%>
<html>
<head>
<title>测试</title>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
<meta name="author" content="周威"/>
</head>
<body>
<%-- 通过嵌套java代码向request域中存入boolean类型status变量 --%>
<%
request.setAttribute("status", true);
%>
<%-- 使用自定义标签 --%>
<zw:if test="${requestScope.status}">
自定义if标签
</zw:if>
</body>
</html>
10.3.4 运行结果
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/1b799816469cf8601039317b04033a20.png#pic_center)