JSTL标签库的主要函数演示。
导包
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
c:out标签演示
c:out标签等价 ${ 标识符} 的输出功能,不同点在于 c:out标签有两个属性
defalut属性,当读取的属性不存在,则输出默认值
escapeXml属性, 当该属性设置为true(默认)时,会把”<”编码成”<”输出,若设为false则不编码
h3>c:out标签演示</h3>
<%
pageContext.setAttribute("name", "Jack");
pageContext.setAttribute("age", "22");
%>
<c:out value="${name}"></c:out> , ${name} <br/>
<!-- c:out标签和EL表达式输出的区别在于该标签的两个属性:defalut和escapeXml -->
<!-- 1. defalut属性,当读取的属性不存在,则输出默认值 -->
<c:out value="${age}" default="18"></c:out>
<!-- 2. escapeXml属性, 当该属性设置为true(默认)时,会把"<"编码成"<"输出,若设为false则不编码 -->
<%
pageContext.setAttribute("str", "<font color='red'>湖南城院</font>");
%>
${str}, <c:out value="${str}" escapeXml="true"></c:out>
c:set标签演示
1.给JavaBean设置属性
2.给String类型的变量赋值, 相当于编程中的:定义变量
<h3>c:set标签演示</h3>
<!-- 1.给JavaBean设置属性 -->
<jsp:useBean id="u" class="cn.hncu.domain.User"></jsp:useBean>
<c:set target="${u}" property="name" value="Tom" ></c:set>
<c:set target="${u}" property="age" value="25" ></c:set>
<c:set target="${u}" property="pwd" value="1234" ></c:set>
<c:out value="${u}"></c:out>
<br/>
<!-- 2.给String类型的变量赋值, 相当于编程中的:定义变量 -->
<c:set var="sum" value="120" scope="request"></c:set>
<c:out value="${sum}"></c:out>
<br/><br/><br/>
<h3>c:remove标签演示</h3>
<c:remove var="sum" scope="request"/> <!-- 如果没指定scope则依次从4个容器找 -->
<c:out value="${sum}" default="0"></c:out>
* c:if标签演示 *
和Java中的 if–else 类似
<h3> c:if标签演示 </h3>
<!-- 如果显示块比较复杂,那么用c:if显然比直接用EL表达式好得多 -->
${age>20? "成年啦!!!!":"嫩了点" } <br/>
<!-- 用c:if写 if-else -->
<c:if test="${age>20}" var="boo"> <!-- 把test中的测试条件的结果值存放到变量var中(可以指定scope) -->
成年啦!!!!<br/>
<form>
Name:<input type="text" name="name"/> <br/>
Pwd:<input type="password" name="pwd"/> <br/>
<input type="submit"/>
</form>
</c:if>
<c:if test="${!boo}">
嫩了点
</c:if>
<c:if test="${age<20}">
嫩了点
</c:if>
c:forEach标签演示
用来遍历的标签,
<h3>c:forEach标签演示</h3>
<p>一、普通for循环的功能</p>
<c:forEach begin="1" end="10" step="2" var="i">
${i}:欢迎光临
</c:forEach>
<br/>
<p>二、增强for循环的功能:遍历集合, forEach标签中的items属性代表被遍历的集合,var代表每次循环读出的元素</p>
<!-- 1. 遍历数组 -->
<%
String strs[]={"aa","bb","111"};
pageContext.setAttribute("strs", strs);
%>
<c:forEach items="${strs}" var="str">
${str},,
</c:forEach>
<br/>
<!-- 2. 遍历List -->
<%
List list = new ArrayList();
list.add("aaa");
list.add("bbb");
list.add("666");
pageContext.setAttribute("list", list);
%>
<c:forEach items="${list}" var="str">
${str}
</c:forEach>
<br/>
<!-- 3. 遍历Map -->
<%
Map map = new HashMap();
map.put("name", "Jack");
map.put("age", "25");
map.put("pwd", "1234");
pageContext.setAttribute("map", map);
//Entry en = null; en.getKey(); en.getValue();
%>
<c:forEach items="${map}" var="en">
${en}<br/>
</c:forEach>
<c:forEach items="${map}" var="en">
${en.key} : ${en.value } <br/>
</c:forEach>
<!-- 4. 遍历 集合中的元素是值对象的情况 -->
<%
List<User> list2 = new ArrayList<User>();
list2.add( new User("Jack",22,"1234") );
list2.add( new User("张三",20,"1111") );
list2.add( new User("Rose",23,"1222") );
list2.add( new User("李四",30,"0000") );
pageContext.setAttribute("list2", list2);
%>
<!-- varStatus属性代表的是一个封装了index和count两个成员变量的对象,
前者是从0开始的索引下标,后者是从1开始的计数器 -->
<c:forEach items="${list2}" var="user" varStatus="idx">
${idx.index},${idx.count}:
<c:out value="${user.name}"></c:out>,
<c:out value="${user.age}"></c:out>,
<c:out value="${user.pwd}"></c:out><br/>
</c:forEach>
应用:用JSTL+EL表达式 实现表格行背景间隔显示
<html>
<head>
<style type="text/css">
table{
width:300px;
border: 1px solid red;
border-collapse: collapse;
}
td,th{
border: 1px solid red;
}
.bk{
background: yellow;
}
</style>
</head>
<body>
<h3> 用JSTL+EL表达式 实现表格行背景间隔显示</h3>
<%
List<User> list = new ArrayList<User>();
list.add(new User("Jack", 22, "1234"));
list.add(new User("张三", 20, "1111"));
list.add(new User("Rose", 23, "1222"));
list.add(new User("李四", 30, "0000"));
list.add(new User("李四1", 30, "0000"));
list.add(new User("李四2", 30, "0000"));
list.add(new User("李四3", 30, "0000"));
request.setAttribute("list", list);
%>
<table>
<tr> <th>姓名</th> <th>年龄</th></tr>
<c:forEach items="${list}" var="user" varStatus="idx">
<c:if test="${idx.count%2==0}">
<tr class="bk">
</c:if>
<c:if test="${idx.count%2==1}">
<tr>
</c:if>
<td>${user.name}</td> <td>${user.age}</td>
</tr>
</c:forEach>
</table>
<hr/>
<table>
<tr> <th>姓名</th> <th>年龄</th></tr>
<c:forEach items="${list}" var="user" varStatus="idx">
<c:if test="${idx.count%2==0}" var="boo">
<tr class="bk">
</c:if>
<c:if test="${!boo}">
<tr>
</c:if>
<td>${user.name}</td> <td>${user.age}</td>
</tr>
</c:forEach>
</table>
</body>
</html>
我再JSP页面对着JSTL函数的源码试了一些方法,代码如下
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>>JSTL标签库技术学习</title>
</head>
<body>
<h3>JSTL标签库技术学习</h3>
<%
request.setAttribute("name", "aahnc uanha a");
%>
${fn:toUpperCase(name) }
${fn:toLowerCase(name) }
${fn:indexOf(name,"Hncu") } <%-- 后面的字符在前面不存在就返回-1,存在就返回最开始的位子 例子 0 --%>
${fn:contains(name,"Hncu") }
${fn:containsIgnoreCase(name,"hncu") }
${fn:startsWith(name,"aa") }
${fn:endsWith(name,"aa") }
${fn:substring(name,0,2)}
${fn:substringAfter(name,"h") } <%-- 返回值为 第一个h 后面的 --%>
${fn:substringBefore(name,"n") } <%-- 返回值为 第一个h 前面的 --%>
${fn:trim("a b") } <%-- 不管用 什么鬼?
public static String trim(String input) {
if (input == null) return "";
return input.trim();
}
--%>
<hr>
hulonghncu<br/>
${fn:replace("hulonghncu","n","XX") }
<hr>
</body>
</html>
测试结果
jstl函数的源码
package org.apache.taglibs.standard.functions;
import java.lang.reflect.Array;
import java.util.Collection;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.Map;
import java.util.StringTokenizer;
import javax.servlet.jsp.JspTagException;
import org.apache.taglibs.standard.resources.Resources;
import org.apache.taglibs.standard.tag.common.core.Util;
public class Functions
{
public static String toUpperCase(String input)
{
return input.toUpperCase();
}
public static String toLowerCase(String input)
{
return input.toLowerCase();
}
public static int indexOf(String input, String substring)
{
if (input == null) input = "";
if (substring == null) substring = "";
return input.indexOf(substring);
}
public static boolean contains(String input, String substring) {
return (indexOf(input, substring) != -1);
}
public static boolean containsIgnoreCase(String input, String substring) {
if (input == null) input = "";
if (substring == null) substring = "";
String inputUC = input.toUpperCase();
String substringUC = substring.toUpperCase();
return (indexOf(inputUC, substringUC) != -1);
}
public static boolean startsWith(String input, String substring) {
if (input == null) input = "";
if (substring == null) substring = "";
return input.startsWith(substring);
}
public static boolean endsWith(String input, String substring) {
if (input == null) input = "";
if (substring == null) substring = "";
int index = input.indexOf(substring);
if (index == -1) return false;
if ((index == 0) && (substring.length() == 0)) return true;
return (index == input.length() - substring.length());
}
public static String substring(String input, int beginIndex, int endIndex) {
if (input == null) input = "";
if (beginIndex >= input.length()) return "";
if (beginIndex < 0) beginIndex = 0;
if ((endIndex < 0) || (endIndex > input.length())) endIndex = input.length();
if (endIndex < beginIndex) return "";
return input.substring(beginIndex, endIndex);
}
public static String substringAfter(String input, String substring) {
if (input == null) input = "";
if (input.length() == 0) return "";
if (substring == null) substring = "";
if (substring.length() == 0) return input;
int index = input.indexOf(substring);
if (index == -1) {
return "";
}
return input.substring(index + substring.length());
}
public static String substringBefore(String input, String substring)
{
if (input == null) input = "";
if (input.length() == 0) return "";
if (substring == null) substring = "";
if (substring.length() == 0) return "";
int index = input.indexOf(substring);
if (index == -1) {
return "";
}
return input.substring(0, index);
}
public static String escapeXml(String input)
{
if (input == null) return "";
return Util.escapeXml(input);
}
public static String trim(String input) {
if (input == null) return "";
return input.trim();
}
public static String replace(String input, String substringBefore, String substringAfter)
{
if (input == null) input = "";
if (input.length() == 0) return "";
if (substringBefore == null) substringBefore = "";
if (substringBefore.length() == 0) return input;
StringBuffer buf = new StringBuffer(input.length());
int startIndex = 0;
while ((index = input.indexOf(substringBefore, startIndex)) != -1)
{
int index;
buf.append(input.substring(startIndex, index)).append(substringAfter);
startIndex = index + substringBefore.length();
}
return input.substring(startIndex);
}
public static String[] split(String input, String delimiters)
{
if (input == null) input = "";
if (input.length() == 0) {
array = new String[1];
array[0] = "";
return array;
}
if (delimiters == null) delimiters = "";
StringTokenizer tok = new StringTokenizer(input, delimiters);
int count = tok.countTokens();
String[] array = new String[count];
int i = 0;
while (tok.hasMoreTokens()) {
array[(i++)] = tok.nextToken();
}
return array;
}
public static int length(Object obj)
throws JspTagException
{
if (obj == null) return 0;
if (obj instanceof String) return ((String)obj).length();
if (obj instanceof Collection) return ((Collection)obj).size();
if (obj instanceof Map) return ((Map)obj).size();
int count = 0;
if (obj instanceof Iterator) {
Iterator iter = (Iterator)obj;
count = 0;
while (iter.hasNext()) {
++count;
iter.next();
}
return count;
}
if (obj instanceof Enumeration) {
Enumeration enum_ = (Enumeration)obj;
count = 0;
while (enum_.hasMoreElements()) {
++count;
enum_.nextElement();
}
return count;
}
try {
count = Array.getLength(obj);
return count;
} catch (IllegalArgumentException ex) {
throw new JspTagException(Resources.getMessage("FOREACH_BAD_ITEMS")); }
}
public static String join(String[] array, String separator) {
if (array == null) return "";
if (separator == null) separator = "";
StringBuffer buf = new StringBuffer();
for (int i = 0; i < array.length; ++i) {
buf.append(array[i]);
if (i >= array.length - 1) continue; buf.append(separator);
}
return buf.toString();
}
}