JSTL组成:
JSTL –Core 核心标签库。 - 这是本部分的重点
JSTL – I18N - 国际化标签库。Internationalization- I18N
JSTL – SQL – 数据库操作标签(有悖于MVC设计模式,不学)。
JSTL - Functions – 函数库。
JSTL - XML ,对XML的操作(同SQL标签)。
上面讲的SQL和XML部分都是可以不学的,因为都是不会去用的
如果你的Web项目是基于JavaEE2.5或以上的。可以在你项目的任意页面上通过<%@ taglib 指令使用JSTL的核心标签库。
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>,这个标签必须打上次才能使用c标签
JSTL-Core一共包含以下几个子标签:
<c:out> ${name} 输出标签
示例:
<!-- c:out -->
<%
pageContext.setAttribute("name", "Tom");
pageContext.setAttribute("name2", "<font color='green'>Tom</font>");
%>
<c:out value="${name }"/><br/>
${name}<br/>
<c:out value="${name2}" escapeXml="false"/><br/>
<!-- 上面这一句里面的escapeXml="false"如果不加那么就是将字符串原样输出(默认是true),加了就是按HTML格式输出 -->
${name2}<br/>
<c:set> pageContext.setAttirbute(key,value,scope); 声明标签
<!-- c:set 设置属性,默认作用域:pageScope-->
<c:set var="a" value="dcba"/><!-- 这一个会存放在pageScope中,不会被下面一句冲掉 -->
<c:set var="a" value="abcd" scope="request"/>
${pageScope.a},${requestScope.a}<br/>
${a}<!-- 这一个选的是默认的pageScope中的a -->
c:remove 删除某个范畴内的数据
<!-- c:remove 删除属性,默认作用域:pageScope,request等4个容器中的都会被删除-->
<!-- 下面这一句,若没有scope属性,则前面的所有c:set设置的"a"都会被清除。写了下面的scope,则只清除指定的request中的那个"a"属性 -->
<c:remove var="a" scope="request"/>
${pageScope.a},${requestScope.a}<br/>
<c:if> 判断c:else,c:else if
<!-- c:if -->
<c:if test="${list[0].age>10}" var="boo" scope="session">
<table border=1px>
<c:forEach items="${list }" var="a">
<tr> <td>${a}</td> </tr>
</c:forEach>
</table>
</c:if>
<c:if test="${!boo }"><!-- 这里相当于else -->
<h3>Else</h3>
</c:if>
<c:choose><c:when><c:otherwise> 判断分枝c:if,c:else if c:(其实就相当于switch-case-default语句)
<!-- c:choose,c:when,c:otherwise 类似Java中的switch-case-default且每项自动带break -->
<c:set var="score" value="98"/>
<c:choose>
<c:when test="${score>90}">
优秀
</c:when>
<c:when test="${score>80}">
良好
</c:when>
<c:when test="${score>70}">
中等
</c:when>
<c:when test="${score>60}">
及格
</c:when>
<c:otherwise>
不及格
</c:otherwise>
</c:choose>
<c:forEach> 遍历
<!-- forEach -->
<!-- forEach的遍历功能 -->
<%
List list2 = new ArrayList();
list2.add("aa1111" );
list2.add("bb2222");
list2.add(200);
list2.add(100);
request.setAttribute("list2", list2);
%>
<c:forEach items="${list2}" var="a2">
${a2},
</c:forEach>
<%
Map<String,Object> map = new HashMap<String,Object>();
map.put("name", "Rose");
map.put("age",55);
map.put("tel", "13566668888");
pageContext.setAttribute("map", map);
%>
<br/>
<c:forEach items="${map}" var="m">
${m.key}=${m.value}<br/>
</c:forEach>
<%
String strs[] ={"aaa","bbb","111","2222"};
pageContext.setAttribute("strs", strs);
%>
<c:forEach items="${strs}" var="str">
${str},
</c:forEach>
<h3>看看ForEach标签中的varStatus属性---idx.index是元素的下标(从0开始),idx.count是元素的序号(从1开始计数)</h3>
<c:forEach items="${strs}" var="str" varStatus="idx">
${str}---index=${idx.index} count=${idx.count}<br/>
</c:forEach>
<!-- forEach的普通循环功能 -->
<c:forEach begin="20" end="39" var="i" step="2" varStatus="idx">
${i} ${idx.count}<br/>
</c:forEach>
<c:forTokens> 分隔
<!-- c:forTokens 用分隔符去拆分字符串-->
<c:forTokens items="aa,bb,cc,dd" delims="," var="i">
${i}
</c:forTokens>
<c:import> 导入其他资源,相当于动态包含共享同一个request
<!-- c:import 导入资源,相当于动态包含,共享同一个request-->
<c:import url="b.jsp"></c:import>
这里再提一下动态导入,如下:
<jsp:include page="jsps/b.jsp"></jsp:include>
<a href="<c:url value='a.jsp'/>">
<!-- c:redirect 重定向,相当于response.sendRedirect(...) -->
<%--
<c:redirect url="aa.jsp"></c:redirect>
--%>
这里我将重定向的代码注释掉了,而且这里还必须使用<%-- --%>注释,使用<-- -->不起作用
使用varStatus属性:
varStatus属性,用于设置一个javax.servlet.jsp.jstl.core.LoopTagStatus类型的命名变量:
它包含以下信息:
count – 当前元素在集合中的序号,从1开始。
index - 记录当前元素的下标,从0开始。
first - 判断是否是第一个元素。
Last - 判断是否是最后一个元素。
URL相关的标签:
<c:import/>包含其他web资源,功能类似与<jsp:include/>(动态包含)。
<c:import url=“web资源”/>
<c:url/>按特定的方式重写URL。
<c:url value=“/aaa.jsp”/>总是以/开头,如果只使用value属性为直接使用或输出。
<c:url value=“/…” var=“someVar” scope=“…”/>也可以通过这样的方式将重写的url放到某个范围中,然后再取出来使用。
<c:redirect/>负责重定向。
<c:redirect url=“重定向到的资源”/>
在使用<c:redirect时可以带更多的参数:
<c:redirect url=“/…”>
<c:param name=“someName” value=“someValue”/>
</c:redirect>
fmt格式化标签:
这个一般用在国际化里面( I18N ),在下面 I18N 的代码中有讲到
I18N
I18N-ResourceBundle类:
Java.util.ResourceBundle类,用于管理和Locale相关的资源的功能。
ResourceBundle类提供了两个方法,用于创建ResourceBundle对像的静态工厂方法:
getBundle(String baseName)—通过此方法获取资源文件的名称
getBundle(String baseName,Locale locale);
参数中的baseName是资源文件的名称,资源文件通常以properties为扩展名。
资源文件的命名规则如下:
默认资源文件:resources.properties
英文资源文件:resources_en_US.properties
中文资源文件:resources_zh_CN.properties
ResourceBundle示例:
步骤如下:
1、在classpath目录下建立一个资源文件为message.properties。
2、内容如下:name=Jack
3、书写一个main方法的类,并输入以下代码:
4、ResourceBundle b = ResourceBundle.getBundle("message");
String name = b.getString("name");
System.err.println(name);
此时你看到的输出是Jack.
5、在classpath目录下,再建立一个文件message_zh_CN.properties
并输入以下内容:name=杰克 (注意转码)
6、重新执行第4步的代码,你将会看到输出的结果变成了:杰克。
7、这是因为它使用本地语言查找相关的资源文件,如果找不到就使用默认的,如果找到就使用本地的资源文件。
示例:
首先我写了几个配置文件如下:
代码如下:
i18n.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<fmt:setLocale value="zh_CN"/>
<fmt:setBundle basename="msg"/>
<!-- 真正搞国际,应该要把设置Locale和Bundle的代码放在head标签中,页面只负责显示。 -->
</head>
<body>
张三,<fmt:message key="welcome"/><br/>
<fmt:message key="time"/>time
<hr/>
<!-- 相比上一版本,把国家语种用参数进行传递 -->
<a href="?loc=zh_CN">中文</a>
<a href="?loc=en_US">English</a>
<fmt:setLocale value="${param.loc}"/>
<fmt:setBundle basename="msg"/>
张三,<fmt:message key="welcome"/><br/>
<fmt:message key="time"/>time
<hr/>
<!-- 再演示一下多个资源的情况,第二个资源及以后都必须取别名(变量名)。前面(第一个)没取变量名的那个叫默认资源 -->
<fmt:setBundle basename="a" var="aaa" scope="session"/>
<!-- 如果多个页面都要使用,那么得把作用域设成session -->
张三,<fmt:message key="welcome"/><br/>
<fmt:message key="time"/>time:88888888
<br/>
<!-- 如果是从非默认资源中读取,那么得指定资源名称即aaa。如果没有指定名称,那么就是从默认的读取 -->
<fmt:message key="address" bundle="${aaa}"></fmt:message>
<br/>
<a href="<c:url value='c.jsp'/>">去其他页面</a>
</body>
</html>
c.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body>
<!-- 从作用域是session的资源aaa中读取 -->
<fmt:message key="address" bundle="${aaa}"/>
</body>
</html>
JSTL-Functions标签
更确切的说,它应该算是函数库。
它的使用方法与之前的jstl标签不同,它的语法如下:
${fn:contains(“Tomcat”,”cat”)} -判断前面的字符串中是否包含后面的字符串。
介绍几个经常使用的函数如下:
fn:contains – 是否包含,和fn:containsIgnoreCase.
fn:startsWith和fn:endsWidth
fn:indexOf,示例:${fn:indexOf(“Tomcat”,”o”)}将输出1。
fn:substring(source,begin,end);
fn:split
示例:
<c:forEach items=“${fn:split(‘www.baidu.com’,’.’)}” var=“str”>
${str}<br/>将输出换行的www、baidu、com
</c:forEach>
fn:toLowerCase和fn:toUpperCase
fn:trim
fn:length