EL&JSTL-------JSTL
JSTL标签库的使用是为类弥补html表的不足,规范自定义标签的使用而诞生的。在告别modle 1 模式开发应用程序后,人们开始注重软件的分层设计,不希望在jsp页面中出现java逻辑代码,同时也由于自定义标签的开发难度较大和不利于技术标准化产生了自定义标签库。
JSTL(JSP StandardTag Library,JSP标准标签库)是一个不断完善的开放源代码的JSP标签库,是由apache的jakarta小组来维护的。JSTL只能运行在支持JSP 1.2和Servlet 2.3规范的及其以上容器上,如tomcat 7.x。在JSP2.0中也是作为标准支持的。可以应用于各种领域,如:基本输入输出、流程控制、循环、XML文件剖析、数据库查询及国际化和文字格式标准化的应用等。
JSTL所提供的标签函数库主要分为五大类:
(1)核心标签库(Core tag library)
(2)I18N格式标签库(I18N-capable formatting tag library)
(3)SQL标签库(SQL tag library)
(4)XML标签库(XML tag library)
(5)函数标签库(Functions tag library)
下面对JSTL的各个标签库进行简单的介绍:
(1)核心标签库中包含了实现WEB应用中的通用操作发标签。例如,用于输入一个变量内容的<c:out>标签、用于条件判断的<c:if>标签、用于迭代循环的<c:forEach>标签。
(2)国际化/格式化标签库中包含实现WEB应用程序的国际化的标签。例如,设置JSP页面的本地信息、设置JSP页面的时区、绑定资源文件,使本地敏感的数据(例如数值、日期等)按照JSP页面中设置的本地格式显示。
(3)数据库标签库中包含用于访问数据库和对数据库中的数据进行操作的标签。例如,从数据源中获得数据库连接、从数据库表中检索数据等。由于在软件分层的开发模型中,JSP页面仅用作表现层,我们一般不在JSP页面中直接操作数据库,而是在业务逻辑层或数据访问层操作数据库,所以,JSTL中提供的这套数据库标签库没有多大的实用价值。
(4)XML标签库中包含对XML文档中的数据进行操作的标签。例如,解析XML文档、输出XML文档中的内容,以及迭代处理XML文档中的元素。因为XML广泛应用与WEB开发,对XML文档的处理非常重要,XML标签库使处理XML文档变得简单方便,这也是JSTL的一个重要特征。
(5)JSTL中提供的一套EL自定义函数包含了JSP页面制作者通常要用到的字符串操作。例如,提取字符串中的子字符串、获取字符串的长度和处理字符串中的空格等。
JSTL的使用
如果我们要在程序中使用这些标签,首先我们要引入jar,这里我们要引入两个jar
taglibs-standard-spec-1.2.5.jar(相当于之前的jstl.jar,属于接口定义类)
taglibs-standard-impl-1.2.5.jar(相当于之前的standard.jar,属于实现类)
然后将这两个jar放入到WEB-INF下的lib文件夹中。然后在我们的jsp页面上要引入
jar包的准备
在apache-tomcat-8.0.30-windows-x64\apache-tomcat-8.0.30\webapps\examples\WEB-INF\lib中可以找到
在jsp页面引入jstl标签库
<%@ taglib url="http://java.sun.com/jsp/jstl/core" prefix="c"%>
JSTL核心标签库
JSTL的核心标签库标签共13个,从功能上可以分为4类:表达式控制标签、流程控制标签、循环标签、URL操作标签。使用这些标签能够完成JSP页面的基本功能,减少编码工作。
(1)表达式控制标签:out标签、set标签、remove标签、otherwise标签
(2)流程控制标签:if标签、choose标签、when标签、otherwise标签
(3)循环标签:forEach标签、forTokens标签
(4)URL操作标签:import标签、url标签、redirect标签
示例:
<%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2018/7/14
Time: 10:41
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>首页</title>
</head>
<body>
<c:out value="hell jstl"></c:out>
</body>
</html>
其它标签的具体用法可在http://www.runoob.com/jsp/jsp-jstl.html这个网址中查看。
选择标签
<c:if>标签:同程序中的if作用相同,用来实现条件控制
用于复杂判断的<c:choose><c:when><c:otherwise>类似于“if elseif else”
- <c:choose>标签没有属性,类似于父标签<c:when><c:otherwise>类似于子标签
- <c:when>标签等价与if语句,有一个test属性,该属性表示需要判断的条件
- <c:otherwise>标签等价于else,没有属性
<c:if>没有对应的else,所以<c:choose>一列的可以完成if else的控制系
循环标签
<c:forEach>标签使用进行循环的控制标签
格式化标签
时间格式化:
<% pageContext.setAttribute("date",new Date())%>;
<fmt:formatDate value="${date}" pattern="yyyy-MM-dd HH:mm:ss"/>
数字格式化:
<fmt:formatNumber value="1234" type="currency" pattern="$.00"/>
<fmt:formatNumber value="123456.4891" pattern="#,#00.0#"/>
pattern属性格式设置:
0:代表一位数字 E:代表指数格式 #:代表一位数字,若没有则显示0
.:小数点 ,:数字分组分隔符 -:使用默认负数前缀
%:百分数 ?:千分数 $:货币符号
Function标签库
由于在JSP页面中显示数据时,经常需要对显示的字符串进行处理,SUN公司针对于一些常见处理定义了一套EL函数库供开发者使用。这些EL函数在JSTL开发包中进行描述,因此在JSP页面中使用SUN公司的EL函数库,需要导入JSTL开发包,并在页面中导入EL函数库,如下所示:
<%@ taglib uri-"http://java.sun.com/jsp/jstl/functions"prefux-"fn"%>
Function标签库主要被用于EL表达式语句中,Functions为EL表达式语句提供了许多有用的功能。
Functions标签库,共16个函数
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.List" %>
<%@ page import="org.lanqiao.domain.User" %>
<%@ page import="java.util.Date" %><%--
Created by IntelliJ IDEA.
User: huwei
Date: 2018/7/19
Time: 10:54
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<%--<c:out value="hell jstl"></c:out>--%>
<%--<c:set var="test" value="aaa"></c:set>--%>
<%--${test}----><c:out value="${test}"></c:out>--%>
<%--
jstl的使用:
1 导入jar包 2个
2 需要在页面引入标签库
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>对日期和数字进行格式化 可以进行货币 数字的分组
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>主要针对字符串进行函数操作 需要在el表达式内部使用
3 使用
常用核心库:
set out remove
判断 c:if c:choose c:when c:otherwise test=""
循环:c:forEach items var
在实际使用中 都是el + jstl搭配一起使用
--%>
<%
String uname = "admin1";
session.setAttribute("uname",uname);
String sex = "0";
request.setAttribute("sex",sex);
int[] arr = {1,3,2,4,1,5,9};
request.setAttribute("arr",arr);
List<String> list = new ArrayList<>();
list.add("aa");
list.add("bb");
list.add("cc");
list.add("dd");
list.add("ee");
request.setAttribute("list",list);
List<User> userList = new ArrayList<>();
User u1 = new User("张三",21);
User u2 = new User("张四",21);
User u3 = new User("张无",21);
User u4 = new User("张六",21);
User u5 = new User("张期",21);
userList.add(u1);
userList.add(u2);
userList.add(u3);
userList.add(u4);
userList.add(u5);
request.setAttribute("userList" ,userList);
%>
<c:if test="${sessionScope.uname == 'admin'}" var="flag">
欢迎您:<c:out value="${uname}"></c:out>
</c:if>
<c:choose>
<c:when test="${requestScope.sex == 1}">
男
</c:when>
<c:when test="${requestScope.sex == 2}">
女
</c:when>
<c:otherwise>
性别未知
</c:otherwise>
</c:choose>
<hr>
<c:forEach items="${arr}" begin="3" end="5" step="2" var="a">
${a}
</c:forEach>
<hr>
<c:forEach items="${list}" var="str">
${str}
</c:forEach>
<hr>
<c:forEach items="${userList}" var="user">
${user.username}---->${user.age}<br>
</c:forEach>
<%--格式化--%>
<hr>
<%
Date date = new Date();
request.setAttribute("date",date);
%>
<fmt:formatDate value="${date}" pattern="yyyy-MM-dd hh:mm:ss"></fmt:formatDate>
数字格式化
<fmt:formatNumber value="1234" type="currency" pattern="$.00"/>
<fmt:formatNumber value="123456.7891" pattern="#,#00.0#"/>
<%--函数库--%>
${fn:toUpperCase("aaaaaaaaaaaaaa")}
</body>
</html>
推荐阅读