JavaWeb学习十一(JSTL标签库)

作者:神秘网友 发布时间:2020-09-09 12:16:40

JavaWeb学习十一(JSTL标签库)

JavaWeb学习十一(JSTL标签库)

1.什么是JSTL

  • JSTL是apache对EL表达式的扩展(也就是说JSTL依赖EL)
  • JSTL是标签语言
  • 与JSP动作标签一样,只不过它不是JSP内置的标签,需要我们自己导包,以及指定标签库
  • 如果你使用MyEclipse开发JavaWeb,那么在把项目发布到Tomcat时,MyEclipse会在lib目录下存放jstl的jar包,所以如果没有使用MyEclipse开发就需要自己来导入这个JSTL的jar包

2.JSTL标签库

  • JSTL一共包含四打标签库
    • core:核心标签库
    • fmt:格式化标签库
    • sql:数据库标签库,过时了
    • xml:xml标签库,过时了

3.使用taglib指令导入标签库

  • 除了JSP动作标签外,使用其他第三方的标签库都需要
    • 导包
    • 在使用百千的JSP页面中使用taglib指令导入标签库

导入JSTL的core标签库

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
  • prefix=”c”:指定标签库的前缀,这个前缀可以随便给值,但大家都会在使用core标签库时指定前缀为c
  • uri=”http://java.sun.com/jstl/core”:指定标签库的uri,他不一定是真实存在的网址,但它可以让JSP找到标签库的描述文件

4.core标签库常用标签

  • core –> c标签

A.<c:out>:输出

  • <c:out value="aaa"></c:out> //输出aaa字符串常量
  • <c:out value="${aaa}"></c:out>//与${aaa}相同
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>    

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body> 
            <%
             request.setAttribute("code","<script>alert('hello wolrd');</script>");
            %>
             <c:out value="${code }"></c:out>

</body>
</html>

页面显示

<script>alert('hello wolrd');</script> 
  • <c:out value="${aaa}" default="xxx"></c:out>//如果${aaa}不存在,就输出xxx字符串
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>    

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body> 
            <%
             request.setAttribute("code","<script>alert('hello wolrd');</script>");
            %>
             <c:out value="${code }" default="xxx"></c:out><br/>
             <c:out value="${aaa }" default="xxx"></c:out>
</body>
</html>

页面显示

<script>alert('hello wolrd');</script>
 xxx 
  • <c:out value="${code }" default="xxx" escapeXml="false"></c:out>//当escapeXml为false是不会转换'<'和'>',这意味着很可能会受到JavaScript攻击
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>    

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body> 
            <%
             request.setAttribute("code","<script>alert('hello wolrd');</script>");
            %>
             <c:out value="${code }" default="xxx" escapeXml="false"></c:out>

</body>
</html>

效果

JavaWeb学习十一(JSTL标签库)

B.<c:set>:设置(创建域的属性)

  • <c:set var="a" value="A">//向pageContext添加一个name为a,值为A的数据
  • <c:set var="a" value="A" scope="session">//向session添加一个name为a,值为A的数据
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>    

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body> 
            <c:set var="aaa" value="AAA"></c:set>
            <c:set var="bbb" value="BBB" scope="session"></c:set>
            <c:set var="code" value="<script>alert('hello world')</script>" scope="request"></c:set>
             <%
              out.print(pageContext.getAttribute("aaa"));
             out.print(session.getAttribute("bbb"));
             out.print(request.getAttribute("code"));
             %>
</body>
</html>

页面显示效果

JavaWeb学习十一(JSTL标签库)

C.<c:remove>:删除域变量

  • var:变量名
  • scope:如果不给出scope,表示删除所有域中的该名称的变量,如果指定了域,那么只删除该域的变量
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>    

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body> 

             <%
               pageContext.setAttribute("a", "aa");
               request.setAttribute("a","aaa");
               session.setAttribute("a","aaaa");
               application.setAttribute("a","aaaaa");
             %>
             <c:remove var="a"/>
             <c:out value="${a}" default="none"></c:out>
</body>
</html>

页面显示效果

none//可见删除了所有域中的名为a的值
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>    

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body> 

             <%
               pageContext.setAttribute("a", "aa");
               request.setAttribute("a","aaa");
               session.setAttribute("a","aaaa");
               application.setAttribute("a","aaaaa");
             %>
             <c:remove var="a" scope="page"/><!--删除了page域中的名为a的值-->
             <c:out value="${a}" default="none"></c:out>
</body>
</html>

页面显示效果

aaa//request域中的值

D.<c:url>:删除域变量

  • url标签会在需要URL重写时添加sessionid
  • value:指定一个路径! 它会在路径前面自动添加项目名
  • <c:url value="/index.jsp"/> 它会输出/项目名/index.jsp
  • 子标签: <c:param> 用来给url后面添加参数,例如:
<c:url value="/index.jsp">
<c:param name="username" value="张三"/> //可以对参数进行url编码
</c:url>
  • 结果为: /项目名/index.jsp?username=xxxxx…..
  • var:指定变量名,一旦添加了这个属性 那么url标签就不会再输出到页面 而是把生成url保存到域中
  • scope:它与var一起使用 用来保存url
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>    

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>  
           <c:url value="/AServlet"></c:url><br/>
           ${pageContext.request.contextPath }/AServlet<br/>
           <a href="<c:url value='/index.jsp'/>">点击,返回主页</a><br/>
            <c:url value="/AServlet" var="a" scope="request"></c:url>
            <c:out value="${a }"></c:out><br/>
            <c:url value="/index.jsp">
            <c:param name="name" value="张三"></c:param>
            </c:url>
</body>
</html>

页面显示效果

/javaweb10/AServlet
 /javaweb10/AServlet
点击,返回主页
/javaweb10/AServlet
 /javaweb10/index.jsp?name=%e5%bc%a0%e4%b8%89 

E.<c:if>

  • if标签的test属性必须是一个boolean类型的值,如果test的值为true,那么执行if标签的内容,否则不执行
  • param表示单值参数
  • paramValues表示多值参数
  <c:if test="布尔类型">...</c:if> 当test为值时 执行标签体内容

F.<c:choose>

  • choose标签对应Java中的if/else if/else 结构
  • when标签的test为true时,会执行这个when的内容
  • 当所有when标签的test都为false时,才会执行otherwise标签的内容
  • param表示单值参数
  • paramValues表示多值参数
 <c:choose>
                              <c:when test="">...</c:when>
                          <c:when test="">...</c:when> 
                              <c:when test="">...</c:when>
                              ...
                               <c:otherwise>...</c:otherwise>
                      </c:choose>
                      等同于
                       if(...){
                        }else if(...){
                        }else if(...){
                        }else if(...){
                        }...
                        else{...}
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>    

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>  
           <c:if test="${empty param.name}">
                   你没有给出名为name的参数
           </c:if>
           <c:choose>
                <c:when test="${empty param.name }">
                              你没有给出名为name的参数
                </c:when>
                <c:otherwise>
                                   谁让你给出name的参数
                </c:otherwise>
           </c:choose>
</body>
</html>

JavaWeb学习十一(JSTL标签库)
JavaWeb学习十一(JSTL标签库)

G.<c:forEach>

  • 它用来循环遍历数组,集合!
  • 还可以用来计数方式来循环!
    比如计数方式:
for(int i=1;i<=10;i++){
   ...
}
<c:forEach var="i" begin="1" end="10">
      ${i}
</c:forEach>
  • var:循环变量
  • begin:设置循环变量从几开始
  • end:设置循环变量到几结束
  • step:设置步长!等同与 java中的i++ 或i+=2 step默认为1
用来输出数组 集合
                     <c:forEach items="${strs}" var="str">
                             ${str}
                      </c:forEach>
 等同于
for(String str:strs){
}
  • items:指定要循环谁,它可以是一个数组或一个集合
  • var:把数组或集合中的每个元素赋值给var指定的变量
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>    

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>  
        <%
         String [] strs={"one","two"};
        request.setAttribute("strs",strs);

        %>
        <c:forEach items="${strs }" var="str">
                ${str}<br/>
        </c:forEach>
        <c:forEach items="${strs } " var="str"><!-- 此处不能有空格,对比上面和下面吧 -->
                ${str}<br/>
        </c:forEach>
</body>
</html>

页面显示效果

one
two
[Ljava.lang.String;@905722e //上面空格造成的
  • 循环状态
    • 可以使用varStatus来创建循环状态变量!
    • 循环状态变量有如下属性:
      • count:循环元素的个数
      • index:循环元素的下标
      • first:是否为第一个元素
      • last:是否为最后一个元素
      • current:当前元素
<%@page import="java.util.ArrayList"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>    

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>  
             <%
              ArrayList<String> list=new ArrayList<String>();
              list.add("一");
              list.add("二");
              list.add("三");
              pageContext.setAttribute("list",list);
             %>

             <c:forEach  items="${list }" var="lis" varStatus="vs">
                        ${vs.count } ${vs.index} ${vs.first} ${vs.last} ${vs.current }<br/>
             </c:forEach>
</body>
</html>

页面显示效果

1 0 true false 一
2 1 false false 二
3 2 false true 三

5.fmt标签库常用标签

先导入fmt标签库

<%@ taglib prefix="fmt"  uri="http://java.sun.com/jsp/jstl/fmt" %>  
  • 它是格式化库
  • 格式日期
<fmt:formatDate value="" pattern="">
  • value:指定一个Date类型的变量
  • pattern:用来指定输出的模板! 例如: yyyy-MM-dd HH:mm:ss
<%@page import="java.util.Date"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>  
<%@ taglib prefix="fmt"  uri="http://java.sun.com/jsp/jstl/fmt" %>  

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>  
             <%
              Date date=new Date();
              request.setAttribute("date",date);
             %>

            <fmt:formatDate value="${requestScope.date }" pattern="yyyy:MM:dd HH:mm:ss"/>
</body>
</html>

页面显示效果

2017:05:18 14:59:46 
  • 格式化数字1
<fmt:formatNumber value="${num1}" pattern="0.00">//保留小数点后2位,它会四舍五入,如果不足2位,以0补齐
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>  
<%@ taglib prefix="fmt"  uri="http://java.sun.com/jsp/jstl/fmt" %>  

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>  
             <%
              request.setAttribute("num1",3.14159265);
             request.setAttribute("num2",3.1);
             %>

            <fmt:formatNumber value="${requestScope.num1}" pattern="0.00"/><br/>
                  <fmt:formatNumber value="${requestScope.num2}" pattern="0.00"/>
</body>
</html>

页面显示效果

3.14
3.10 
  • 格式化数字2
 <fmt:formatNumber value="${num1}" pattern="#.##">//保留小数点后2位 它会四舍五入 如果不足2位 不会补齐
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>  
<%@ taglib prefix="fmt"  uri="http://java.sun.com/jsp/jstl/fmt" %>  

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>  
             <%
              request.setAttribute("num1",3.14159265);
             request.setAttribute("num2",3.1);
             %>

            <fmt:formatNumber value="${requestScope.num1}" pattern="#.##"/><br/>
                  <fmt:formatNumber value="${requestScope.num2}" pattern="#.##"/>
</body>
</html>

页面显示

3.14
3.1 

JavaWeb学习十一(JSTL标签库)相关教程

  1. Dubbo(十一)源码分析(Dubbo 与 Spring 整合、重要接口介绍)
  2. 数据结构与算法学习笔记——插入排序、希尔排序
  3. 学习Python心得第二章
  4. django学习路程-2
  5. M5Stack(ESP32)学习笔记(3)—— microSD
  6. Extjs6 --- 学习笔记(1)创建一个新项目
  7. 迁移学习算法之TrAdaBoost
  8. Day01JavaWeb【Tomcat服务器Servlet入门】idea与tomcat