1. JSTL 概述

  • JSTL 是 apache 对 EL 表达式的扩展, JSTL 是标签语言!
  • 需要导入 jstl-1.2.jar

2. JSTL 标签库

  • core: 核心标签库;
  • fmt: 格式化标签库, 只需要学习两个标签即可: 日期, 数字;
  • sql: 已过时;
  • xml: 已过时.
  1. // 导入 JSTL 的 core 标签库
  2. <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
  3. // prefix="c", 一般在使用 core 标签库时, 指定前缀为 c;
  4. // uri="http://java.sun.com/jsp/jstl/core", 指定标签库的 url, 它不一定是真实存在的网址;
  5. // 但是它可以让 jsp 找到标签库的描述文件.

3. core 标签库

1. <c:out> 输出
  • <c:out value="aaa" default="bbb" escapeXml="<true|false>"/>
  • value: 可以是字符串常量, 也可以是 EL 表达式, 即 value="${aaa}", 相当于全域查找 aaa 属性;
  • default: 输出的默认值.
  • escapeXml: 是否忽略 XML 特殊字符, 默认为 true, 表示转义!
2. <c:set> 设置(创建域的属性)
  • <c:set var="a" value="hello" scope="session"/> 表示在 session域中添加name为 a, value 为 hello 的数据;
  • <c:set var="a" value="hello"/> 表示在 pageContext 中添加 name 为 a, value 为 hello 的数据;
  • scope: 表示域, 默认为 pageContext, 可选值为: pageContext, request, session, application
3. <c:remove> 删除
  1. // 删除所有域中 name 为 a 的数据
  2. <%
  3. pageContext.setAttribute("a","pageContext");
  4. request.setAttribute("a","request");
  5. session.setAttribute("a","session");
  6. application.setAttribute("a","application");
  7. %>
  8. // 如果不给出 scope, 表示删除所有域中该名称的值
  9. <c:remove var="a"/> 或者 <c:out value="${a}" default="none"/>
  10. // 删除 pageContext 中 name 为 a 的数据
  11. <c:remove var="a" scope="page"/>
4. <c:url>
  1. // 输出上下文路径: /day11_1/
  2. <c:url value="/"/>
  3. // 把本该输出的结果赋给变量a, 范围为 request 域
  4. <c:url value="/" var="a" scope="request"/>
  5. // 输出: /day11_1/AServlet
  6. <c:url value="/AServlet"/>
  7. // 输出: /day11_1/AServlet?username=abc&password=123
  8. // 如果参数中包含中文, 那么会自动使用 URL 编码
  9. <c:url value="/AServlet">
  10. <c:param name="username" value="abc"/>
  11. <c:param name="password" value="123"/>
  12. </c:url>
5. <c:if>
  1. // if 标签的 test 属性必须是一个 boolean 类型的值, 对应 java 中的 if 语句
  2. <c:set var="a" value="hello"/>
  3. <c:if test="${not empty a}">
  4. <c:out value="${a }"/>
  5. </c:if>
6. <c:choose>
  1. // choose 对应 java 中的 if/else 结构. 当 when 标签的 test 为 true 时, 会执行这个 when 的内容.
  2. <c:set var="score" value="${param.score }" />
  3. <c:choose>
  4. <c:when test="${score > 100 || score <0}"> 错误的分数: ${score}</c:when>
  5. <c:when test="${score >= 90}">A级</c:when>
  6. <c:when test="${score >= 80}">B级</c:when>
  7. <c:when test="${score >= 70}">C级</c:when>
  8. <c:when test="${score >= 60}">D级</c:when>
  9. <c:otherwise>E级</c:otherwise>
  10. </c:choose>
7. <c:forEach>
  • 它用来循环遍历数组(或集合),还可以用计数的方式来循环!
  1. // 计数的方式来循环
  2. for(int i = 1; i<=10; i++){
  3. ....
  4. }
  5. <c:forEach var="i" begin="1" end="10">
  6. ${i}
  7. </c:forEach>
  8. // 用来输出域中的数组或集合
  9. // items: 指定要循环谁, 它可以是一个数组或一个集合
  10. // var: 把数组或集合中的每个元素赋值给 var 指定的变量
  11. <c:forEach items="${strs }" var="str">
  12. ${str }<br/>
  13. </c:forEach>
  14. 等同于增强 for 循环:
  15. for(String str : strs){
  16. ...
  17. }
  18. // forEach 标签还有一个属性: varStatus, 这个属性用来指定接收"循环状态" 的变量名.
  19. // count: int 类型, 表示当前已遍历元素的个数
  20. // index: int 类型, 表示当前元素的下标;
  21. // first: boolean 类型, 表示是否为第一个元素
  22. // last: boolean 类型, 表示是否为最后一个元素
  23. // current: Object 类型, 表示当前项目
  24. <c:forEach var="item" items="${ns }" varStatus="vs">
  25. <c:if test="${vs.first }">第一行</c:if>
  26. <c:if test="${vs.last }">最后一行</c:if>
  27. <c:out value="name: ${vs.current }"/>
  28. </c:forEach>

4. fmt 标签

  • fmt 标签库是用来格式化输出的, 通常需要格式化的有时间和数字.
  1. // 格式化时间
  2. <%@ taglib="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
  3. <%
  4. Date date = new Date();
  5. pageContext.setAttribute("d",date);
  6. %>
  7. <fmt:formatDate value="${d }" pattern="yyyy-MM-dd HH:mm:ss"/>
  8. // value: 指定一个 Date 类型的变量
  9. // pattern: 用来指定输出的模板!
  10. // 格式化数字
  11. <fmt:formatNumber value="${d1 }" pattern="0.00"/>
  12. // 保留小数点后两位, 它会四舍五入!! 如果不足两位, 以 0 补位
  13. <fmt:formatNumber value="${d2 }" pattern="#.##"/>
  14. // 保留小数点后两位, 它会四舍五入!! 如果不足两位, 不补位.

5. 自定义标签

5.1. 步骤:
  • 定义标签处理类(标签也是一个对象, 因此就需要先有类!); 必须是 Tag 或 SimpleTag 的实现类.
  • 创建 tld 文件, 其实它是一个 xml 文件;
  • 页面中使用 <%@ taglib> 来指定 tld 文件的位置;
5.2. SimpleTag
  1. 位于 j2EE 中的 javax.servlet.jsp.tagext 包;
  2. SimpleTag 接口的父类为 JspTag;
  3. simpleTag 接口中的方法:
    • void doTag() : 每次执行标签时都会调用这个方法;
    • JspTag getParent(); : 返回父标签(非生命周期方法), 较少使用;
    • void setParent(JspTag tag); : 设置父标签;
    • void setJspBody(JspFragment fragment); : 设置标签体;
    • void setJspContext(JspContext pc);: 设置 jsp 上下文对象, JspContext的子类是 pageContext;
    • 其中, doTag() 方法会在三个 set 方法之后被 tomcat调用, 所以 doTag() 中可以使用tomcat传递过来的参数.
5.3. 配置 tld 文件
  • tld 文件一般都放到 WEB-INF 目录下,这样可以保证客户端访问不到!!
  1. <tag>
  2. <name>myTag</name> // 指定当前标签的名称
  3. <tag-class>cn.itcast.tag.MyTag</tag-class> // 指定当前标签的标签处理类
  4. <body-content>empty</body-content> //指定标签体的类型, 这里使用的是空标签, 例如html中的<br/>
  5. </tag>
5.4. 页面中指定 tld 文件位置
  • <%@ taglib prefix="it" uri="/WEB-INF/tlds/itcast-tag.tld" %>
5.5. SimpleTagSupport 类
  • SimpleTagSupport 类实现了 simpleTag 接口, 我们只需要重写 doTag() 方法即可.
  • 该类已经把 tomcat 传递过来的所有参数都保存起来了, 而且还提供了 get 方法供子类调用.

6. 有标签体的标签

  1. <body-content> 元素的可选值:

    • empty: 无标签体, 例如 html 中的
    • JSP : jsp 2.0 已经不再支持这个类型.
    • scriptless: 标签内容只能是 EL 表达式, 也可以是其他的标签;
    • tagdependent: 标签体内容不会被执行, 而是直接赋值给标签处理类. (很少使用)
  1. // 标签处理类
  2. public class MyTag3 extends SimpleTagSupport{
  3. // 复写 doTag() 方法
  4. public void doTag() throws JspException, IOException{
  5. // 获取输出流
  6. Writer out = this.getJspContext().getOut();
  7. out.write("*******************<br/>"); // 页面中输出一排星号
  8. // 执行标签体内容, 把结果写到指定的流中, 即页面上
  9. // this.getJspBody().invoke(null); 如果传递的输出流为 null, 表示使用的就是当前页面的 out!
  10. this.getJspBody().invoke(out);
  11. }
  12. }
  13. // 配置 tld 文件
  14. <tag>
  15. <name>myTag3</name>
  16. <tag-class>cn.itcast.tags.MyTag3</tag-class>
  17. <body-content>scriptless</body-content>
  18. </tag>
  19. // jsp 页面
  20. <%
  21. request.setAttribute("xxx","张三");
  22. %>
  23. <it:myTag3>
  24. ${xxx } // 标签体内容为 EL 表达式
  25. </it:myTag3>

7. 不执行标签下面的页面内容

  • 如果希望执行了自定义标签后, 不再执行 JSP 页面下面的东西, 那么就需要在 doTag() 方法中使用 SkipPageException.
  • Tomcat 会调用标签处理类的 doTag() 方法, 然后 Tomcat 会得到 SkipPageException, 它会跳过本页面其他内容.
  1. // 标签处理类:
  2. public class SkipTag extends SimpleTagSupport{
  3. // 复写 doTag() 方法
  4. public void doTag() throws JspException, IOException{
  5. this.getJspContext().getOut().print("<h1>只能看到我</h1>");
  6. throw new SkipPageException();
  7. }
  8. }
  9. // 配置 tld 文件
  10. <tag>
  11. <name>skip</name>
  12. <tag-class>cn.itcast.tags.SkipTag</tag-class>
  13. <body-content>empty</body-content>
  14. </tag>
  15. // jsp 页面
  16. <itcast:skip/>
  17. <h1>看不见我!</h1>

8. 带有属性的标签

  1. 给标签处理类添加属性

    • 为标签处理类添加属性, 属性至少有一个 set 方法, 这个 set 方法会在 doTag() 之前被 tomcat 执行! 所以

      doTag() 方法中就可以使用属性了.
  2. 在 tld 文件中对属性进行配置
  1. <tag>
  2. <name>myTag4</name>
  3. <tag-class>cn.itcast.tag.MyTag4</tag-class>
  4. <body-content>scriptless</body-content>
  5. <attribute>
  6. <name>test</name> // 指定属性名
  7. <required>true</required> // 指定属性是否为必需的
  8. <rtexprvalue>true</rtexprvalue> // 指定属性是否可以使用 el 表达式.
  9. // rt(runtime) expr(express)value
  10. </attribute>
  11. </tag>

参考资料:

JSTL 标签库的更多相关文章

  1. 重温JSP学习笔记--JSTL标签库

    以前写jsp的时候对jstl标签库是有些抵触的,因为我觉得嵌入java代码的方式几乎无往不利,没有必要使用标签库,不过这次复习还是好好地学习了一下,发现这个还是很有用处的,用得好能省不少事,JSTL是 ...

  2. 简单实用JSTL标签库

    1. JSTL标签库是一个什么东东? 简单来说,有了它你就可以在类似HTML的JSP页面里面运用一些高级语法,实现迭代.条件判断.XML文档操作.国际化标签.SQL标签. 2. 如何使用 ? 参考网址 ...

  3. JSTL标签库之核心标签

    一.JSTL标签库介绍 JSTL标签库的使用是为弥补html标签的不足,规范自定义标签的使用而诞生的.使用JSLT标签的目的就是不希望在jsp页面中出现java逻辑代码 二.JSTL标签库的分类 核心 ...

  4. 自定义jstl标签库

    开发环境:Spring+SpringMVC +Maven +Mybatis JSTL 标签库的配置: 导入对应的 jstl.jar 和 standard.jar ,我使用的配置如下: <prop ...

  5. JavaWeb学习之JSP常用标签、EL表达式的运算符、JSTL标签库(6)

    1.JSP常用标签 * 只要支持JSP文件,常用标签有可以直接使用 * 格式: jsp:xxxx * jsp:forward ,完成jsp页面的转发 * page属性:转发的地址 <% requ ...

  6. JSTL标签库中<c:choose></c:choose>不能放JSP页面<!-- -->注释

    笔者最近在使用JSTL标签库的<c:choose>标签时候,发现在该标签体中加了JSP的<!-- -->注释时,总是会显示报错信息.错误的信息如下: <span styl ...

  7. jsp学习---mvc模式介绍和el表达式,jstl标签库的使用入门

    一.mvc模式介绍 下图是常用的mvc分层模式: 项目中的包命名规则,一般如下: com.amos.domain 封装JavaBean,一般我喜欢用model命名这个包com.amos.dao 封装d ...

  8. jstl标签库基础教程及其使用代码(一)。

    概述 在 JSP 页面中,使用标签库代替传统的 Java 片段语言来实现页面的显示逻辑已经不是新技术了,然而,由自定义标签很容易造成重复定义和非标准的实现.鉴于此,出现了 JSTL ( JSP Sta ...

  9. Struts、JSTL标签库的基本使用方法

    一 使用Struts标签之前需要经过下面3个步骤的配置. 1.导入TLD文件. 2.在web.xml中注册标签库. 3.在页面中引入标签库. 下面详细介绍以上步骤. 1 导入TLD文件. TLD文件是 ...

  10. jstl标签库基础教程及其使用代码

    概述 在 JSP 页面中,使用标签库代替传统的 Java 片段语言来实现页面的显示逻辑已经不是新技术了,然而,由自定义标签很容易造成重复定义和非标准的实现.鉴于此,出现了 JSTL ( JSP Sta ...

随机推荐

  1. 循环List<Object>

    List<Object> infoData=ArrayList<>(); for (int i = 0; i < infoData.size(); i++) { Obje ...

  2. Docker 基础概念科普 和 常用操作介绍

    Docker 基础概念 Docker是什么?         Docker的思想来自于集装箱,集装箱解决了:在一艘大船上,可以把货物规整的摆放起来.并且各种各样的货物被集装箱标准化了,集装箱和集装箱之 ...

  3. ScrollView嵌套ListView冲突问题的最优解决方式

    项目做多了之后.会发现事实上ScrollView嵌套ListVew或者GridView等非经常常使用,可是你也会发现各种奇怪问题产生.依据个人经验如今列出常见问题以及代码最少最简单的解决方法. 问题一 ...

  4. Android - 返回上一个界面finish()方法

    返回上一个界面finish()方法 本文地址: http://blog.csdn.net/caroline_wendy Android能够使用finish()方法,实现函数返回的功能.当不是Activ ...

  5. nodejs 命令行交互

    人机交互 function readSyncByfs(tips) { tips = tips || '> '; process.stdout.write(tips); process.stdin ...

  6. Web服务器性能/压力测试工具http_load、webbench、ab、Siege、loadrunner

    回头看看 Web服务器性能/压力测试工具http_load.webbench.ab.Siege.loadrunner

  7. 移动端数据库新王者:realm

    介绍 realm是一个跨平台移动数据库引擎,支持iOS.OS X(Objective-C和Swift)以及Android. 2014年7月发布.由YCombinator孵化的创业团队历时几年打造,是第 ...

  8. c++ why can't class template hide its implementation in cpp file?

    类似的问题还有: why can't class template use Handle Class Pattern to hide its implementation? || why there ...

  9. 敏捷开发 scrum管理

    项目准备阶段 1.产品经理将整体项目拆分成不同的单独模块,每个模块尽量细化到能够自成一体.例如app的登录注册模块,不能仅仅就是登录注册这两个界面,而是要将所有与这有关的需求整合到一块.要达到的效果就 ...

  10. iOS开发UITableViewCell的选中时的颜色设置(转)

    iOS开发UITableViewCell的选中时的颜色设置   1.系统默认的颜色设置 //无色 cell.selectionStyle = UITableViewCellSelectionStyle ...