JSP战力倍增器----JSTL详解

上一篇,我们学了EL表达式的使用,我们将其称为简化JSP页面的屠龙宝刀,今天我们就来学下’倚天剑’----JSTL。

资源分配图

1.JSTL的概念

​JSTL(Java Server Pages Standard Tag Library),即JSP标准标签库,是由Sun公司制定的一套标签标准,为开发者提供更加方便、有效的标签,以减少JSP开发的难度。

​JSTL虽然被称作标准标签库,实际上由5个不同功能的标签库共同组成,如下所示:

资源分配图

​其中的每个标签库的具体功能如下:

  • Core:核心标签库,包含了实现Web应用中通用操作的标签;
  • I18N:国际化/格式化标签库,它包含实现Web应用程序的国际化标签和格式化标签;
  • SQL:数据库标签库,它包含了用于访问数据库和对数据库中的数据进行操作的标签;
  • XML:操作XML文档的标签库,它包含对XML文档中的数据进行操作的标签;
  • Functions:函数标签库,它提供了一套自定义EL函数,包含了JSP网页制作用到的字符串操作。

​对于以上五个标签库,因为MVC设计模式,其中的SQL、XML、Functions中标签所实现的功能,我们会将对应的操作放在服务端来实现,I18N我们也很难用得到。因此,JSTL中对我们而言,最重要的也就是Core标签库,下面我们来一起学习下。

2.JSTL的使用

​相比于EL表达式,JSTL在使用上稍微麻烦些,主要有如下步骤。

2.1 下载JSTL包

​我们要使用JSTL,需要依赖两个jar包,下载方式主要有如下两种。

​官网下载,下载地址为:http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/,选择最新的版本的压缩包下载即可。

​maven仓库下载,下载地址分别为:https://repo1.maven.org/maven2/javax/servlet/jsp/jstl/jstl/1.2/

​ https://mvnrepository.com/artifact/taglibs/standard/1.1.2

​下载完成后,可以得到jstl.jar、standard.jar,其中jstl.jar中包含JSTL规范中定义的接口和相关类,standard.jar包含用于实现JSTL的实现类和JSTL五个标签库的描述符文件(TLD)。

2.2 导入JAR包

​将上面下载的两个jar包复制到Web-Inf下的lib目录下,并右击build path。

资源分配图

2.3 JSTL初体验

​以上就是所有的准备工作,下面我们通过一个简单的页面来试一下JSTL的功能。

​需要注意的是,在使用JSTL时,页面上需要使用taglib指令导入Core标签库,语法如下:

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

​下面,我们通过一个简单的页面来展示JSTL的使用,页面代码如下:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<c:out value="你好,欢迎使用JSTL标签库" />
</body>
</html>

​页面效果和out.println("你好,欢迎使用JSTL标签库")相同,运行效果如下图所示:

资源分配图

3.Core标签库中常用的标签

​在MVC之前,JSP文件是一个独立、能自主完成所有任务的模块,因此JSTL提供的强大、便捷的标签库便是节约成本、简化JSP开发的无上利器。

​因为MVC的设计理念,JSP承担的功能比较明确,JSP中的许多的功能被放在Controller、和Model中,因此JSTL中的许多标签就没了用武之地。我们在本文中,也仅仅介绍一些到现在仍有较强生命力的一些标签,这些标签仍然可以给我们的开发工作带来很大的便捷。

3.1 <c:if>标签

​在程序开发中,经常需要使用if语句进行条件判断,从<c:if>标签的名字,我们就可以猜到,此标签的可以在JSP页面中进行条件判断。<c:if>标签有两种语法,具体如下:

​语法1:没有标签体的情况

<c:if test="testCondition" var="result" [scope="{page|request|session|application}"]/>

​语法2:有标签体的情况

<c:if test="testCondition" var="result" [scope="{page|request|session|application}"]>
  dody content
</c:if>

​其中,test属性用与设置逻辑表达式,即需要进行的判断条件;var属性用与指定逻辑表达式中变量的名字;scope属性用与指定var设定的变量的作用范围(JSP四大域对象)。如果test计算的结果为true,那么标签体才会被执行,否则标签中的内容不会被执行。

​下面,我们通过一个例子,来演示下<c:if>标签的使用,示例代码如下:

<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8" import="java.util.*"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head></head>
<body>
	<h1>param.role: ${param.role }</h1>
	<c:if test="${ param.role == 'admin' }">
		<h1>This is admin page!</h1>
	</c:if>
	<c:if test="${ param.role eq 'user' }">
		<h1>This is user page!</h1>
	</c:if>
	<c:if test="${ empty param.role }">
		<h1>非法用户!</h1>
	</c:if>
</body>
</html>

​其中的${param.role }是通过EL表达式获取url中的参数,页面运行效果如下所示:

资源分配图
资源分配图

​当在url中输入role=admin后,可以看到,页面中输出了<h1>This is admin page!</h1>,和我们预计相符。同理,url中输入role=user后,页面中会输出<h1>This is user page!</h1>

3.2 <c:choose>标签

​看完上面的<c:if>标签,是不是会疑惑,如果我想在if后面接elseelse if,那要怎么处理呢?为了实现你的需求,Core标签库提供了<c:choose>标签,该标签可以指定多个条件的组合边界。

<c:choose>标签没有属性,在他的标签体中,只能和一个或多个<c:when>、零个或一个<c:otherwise>一起配套使用。其语法类似于if-else if-...-else

<c:choose><c:when><c:otherwise>配合使用的语法如下:

<c:choose>
  Body Content(when、otherwise、other label)
  <c:when test="testCondition">
  	Body Content
  </c:when>
  ...
  <c:otherwise>
    Body Content
  </c:otherwise>
</c:choose>

​下面,我们通过一个例子,来演示下<c:choose>标签的使用,示例代码如下:

<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8" import="java.util.*"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head></head>
<body>
	<c:choose>
	   <c:when test="${empty param.username}">
 		   unKnown user.
 	   </c:when>
	   <c:when test="${param.username == 'admin'}">
 		   ${ param.username} is admin manager.
 	   </c:when>
	   <c:otherwise>
  		   ${ param.username} is employee.
 	   </c:otherwise>
	</c:choose>
</body>
</html>

​页面运行结果如下图所示:

资源分配图
资源分配图

3.3 <c:forEach>标签

​接下来就是我们今天的重头戏了,也是我个人觉得Core标签库中最重要的一个标签----<c:forEach>。从名字也能看出来,这是JSP页面中用于遍历集合中的元素,就像for循环一样。

<c:forEach>有两种使用方式,一种是迭代对象结合,也是我们java中常用的for(A a : aList),语法如下:

<c:forEach [var="varName"] items="collection" [varStatus="varStatusName"]
           [begin="beginIndex"] [end="endIndex"] [step="step"]>
	body content
</c:forEach>

<c:forEach>的另一种方式,就是迭代指定的范围,类似于java中常用的for(int i=0;i<N;i++),语法如下:

<c:forEach [var="varName"] [varStatus="varStatusName"]
           begin="begin" end="end" [step="step"]>
	body content
</c:forEach>

​在上述语法中,出现的属性的具体含义如下:

  • var属性用于指定将当前迭代的元素保存到page域中的哪个变量中;
  • items属性用与指定将要迭代的结合对象;
  • varStatus属性用与指定当前迭代状态信息(比如index)保存到page域中的名称;
  • begin属性用于指定从集合的第几元素开始进行迭代,默认从0开始;如果是第二种方式,即没有items属性,则从begin指定的值开始迭代;
  • end属性用于指定最后迭代结束的值;
  • step属性用与指定迭代的步长。

​而且,<c:forEach>可以和EL表达式结合在一起使用,当我们需要在页面上展示列表数据时,就可以非常方便的实现。下面,我们通过一个例子来演示下,示例代码如下:

<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8" import="java.util.*"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head></head>
<body style="text-align: center;">
	<%
  	//构造List,添加测试数据
		List userList = new ArrayList();
		userList.add("lizishu");
		userList.add("admin");
		userList.add("user");
	%>
	<table border="1">
		<tr>
			<td>序号</td>
			<td>索引</td>
			<td>是否为第一个元素</td>
			<td>是否为最后一个元素</td>
			<td>元素的值</td>
		</tr>
		<c:forEach var="name" items="<%=userList%>" varStatus="status">
			<tr>
				<td>${status.count}</td>
				<td>${status.index}</td>
				<td>${status.first}</td>
				<td>${status.last}</td>
				<td>${name}</td>
			</tr>
		</c:forEach>
	</table>
</body>
</html>

​从代码中,我们可以看到,<c:forEach>标签可以用于迭代输出table中的每行数据,并且可以很好的和EL表达式结合,非常方便的完成了数据的列表展示。其中count、index、first、last为varStatus中保存的信息。

​上面页面运行的结果如下图所示:

资源分配图

4.总结

​虽然JSTL标签库中的许多标签因为各种原因,变得不再常用,而EL与JSTL也因为JSP的慢慢的退出核心舞台也没有之前一样耀眼了,但是,在需要的时候,或者说在使用JSP开发前后端不分离的页面时,EL与JSTL一定可以成为你的手中的倚天、屠龙,荡平复杂的数据交互,横扫一切不服之臣。


​又到了分隔线以下,本文到此就结束了,本文内容全部都是由博主自己进行整理并结合自身的理解进行总结,如果有什么错误,还请批评指正。

​Java web这一专栏会是一个系列博客,喜欢的话可以持续关注,如果本文对你有所帮助,还请还请点赞、评论加关注。

​有任何疑问,可以评论区留言。

展开阅读全文
©️2020 CSDN 皮肤主题: 像素格子 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值