使用JSTL首先需要将jstl.jar和standard.jar两个第三方jar包粘贴到你的web项目的WEB-INF中的lib下并add to build path。
导入完包之后,需要在你的jsp页面导入相应的JSTL标签库,使用taglib指令进行导入,如使用JSTL核心库:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
这里的prefix指的是前缀名,可以理解成别名,随便你自己定义,但规范来说,一般使用“c”来标记核心标签库。
JSTL核心标签库
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
1.out
用来输出常量或者变量,可以与EL表达式结合使用功能更强大。它可以设置默认值,假如变量数据不存在或为null,(不包括空字符串),那么会显示default设置的值。默认情况下,escapeXml="true",value里的值不会被解析成html,当escapeXml="false"时,value里的值会被解析成html。
<%@ page import="test.Person" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head>
<title>jstl标签</title>
</head>
<body>
<%
Person person=new Person("猪头",10);
pageContext.setAttribute("person",person);
%>
<c:out value="你好"/><br/>
<c:out value="${'hello'}"/><br/>
<c:out value="${person}"/><br/>
<c:out value="${person.name}"/><br/>
<c:out value="${name}" default="无名"/><br/>
<c:out value="<font color=red>喜碧</font>" escapeXml="true"/><br/><%--escapeXml属性默认是true--%>
<c:out value="<font color=red>喜碧</font>" escapeXml="false"/><br/>
${"<font color=red>喜碧</font>"}<%--el表达式里的字符串会被解析成html--%>
</body>
</html>
其中,Person类的代码如下:
package test;
public class Person {
private String name;
private int age;
public Person() {
}
public Person(String name,int age) {
this.name = name;
this.age=age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
运行结果:
2.set
set标签的属性中var、value、scope是一组,例如<c:set var="name" value="mike" scope="session">等同于session.setAttribute("name","mike"),scope默认="page";target、property、value是一组,用于给target对象的property属性赋值value。
<%@ page import="test.Person" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head>
<title>jstl标签</title>
</head>
<body>
<%
Person person=new Person("猪头",10);
pageContext.setAttribute("person",person);
%>
<%--等同于session.setAttribute("person1",pageContext.findAttribute("person")),
这里的findAttribute()是依次在page,request,session(如果有效的话)和application Scope(范围
)查找以person为名的Attribute,找到就返回该对象,都找不到返回null--%>
<c:set var="person1" value="${person}" scope="session"/>
<%--依次在page,request,session,application找键为"person"的对象,找到即返回该对象,没找到返回null--%>
1.${person}<br/>
2.${sessionScope.person1}<br/>
<%--先从session范围里查找键为person2的对象,如果找不到,则创建名为person2的Person对象,将它放入session范围,scope不写默认="page"--%>
<jsp:useBean id="person2" class="test.Person" scope="session"/>
<%--依次从page,request,session,application中查找键为"person2"的对象,找到即返回该对象,并给该对象的name属性赋值“八戒”--%>
<c:set target="${person2}" property="name" value="八戒"/>
3.${person2.name}<br/>
4.<%=session.getAttribute("person2")%><br/>
5.${person2}<br/>
<%
request.setAttribute("person3",person);
%>
<c:set target="${person3}" property="name" value="悟空"/>
6.${person3.name}<br/>
<%
Person person4=new Person("测试",0);
%>
7.${person4}
</body>
</html>
运行结果:
1.test.Person@73d1b067
2.test.Person@73d1b067
3.八戒
4.test.Person@68779499
5.test.Person@68779499
6.悟空
7.
3.if
if标签有3个属性
test:里面放条件判断的boolean值,如果为true,则执行if标签的内容
var:存放条件判断结果的变量,该变量放入scope范围中。
scope:var变量放入的范围,默认为page。
<%@ page import="test.Person" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head>
<title>jstl标签</title>
</head>
<body>
<%
int age=10;
request.setAttribute("age",age);
%>
<c:if test="${age>9}" var="result" scope="session">
<c:out value="${'10>9'}"></c:out>
</c:if>
<br/>
${sessionScope.result}
</body>
</html>
运行结果:
10>9
true
4.choose
if标签没有else功能,choose标签可以弥补这个缺点,它可以结when和otherwise标签。
<%@ page import="test.Person" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head>
<title>jstl标签</title>
</head>
<body>
<%
int age=4;
request.setAttribute("age",age);
%>
<c:choose>
<c:when test="${age>=10}">
<c:out value="${'你到达10岁了'}"/>
</c:when>
<c:when test="${age<10 && age>5}">
<c:out value="${'你大于5岁小于等于10岁'}"/>
</c:when>
<c:otherwise>
<c:out value="${'你连5岁都不到!'}"/>
</c:otherwise>
</c:choose>
</body>
</html>
运行结果:
你连5岁都不到!
5.forEach
forEach用来循环遍历数值或者数组或者集合。
begin:元素开始的索引
end:元素结束的索引
step:步长
var:临时存储元素的变量,放在pageScope范围中,仅在forEach标签内有效。
varStatus:循环状态的变量,放在pageScope范围中,仅在forEach标签内有效。
items:需要循环的数组或者集合。
其中varStatus有如下属性:
<%@ page import="test.Person" %>
<%@ page import="java.util.Map" %>
<%@ page import="java.util.HashMap" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib prefix="C" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>jstl标签</title>
</head>
<body>
<%
int age=4;
pageContext.setAttribute("age",age);
%>
<c:forEach begin="1" end="10" var="i" step="2" varStatus="status">
${pageScope.status.index}
${status.count}
${status.current}
${status.first}
${status.last}
${pageScope.i}
<%=pageContext.getAttribute("i")%>
<br/>
</c:forEach>
<hr/>
<%
String[] strings=new String[]{"hello","world","iloveyou","where","are","you"};
pageContext.setAttribute("str",strings);
%>
<C:forEach begin="1" end="10" items="${str}" var="s" varStatus="status" step="2">
${s}
<br/>
</C:forEach>
<hr/>
<%
Map map=new HashMap();
map.put("i","have");
map.put("a","dream");
map.put("but","you");
map.put("don't","know");
request.setAttribute("myMap",map);
%>
<c:forEach items='<%=request.getAttribute("myMap")%>' var="m" >
${m}
key:${m.key}
value:${m.value}
<br/>
</c:forEach>
</body>
</html>
运行结果:
JSTL格式化标签库
<%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
1.数值格式化标签
属性可参考<fmt:formatNumber>标签
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
<html>
<head>
<title>jstl标签</title>
</head>
<body>
数值<br/>
<fmt:formatNumber value="001234567.0543200" pattern="#.##"/><br/>
<fmt:formatNumber value="345500" pattern="00000000.00"/><br/>
<fmt:formatNumber value="345500" pattern="########.##"/><br/>
货币<br/>
<fmt:formatNumber value="345500" type="currency"/><br/>
<fmt:formatNumber value="345500" pattern="########.##" type="currency"/><br/>
百分数<br/>
<fmt:formatNumber value="0.355" type="percent"/><br/>
<fmt:formatNumber value="0.355" pattern="##.#" type="percent"/><br/>
<fmt:formatNumber value="0.355" pattern="##.#%" type="percent"/><br/>
</body>
</html>
运行结果:
数值
1234567.05
00345500.00
345500
货币
¥345,500.00
345500
百分数
36%
0.4
35.5%
2.时间格式化标签
属性可参考<fmt:formatDate> 标签
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.Date" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<html>
<head>
<title>jstl标签</title>
</head>
<body>
<%
Date date=new Date();
pageContext.setAttribute("now",date);
%>
${now}<br/>
<fmt:formatDate value="${now}" type="date"/><br/>
<fmt:formatDate value="${now}" type="both" dateStyle="long" timeStyle="long"/><br/>
<fmt:formatDate value="${now}" type="both" pattern="yyyy-MM-dd HH:mm:ss"/>
</body>
</html>
运行结果:
Thu Aug 09 21:52:42 CST 2018
2018-8-9
2018年8月9日 下午09时52分42秒
2018-08-09 21:52:42
EL函数库
EL函数库是第三方对EL表达式的扩展,我们现在学习的EL函数库是JSTL添加的,所以要导入JSTL标签库。
<%@taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
EL函数库就是定义的一些又返回值的静态方法,然后通过EL语言来调用它们。当然,不止是JSTL可以定义EL函数,我们自己也可以定义。
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<html>
<head>
<title>jstl标签</title>
</head>
<body>
<%
String str="hello world";
String[] strings={"hello","world","你好","世界"};
List list=new ArrayList();
list.add(1);
list.add("hello");
list.add("world");
pageContext.setAttribute("list",list);
pageContext.setAttribute("str",str);
pageContext.setAttribute("strings",strings);
%>
<b>fn:length(str):</b>${fn:length(str)}<br/>
<b>fn:length(strings):</b>${fn:length(strings)}<br/>
<b>fn:length(list):</b>${fn:length(list)}<br/>
<b>fn:toUpperCase("HHji"):</b>${fn:toUpperCase("HHji")}<br/>
<b>fn:contains("helloAr","Ar" ):</b>${fn:contains("helloAr","Ar" )}<br/>
<b>fn:containsIgnoreCase("helloAr","ar" ):</b>${fn:containsIgnoreCase("helloAr","ar" )}<br/>
<b>fn:contains(strings, "world"):</b>${fn:contains(strings, "world")}<br/>
fn:contains(list, "hello"):${fn:contains(list, "hello")}<br/>
fn:startsWith("abcde","ab" ):${fn:startsWith("abcde","ab" )}<br/>
fn:indexOf("hello","e" ):${fn:indexOf("hello","e" )}<br/>
fn:join(strings, "-"):${fn:join(strings, "-")}<br/>
fn:replace(str, "o", "q"):${fn:replace(str, "o", "q")}<br/>
fn:split(str, " "):${fn:split(str, " ")}<br/>
fn:substring("hello world",1 ,3 ):${fn:substring("hello world",1 ,3 )}<br/>
fn:substring("hello world",1,-1 ):${fn:substring("hello world",1,-1 )}<br/>
fn:substringAfter("hello world"," " ):${fn:substringAfter("hello world"," " )}<br/>
fn:substringBefore("hello world"," " ):${fn:substringBefore("hello world"," " )}<br/>
fn:trim(" hello world "):${fn:trim(" hello world ")}<br/>
fn:escapeXml("<font color=red>字体</font>"):${fn:escapeXml("<font color=red>字体</font>")}<br/>
${"<font color=red>字体</font>"}:${"<font color=red>字体</font>"}<br/>
</body>
</html>
运行结果:
fn:length(str):11
fn:length(strings):4
fn:length(list):3
fn:toUpperCase("HHji"):HHJI
fn:contains("helloAr","Ar" ):true
fn:containsIgnoreCase("helloAr","ar" ):true
fn:contains(strings, "world"):false
fn:contains(list, "hello"):true
fn:startsWith("abcde","ab" ):true
fn:indexOf("hello","e" ):1
fn:join(strings, "-"):hello-world-你好-世界
fn:replace(str, "o", "q"):hellq wqrld
fn:split(str, " "):[Ljava.lang.String;@7940e5dd
fn:substring("hello world",1 ,3 ):el
fn:substring("hello world",1,-1 ):ello world
fn:substringAfter("hello world"," " ):world
fn:substringBefore("hello world"," " ):hello
fn:trim(" hello world "):hello world
fn:escapeXml("字体"):<font color=red>字体</font>
字体:字体