尽管jsp标准动作和EL语言减少了在jsp页面中的java代码片段和表达式,但是依然仍需要解决如下问题:
- 创建自己的动作
- 尽量避免在JSP中编码脚本
- 将页面设计与Java编码工作分离
如何解决这些问题呢?
1.使用标准的定制化标签库,直接使用Java EE提供的JSTL标签。
2.自己编写定制化标签处理器,使用自己编写的标签。
接下来介绍一下JSTL。
1. 什么是JSTL
JSTL ( JSP Standard Tag Library )是JSP标准标签库, 它是Java中的一个定制标记库集,封装了JSP应用的通用核心功能。JSTL支持通用的、结构化的任务,比如迭代,条件判断,XML文档操作,国际化标签,SQL标签。 除了这些,它还提供了一个框架来使用集成JSTL的自定义标签。
2. JSTL简单实例
通过判断登录页面的用户的 “role” 属性,判断用户的role属性,如果role是user,就显示“欢迎用户”;如果role是admin,则显示欢迎管理员。
首先看传统的jsp语法
1 | <% |
使用JSTL语法之后,代码明减少很多。
1 | <c:if test="${param.role eq 'user' }"> |
3. 使用JSTL
3.1 搭建STL开发环境
从Apache的标准标签库中下载的二进包(jakarta-taglibs-standard-current.zip)
将jakarta-taglibs-standard-1.1.2/lib/下的两个jar文件:standard.jar和jstl.jar文件拷贝到web项目的/WEB-INF/lib/下。
选中上面两个jar包,右键选择Build Path中的Add to Build Path,就会在Java源代码中的类库中出现这两个jar。
接下来就可以开始使用JSTL的tag了, 要使用JSTL库,要在每一个JSP的顶部包括一个<taglib>
指令。
1 | <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> |
3.2 JSTL标签
根据JSTL标签所提供的功能,可以将其分为5个类别:
1)核心标签(最常用、最重要,也是最基本的标签)
2)格式化标签
3)SQL标签
4)XML标签
5)JSTL函数(很常用)
常见的核心标签如下:
标签 | 描述 |
---|---|
<c:out> |
用于在JSP中显示数据,就像<%= … > |
<c:set> |
用于保存数据 |
<c:remove> |
用于删除数据 |
<c:catch> |
用来处理产生错误的异常状况,并且将错误信息储存起来 |
<c:if> |
与我们在一般程序中用的if一样 |
<c:choose> |
本身只当做<c:when> 和<c:otherwise> 的父标签 |
<c:when> |
<c:choose> 的子标签,用来判断条件是否成立 |
<c:otherwise> |
<c:choose> 的子标签,接在<c:when> 标签后,当<c:when> 标签判断为false时被执行 |
<c:import> |
检索一个绝对或相对 URL,然后将其内容暴露给页面 |
<c:forEach> |
基础迭代标签,接受多种集合类型 |
<c:forTokens> |
根据指定的分隔符来分隔内容并迭代输出 |
<c:param> |
用来给包含或重定向的页面传递参数 |
<c:redirect> |
重定向至一个新的URL. |
<c:url> |
使用可选的查询参数来创造一个URL |
一些常见标签的使用如下:
1)<c:forEach>
标签
在一个集合上迭代,每次对应一个集合元素。
把集合中的每个元素赋予用var属性定义的变量。

使用varStatus属性
varStatus属性创建了一个新变量,它是一个javax.servlet.jsp.jstl.core.LoopTagStatus对象。
LoopTagStatus类有一个count成员变量,作用是给出当前迭代记数值

<c:if>
标签
设定条件,按照test属性的值是否为true有条件地执行标签体。
1 | <c:if test="${param.role eq 'user' }"> |
2) <c:choose>
标签
<c:choose>
和<c:when><c:otherwise>一
一起组 成if…else if…else结构

3) <c:set>
标签
设置bean property、Map、属性变量的值.
有var属性的标签
1 | <c:set var="sessionList" scope="session" value="${sessionList}, ${param.color}"></c:set> |
var:定义一个变量,如果在指定的作用域中没有指定的属性, 则创建一个假设 value属性不为空)。
scope:可选属性,设定变 量的范围,缺省值为page作用域。
value里面的对象可以在后面直接拿出来用但是要使用EL表达式语法。
4)<c:import>
标签
动态的跳转到另一界面,在请求的时候,从URL属性指定的资源向当前页面添加内容。与相似<jsp:include>
,但是更加强大和灵活,URL可 以来自容器外部,例如链接到百度的网址。
1 | <c:import url="https://www.baidu.com/" /> |