您的位置:首页 > Web前端 > JavaScript

常用JSTL标签详解

2018-04-02 14:10 543 查看
JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能。

JSTL支持通用的、结构化的任务,比如迭代,条件判断,XML文档操作,国际化标签,SQL标签。 除了这些,它还提供了一个框架来使用集成JSTL的自定义标签。

根据JSTL标签所提供的功能,可以将其分为5个类别。

核心标签

格式化标签

SQL 标签

XML 标签

JSTL 函数

核心标签

核心标签是最常用的JSTL标签。引用核心标签库的语法如下:

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

标签描述
<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

<c:out>标签

输出常量或者域范围中的变量(value属性,使用EL表达式)

输出默认值(default属性)

默认HTML标签不转义(escapeXml)

属性名是否支持EL属性类型属性描述
valuetrueObject指定要输出的内容
escapeXmltrueBoolean指定是否将>、<、&、'、" 等特殊字符进行HTML编码转换后再进行输出。默认值是true。
defaulttrueObject指定如果value属性的值为null时所输出的默认值

<c:set>标签

向4个域中存入值。(var value scope属性)

设置Web域中的java.util.Map 类型的属性对象或JavaBean类型的属性对象的属性(target property value属性)

属性名是否支持EL属性类型属性描述
valuetrueObject用于指定属性
varfalseString用于指定要设置的Web域属性的名称
scopefalseString用于指定属性所在的Web域
targettrueObject用于指定要设置属性的对象,这个对象必须是
JavaBean对象或java.util.Map对象
propertytrueString用于指定当前要为对象设置的属性名称

<c:catch>标签

<c:catch>标签用于捕获嵌套在标签中的内容抛出的异常,其语法格式如下:<c:catch [var="varName"]> nested actions </c:catch>

var属性用于标识<c:catch>标签捕获的异常对象,它将保存在page这个web域中。

<c:if>标签

if标签的test属性必须是一个boolean类型的值,如果test的值为true,那么执行if标签的内容,否则不执行。

<c:if test="${not empty a }">
<c:out value="${a }"/>
</c:if>


<c:choose>标签

<c:choose>标签用于指定多个条件选择的组合边界,它必须与<c:when>和<c:otherwise>标签一起使用。使用<c:choose>,<c:when>,<c:otherwise>三个标签,可以构造类似于"if-else if-else"的复杂条件判断结构

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=gb2312" %>
<c:set value="${param.count}" var="count“  /> pageContext(count,2)
<c:choose>
<c:when test="${count == 0}">
对不起,没有符合您要求的记录。
</c:when>
<c:otherwise>
符合您要求的记录共有${count}条.
</c:otherwise>
</c:choose>


<c:forEach>标签

<c:forEach>标签用于对一个集合对象中的元素进行循环迭代操作,或者按指定的次数重复迭代执行标签体中的内容

属性名是否支持EL属性类型属性描述
varfalseString指定将当前迭代到的元素保存到page这个域中的属性名称
varStatusfalseString记住用于保存迭代信息的对象
itemstrue任何支持的类型将要迭代的集合对象
begintrueint如果指定items属性,就从集合中的第begin个元素开始进行迭代
,begin的索引值从0开始编号,如果没有指定items属性,就从
begin指定的值开始迭代,直到end值时结束迭代
endtrueint与begin属性类似
steptrueint指定迭代的步长,即迭代因子的迭代增量
<c:forEach>遍历集合

遍历数组或者集合:

var:代表遍历的每一个元素

items:要迭代的集合对象

获取遍历的内容:${ xxx }

遍历Map集合:

var:代表key与value的关系entry

items:要迭代的map集合

获取遍历的内容:${ xxx.key } ----${ xxx.value }

遍历对象集合:

var:代表遍历的每一个对象

items:要迭代的集合

获取遍历的内容: ${ xxx.对象的属性 }

<c:forEach>迭代数据

从1遍历到10:

var:定义变量

begin:从哪开始

end:到哪结束

step:迭代步长(相当于x+=step)

计算从1加到10的和:

定义变量sum,值为0

通过forEach循环1到10,每循环一次加到另一个变量中

在循环中间定义变量,每次计算到该变量中

<c:set var="sum" value="0" scope="page"></c:set>
<c:forEach begin="1" end="10" step="1" var="i">
<c:set var="sum" value="${sum + i}" scope="page"></c:set>
</c:forEach>
${sum }

varStatus属性:

记录迭代相关的信息:

属性类型意义
indexnumber现在指到成员的索引
countnumber总共指到成员的总数
firstboolean现在指到的成员是否是第一个成员
lastboolean现在指到的成员是否是最后一个成员
遍历10到100的偶数,每到第三个数,显示红色:

<c:forEach begin="10" end="100" step="2" var="i" varStatus="status">
<c:if test="${status.count % 3 == 0}">
<font color="red">${i }</font>
</c:if>
<c:if test="${status.count % 3 != 0}">
<font color="blue">${i }</font>
</c:if>
</c:forEach>


<c:forTokens>标签

用来切分字符串

名称说明EL类型必须默认值
var用来存放现在指到的成员NString
items被迭代的字符串YString
delims定义用来分割字符串的字符NString
varStatus用来存放现在指到的相关成员信息NString
begin开始的位置Yint0
end结束的位置Yint最后一个成员
<c:set var="s" value="aaa,bbb,ccc" scope="page"></c:set>
<c:forTokens items="${s}" delims="," var="e">
${e }
</c:forTokens>

语法格式:

<c:forTokens
items=要切分的字符串
delims=按着什么格式切分
var=定义变量
[varStatus="varStatusName"]
[begin="begin"]
[end="end"]
[step="step"]>
//body内容
</c:forTokens>


<c:import>标签

名称说明EL类型必须默认值
url一文件被包含的地址YString
context项目虚拟路径YString
var储存被包含的文件的内容(以String类型存入)YString
scopevar变量的JSP范围NStringpage
charEncoding被包含文件的内容的编码方式YString
varReader储存被包含的文件的内容(以Reader类型存入)NString
<!-- 引入foreach.jsp 效果类似包含-->
<c:import url="/jstl/foreach.jsp" context="/day8"></c:import>
<hr/>
<!-- 引入不显示,将内容保存另一个变量中 -->
<c:import url="/jstl/foreach.jsp" context="/day8" var="content" scope="page"></c:import>
${content }
<c:import url="http://java.sun.com" >
<c:param name="test" value="1234" />
</c:import>


<c:url>标签

<c:url>标签用于在JSP页面中构造一个URL地址,其主要目的是实现URL重写。URL重写就是将会话标识以参数形式附加在URL地址后面。(类似于Session追踪 尤其是当浏览器禁用cookie后,就是说实现了session追踪的功能)

属性名是否支持EL属性类型属性描述
valuetrueString指定要构造的URL
varfalseString指定将构造出的URL结果保存到Web域中的属性名称
scopefalseString指定将构造出的URL结果保存在哪个域中

<c:redirect>标签

<c:redirect>标签用于实现请求重定向

属性名是否支持EL属性类型属性描述
urltrueString指定要转发或重定向到的目标资源的URL地址
contexttrueString当要使用相对路径重定向到同一个服务器下的其他WEB应用程序中的
资源时,context属性指定其他WEB应用程序的名称
注意:如果重定向第三方的网站时要使用绝对路径(不能再使用Context)

<%
// 以前重定向
// response.sendRedirect("/day12/index.jsp");
%>
<c:redirect url="/index.jsp" context="/day12"></c:redirect>


格式化标签

JSTL格式化标签用来格式化并输出文本、日期、时间、数字。引用格式化标签库的语法如下:

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

标签描述
<fmt:formatNumber>使用指定的格式或精度格式化数字
<fmt:parseNumber>解析一个代表着数字,货币或百分比的字符串
<fmt:formatDate>使用指定的风格或模式格式化日期和时间
<fmt:parseDate>解析一个代表着日期或时间的字符串
<fmt:bundle>绑定资源
<fmt:setLocale>指定地区
<fmt:setBundle>绑定资源
<fmt:timeZone>指定时区
<fmt:setTimeZone>指定时区
<fmt:message>显示资源配置文件信息
<fmt:requestEncoding>设置request的字符编码
<fmt:formatNumber> 使用指定的格式或精度格式化数字

语法:

<fmt:formatNumber value="" type="currency" [pattern=""] [currencyCode=""] [currencySymbol=""] [groupingUsed=""] [maxIntegerDigits=""] [minIntegerDigits=""] [maxFractionDigits=""] [minFractionDigits=""] [var=""] [scope=""]>
<fmt:formatNumber value="" [type="currency|number|percent"] [pattern=""] [groupingUsed=""] [maxIntegerDigits=""] [minIntegerDigits=""] [maxFractionDigits=""] [minFractionDigits=""] [var=""] [scope=""]>

属性描述是否必要默认值
value要显示的数字
typeNUMBER,CURRENCY,或 PERCENT类型Number
pattern指定一个自定义的格式化模式用与输出
currencyCode货币码(当type="currency"时)取决于默认区域
currencySymbol货币符号 (当 type="currency"时)取决于默认区域
groupingUsed是否对数字分组 (TRUE 或 FALSE)true
maxIntegerDigits整型数最大的位数
minIntegerDigits整型数最小的位数
maxFractionDigits小数点后最大的位数
minFractionDigits小数点后最小的位数
var存储格式化数字的变量Print to page
scopevar属性的作用域page
eg:

<%@ page language="java" pageEncoding="UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<html>
<head>
<title>Tag Example - www.yiibai.com</title>
</head>
<body>

<c:set var="balance" value="120000.2394" />
<c:out value="${balance}" />
<p>Formatted Number (1):
<fmt:formatNumber value="${balance}" type="currency" />
</p>
<p>Formatted Number (2):
<fmt:formatNumber value="${balance}" type="number" maxIntegerDigits="3" />
</p>
<p>Formatted Number (3):
<fmt:formatNumber value="${balance}" type="number" maxFractionDigits="3" />
</p>
<p>Formatted Number (4):
<fmt:formatNumber value="${balance}" type="number" groupingUsed="false" />
</p>
<p>Formatted Number (5):
<fmt:formatNumber value="${balance}" type="percent" maxIntegerDigits="2" />
</p>
<p>Formatted Number (6):
<fmt:formatNumber value="${balance}" type="percent" maxFractionDigits="1" />
</p>
<p>Formatted Number (7):
<fmt:formatNumber value="${balance}" type="percent" minFractionDigits="3" />
</p>
<p>Formatted Number (8):
<fmt:formatNumber value="${balance}" type="number" pattern="##.###E00" />
</p>
<p>Currency in USA:
<fmt:setLocale value="en_US" />
<fmt:formatNumber value="${balance}" type="currency" />
</p>

</body>
</html>

//结果输出为:
 120000.2394

  Formatted Number (1): ¥120,000.24

  Formatted Number (2): 000.239

  Formatted Number (3): 120,000.239

  Formatted Number (4): 120000.239

  Formatted Number (5): 24%

  Formatted Number (6): 12,000,023.9%

  Formatted Number (7): 12,000,023.940%

  Formatted Number (8): 12E04

  Currency in USA: $120,000.24

<fmt:parseNumber> 解析一个代表着数字,货币或百分比的字符串

语法:

属性描述是否必要默认值
value要解析的数字Body
typeNUMBER,,CURRENCY,或 PERCENTnumber
parseLocale解析数字时所用的区域默认区域
integerOnly是否只解析整型数(true)或浮点数(false)false
pattern自定义解析模式
timeZone要显示的日期的时区默认时区
var存储待解析数字的变量Print to page
scopevar属性的作用域page
eg:

<%@ page language="java" pageEncoding="UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<html>
<head>
<title>Tag Example - www.yiibai.com</title>
</head>
<body>
<c:set var="balance" value="125003.350" />
<fmt:parseNumber value="${balance}" var="i" type="number" />
<p>Parsed Number(1):<c:out value="${i}" /></p>
<fmt:parseNumber value="${balance}" var="i" type="number" integerOnly="true" />
<p>Parsed Number(2):<c:out value="${i}" />
</body>
</html>

//结果输出为:

  Parsed Number(1):125003.35

  Parsed Number(2):125003

<fmt:formatDate> 使用指定的风格或模式格式化日期和时间

语法:<fmt:formatDate value="" [type="date|time|both"]>

属性描述是否必要默认值
value要显示的日期
typeDATE, TIME, 或 BOTHdate
dateStyleFULL, LONG, MEDIUM, SHORT, 或 DEFAULTdefault
timeStyleFULL, LONG, MEDIUM, SHORT, 或 DEFAULTdefault
pattern自定义格式模式
timeZone显示日期的时区默认时区
var存储格式化日期的变量名显示在页面
scope存储格式化日志变量的范围页面          
格式:

代码描述实例
G
时代标志
AD
y
不包含纪元的年份。如果不包含纪元的年份小于 10,则显示不具有前导零的年份。
2002
M
月份数字。一位数的月份没有前导零。
April & 04
d
月中的某一天。一位数的日期没有前导零。
20
h
12 小时制的小时。一位数的小时数没有前导零。
12
H
24 小时制的小时。一位数的小时数没有前导零。
0
m
分钟。一位数的分钟数没有前导零。
45
s
秒。一位数的秒数没有前导零。
52
S
毫秒
970
E
周几
Tuesday
D
一年中的第几天
180
F
一个月中的第几个周几
2 (一个月中的第二个星期三)
w
一年中的第几周r
27
W
一个月中的第几周
2
a
a.m./p.m. 指示符
PM
k
小时(12 小时制的小时)
24
K
小时(24 小时制的小时)
0
z
时区
中部标准时间
'
转义文本
''
单引号
eg:

<%@ page language="java" pageEncoding="UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<html>
<head>
<title>Tag Example - www.yiibai.com</title>
</head>
<body>
<c:set var="now" value="<%=new java.util.Date() %>" />
<p>Formatted Date (1):
<fmt:formatDate value="${now}" type="time" />
</p>
<p>Formatted Date (2):
<fmt:formatDate value="${now}" type="date" />
</p>
<p>Formatted Date (3):
<fmt:formatDate value="${now}" type="both" />
</p>
<p>Formatted Date (4):
<fmt:formatDate value="${now}" type="both" dateStyle="short" timeStyle="short" />
</p>
<p>Formatted Date (5):
<fmt:formatDate value="${now}" type="both" dateStyle="medium" timeStyle="medium" />
</p>
<p>Formatted Date (6):
<fmt:formatDate value="${now}" type="both" dateStyle="medium" timeStyle="short" />
</p>
<p>Formatted Date (7):
<fmt:formatDate value="${now}" type="both" dateStyle="long" timeStyle="long" />
</p>
<p>pattern:
<fmt:formatDate value="${now}"  pattern="yyyy-MM-dd" />
</p>
</body>
</html>

//结果输出为:

  Formatted Date (1): 11:55:11

  Formatted Date (2): 2016-5-14

  Formatted Date (3): 2016-5-14 11:55:11

  Formatted Date (4): 16-5-14 上午11:55

  Formatted Date (5): 2016-5-14 11:55:11

  Formatted Date (6): 2016-5-14 上午11:55

  Formatted Date (7): 2016年5月14日 上午11时55分11秒

  pattern: 2016-05-14

<fmt:parseDate> 解析一个代表着日期或时间的字符串

语法:

属性描述是否必要默认值
value要显示的日期
typeDATE, TIME, 或 BOTHdate
dateStyleFULL, LONG, MEDIUM, SHORT, 或 DEFAULTdefault
timeStyleFULL, LONG, MEDIUM, SHORT, 或 DEFAULTdefault
pattern自定义格式模式
timeZone显示日期的时区默认时区
var存储格式化日期的变量名显示在页面
scope存储格式化日志变量的范围页面
eg:

<%@ page language="java" pageEncoding="UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<html>
<head>
<title>Tag Example - www.yiibai.com</title>
</head>
<body>
<c:set var="now" value="20-10-2010" />
<fmt:parseDate value="${now }" pattern="dd-MM-yyyy" type="date" dateStyle="short"/>
<%-- <p>Parse Date:<c:out value="${parsedEmpDate}" /></p> --%>
</body>
</html>

//结果输出为:
  Wed Oct 20 00:00:00 CST 2010

<fmt:bundle> 绑定资源

资源束包含区域特定对象。资源束包含键值对。

当程序需要区域特定资源时,可以将所有的关键词对所有的locale共享,也可以为locale指定转换后的值。资源束可以帮助提供指定的locale的内容。

一个Java资源束文件包含一系列的键值对。所需类继承自java.util.ListResourceBundle类。类编译后放在Web应用程序的CLASSPATH中。

语法:<fmt:bundle basename="basename" [prefix="keypre"]>

属性描述是否必要默认值
basename指定被载入的资源束的基础名称
prefix指定<fmt:message>标签key属性的前缀
eg: 1.java资源束创建部分

package com.tutorialspoint;

import java.util.ListResourceBundle;

public class Example_En extends ListResourceBundle{

static final Object[][] contents={
{"count.one","One"},
{"count.two","Two"},
{"count.three","Three"}
};

@Override
protected Object[][] getContents() {
// TODO Auto-generated method stub
return contents;
}

}

2.资源束使用部分

<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<fmt:bundle basename="com.tutorialspoint.Example_En" prefix="count.">
<fmt:message key="one" /><br>
<fmt:message key="two" /><br>
<fmt:message key="three" /><br>
</fmt:bundle>
<fmt:bundle basename="com.tutorialspoint.Example_En">
<fmt:message key="count.one" /><br>
<fmt:message key="count.two" /><br>
<fmt:message key="count.three" /><br>
</fmt:bundle>
</body>
</html>

//结果输出为:
  One
  Two
  Three
  One
  Two
  Three

<fmt:setLocale> 指定地区(将给定的区域存储在locale配置变量中)

语法:

属性描述是否必要默认值
value指定ISO-639 语言码和ISO-3166 国家码en_US
variant特定浏览器变体
scopeLocale配置变量的作用域Page
eg:1.java资源束创建部分Example_en_US

package com.tutorialspoint;

import java.util.ListResourceBundle;

public class Example_en_US extends ListResourceBundle{

static final Object[][] contents={
{"count.one","One"},
{"count.two","Two"},
{"count.three","Three"}
};

@Override
protected Object[][] getContents() {
// TODO Auto-generated method stub
return contents;
}

}

2.java资源束创建部分Example_es_ES

package com.tutorialspoint;

import java.util.ListResourceBundle;

public class Example_es_ES extends ListResourceBundle{

static final Object[][] contents={
{"count.one","Uno"},
{"count.two","Dos"},
{"count.three","Tres"}
};
@Override
protected Object[][] getContents() {
// TODO Auto-generated method stub
return contents;
}

}

3.资源束使用部分

<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<fmt:bundle basename="com.tutorialspoint.Example" prefix="count.">
<fmt:message key="one" /><br>
<fmt:message key="two" /><br>
<fmt:message key="three" /><br>
</fmt:bundle>
<fmt:setLocale value="es_ES" />
<fmt:bundle basename="com.tutorialspoint.Example">
<fmt:message key="count.one" /><br>
<fmt:message key="count.two" /><br>
<fmt:message key="count.three" /><br>
</fmt:bundle>
</body>
</html>

//结果输出为:
  One
  Two
  Three
  Uno
  Dos
  Tres

<fmt:setBundle> 绑定资源(载入一个资源束,然后存储在作用域中已命名的变量或bundle配置变量中)类似于<fmt:bundle>

语法:

属性描述是否必要默认值
basename资源束家族基础名称,暴露给作用域变量或配置变量
var存储新资源束的变量Replace default
scope变量的作用域Page
eg:

1.java资源束创建部分Example_es_ES

package com.tutorialspoint;

import java.util.ListResourceBundle;

public class Example_es_ES extends ListResourceBundle{

static final Object[][] contents={
{"count.one","Uno"},
{"count.two","Dos"},
{"count.three","Tres"}
};
@Override
protected Object[][] getContents() {
// TODO Auto-generated method stub
return contents;
}

}

2.资源束使用部分

<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>

<fmt:setLocale value="es_ES" />
<fmt:setBundle basename="com.tutorialspoint.Example" var="lang" />
<fmt:message key="count.one" bundle="${lang}"/><br>
<fmt:message key="count.two" bundle="${lang}"/><br>
<fmt:message key="count.three" bundle="${lang}"/><br>

</body>
</html>

//结果输出为:
  Uno
  Dos
  Tres

<fmt:timeZone> 指定时区

语法:

属性描述是否必要默认值
value时区
eg:

<%@ page language="java" contentType="text/html; charset=UTF-8"  pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<c:set var="now" value="<%=new java.util.Date() %>" />
<p>当前时间:
<fmt:formatDate value="${now}" type="both" timeStyle="medium" dateStyle="medium" />
</p>
<p>时区为 GMT-8 :
<fmt:timeZone value="GMT-8">
<fmt:formatDate value="${now}"  type="both" />
</fmt:timeZone>
</p>
</body>
</html>

//结果输出为:

当前时间: 2016-5-18 20:54:04

  时区为 GMT-8 : 2016-5-18 4:54:04

<fmt:setTimeZone> 用来复制一个时区对象至指定的作用域,类似于<fmt:timeZone>

语法:

属性描述是否必要默认值
value时区
var存储新时区的变量名Replace default
scope变量的作用域Page
eg:

<%@ page language="java" contentType="text/html; charset=UTF-8"  pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<c:set var="now" value="<%=new java.util.Date() %>" />
<p>当前时间:
<fmt:formatDate value="${now}" type="both" timeStyle="medium" dateStyle="medium" />
</p>
<p>时区为 GMT-8 :
<fmt:setTimeZone value="GMT-8" />
<fmt:formatDate value="${now}"  type="both" />

</p>
</body>
</html>

//结果输出为:

   当前时间: 2016-5-18 20:54:04

  时区为 GMT-8 : 2016-5-18 4:54:04

<fmt:message> 映射一个关键字给局部消息,然后执行参数替换

语法:

属性描述是否必要默认值
key要检索的消息关键字Body
bundle要使用的资源束默认资源束
var存储局部消息的变量名Print to page
scopevar属性的作用域Page
eg:

<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>

<fmt:setLocale value="es_ES" />
<fmt:setBundle basename="com.tutorialspoint.Example" var="lang" />
<fmt:message key="count.one" bundle="${lang}"/><br>
<fmt:message key="count.two" bundle="${lang}"/><br>
<fmt:message key="count.three" bundle="${lang}"/><br>

</body>
</html>

//结果输出为:   Uno   Dos   Tres

<fmt:requestEncoding> 用来指定返回给Web应用程序的表单编码类型

指定字符集,用于解码来自表单的数据。在字符集不是ISO-8859-1时必须使用这个标签。

用来指定请求的Content-Type,即使response是通过Page指令的contentType属性来编码,这是由于response的实际区域可能与Page指令所指定的不同。

语法:

属性描述是否必要默认值
value字符编码集的名称,用于解码request参数
eg:

<fmt:requestEncoding value="UTF-8" />


SQL标签

JSTL SQL标签库提供了与关系型数据库(Oracle,MySQL,SQL Server等等)进行交互的标签。引用SQL标签库的语法如下:

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

标签描述
<sql:setDataSource>指定数据源
<sql:query>运行SQL查询语句
<sql:update>运行SQL更新语句
<sql:param>将SQL语句中的参数设为指定值
<sql:dateParam>将SQL语句中的日期参数设为指定的java.util.Date 对象值
<sql:transaction>在共享数据库连接中提供嵌套的数据库行为元素,将所有语句以一个事务的形式来运行

XML 标签

JSTL XML标签库提供了创建和操作XML文档的标签。引用XML标签库的语法如下:

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

在使用xml标签前,你必须将XML 和 XPath 的相关包拷贝至你的<Tomcat 安装目录>\lib下:

XercesImpl.jar 下载地址: http://www.apache.org/dist/xerces/j/

xalan.jar 下载地址: http://xml.apache.org/xalan-j/index.html

标签描述
<x:out>与<%= ... >,类似,不过只用于XPath表达式
<x:parse>解析 XML 数据
<x:set>设置XPath表达式
<x:if>判断XPath表达式,若为真,则执行本体中的内容,否则跳过本体
<x:forEach>迭代XML文档中的节点
<x:choose><x:when>和<x:otherwise>的父标签
<x:when><x:choose>的子标签,用来进行条件判断
<x:otherwise><x:choose>的子标签,当<x:when>判断为false时被执行
<x:transform>将XSL转换应用在XML文档中
<x:param>与<x:transform>共同使用,用于设置XSL样式表

JSTL函数

JSTL包含一系列标准函数,大部分是通用的字符串处理函数。引用JSTL函数库的语法如下:

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

函数描述
fn:contains()测试输入的字符串是否包含指定的子串
fn:containsIgnoreCase()测试输入的字符串是否包含指定的子串,大小写不敏感
fn:endsWith()测试输入的字符串是否以指定的后缀结尾
fn:escapeXml()跳过可以作为XML标记的字符
fn:indexOf()返回指定字符串在输入字符串中出现的位置
fn:join()将数组中的元素合成一个字符串然后输出
fn:length()返回字符串长度
fn:replace()将输入字符串中指定的位置替换为指定的字符串然后返回
fn:split()将字符串用指定的分隔符分隔然后组成一个子字符串数组并返回
fn:startsWith()测试输入字符串是否以指定的前缀开始
fn:substring()返回字符串的子集
fn:substringAfter()返回字符串在指定子串之后的子集
fn:substringBefore()返回字符串在指定子串之前的子集
fn:toLowerCase()将字符串中的字符转为小写
fn:toUpperCase()将字符串中的字符转为大写
fn:trim()移除首位的空白符

fn:toLowerCase

fn:toLowerCase函数将一个字符串中包含的所有字符转换为小写形式,并返回转换后的字符串,它接收一个字符串类型的参数,例如:

fn:toLowerCase("Www.IT315.org")的返回值为字符串"www.it315.org"

fn.toLowerCase("") 的返回值为空字符串

fn:toUpperCase

fn:toUpperCase函数将一个字符串中包含的所有字符转换为大写形式,并返回转换后的字符串,它接收一个字符串类型的参数。例如:

fn:toUpperCase("www.IT315.org")的返回值为字符串"WWW.IT315.ORG"

fn:toUpperCase("")的返回值为空字符串

fn:trim

fn:trim函数删除一个字符串的首尾的空格,并返回删除空格后的结果字符串,它接收一个字符串类型的参数。需要注意的是,fn:trim函数不能删除字符串中间位置的空格

例如:fn:trim(" www.it3 15.org ")的返回值字符串是"www.it 315.org"

fn:length

fn:length函数返回一个集合或数组大小,或返回一个字符串中包含的字符的个数,返回值是int类型。fn:length函数接收一个参数,这个参数可以是<c:forEach>标签的items属性支持的任何类型,包括任意类型的数组、java.util.Collection、java.util.Iterator、java.util.Enumeration、java.util.Map等类的实例对象和字符串。

如果fn:length函数的参数为null或者是元素个数为0的集合或数组对象,则函数返回0;如果参数是空字符串,则函数返回0;

fn:split

fn:split函数以指定字符串作为分隔符,将一个字符串分割成数组并返回这个字符串数组。

fn:split函数接收两个字符串类型的参数,第一个参数表示要分割的字符串,第二个参数表示作为分隔符的字符串。

例如:fn:split("www.it315.org",".")[1]的返回值为字符串"it315"

fn:join

fn:join函数以一个字符串作为分隔符,将一个字符串数组中的所有元素合并为一个字符串并返回合并后的结果字符串。fn:join函数接收两个参数,第一个参数是要操作的字符串数组,第二个参数是作为分隔符的字符串。

如果fn:join函数的第二个参数是空字符串,则fn:join函数的返回值直接将元素连接起来。例如:

假设stringArray是保存在Web域中的一个属性,它表示一个值为{"www","it315","org"}的字符串数组,则fn:join(stringArray,".")返回字符串"www.it315.org"

fn:join(fn:split("www,it315,org",","),".") 的返回值为字符串"www.it315.org"

fn:indexOf

fn:indexOf 函数返回指定字符串在一个字符串中第一次出现的索引值,返回值为int类型。fn:indexOf函数接收两个字符串类型的参数,如果第一个参数字符串中包含第二个参数字符串,那么不管第二个参数字符串在第一个参数字符串中出现几次,fn:indexOf函数总是返回第一次出现的索引值;如果第一个参数中不包含第二个参数,则fn:indexOf函数返回-1。如果第二个参数为空字符串,则fn:indexOf函数总是返回0。

例如:fn:indexOf("www.it315.org","t3") 的返回值为5

fn:contains

fn:contains函数检测一个字符串中是否包含指定的字符串,返回值为布尔类型。fn:contains函数在比较两个字符串是否相等时是大小写敏感的。

fn:contains函数接收两个字符串类型的参数,如果第一个字符串中包含第二个参数字符串返回true,否则返回false。如果第二个参数的值为空字符串,则fn:contains函数总是返回true。实际上,fn:contains(string,substring)等价于fn:indexOf(string,sunstring)!= -1

忽略大小写的EL函数:fn:containsIgnoreCase

fn:startsWith

fn:startsWith 函数用于检测一个字符串是否以指定的字符串开始的,返回值为布尔类型。

fn:startsWith 函数接收两个字符串类型的参数,如果第一个参数字符串以第二个参数字符串开始,则函数返回true,否则函数返回false。如果第二个参数为空字符串,则fn:startsWith函数总是返回true。例如:

fn:startsWith("www.it315.org","it315")的返回值为false

与之对应的EL函数:fn:endsWith

fn:replace

fn:replace函数将一个字符串中包含的指定字符串替换为其他的指定字符串,并返回替换后的结果字符串。fn:replace("www it315 org"," ",".")的返回值为字符串"www.it315.org"

fn:substring

fn:substring 函数用于截取一个字符串的子字符串并返回截取到的子字符串。fn:substring函数接收三个参数,第一个参数是用于指定要操作的源字符串,第二个参数是用于指定截取子字符串开始的索引值,第三个参数是用于指定截取子字符串结束的索引值,第二个参数和第三个参数都是int类型,其值都从0开始例如:

fn:substring("www.it315.org",4,9)的返回值为字符串"it315"

fn:substringAfter

fn:substringAfter函数用于截取并返回一个字符串中的指定字符串第一次出现之后的子字符串。fn:substringAfter函数接收两个字符串类型的参数,第一个参数表示要操作的源字符串,第二个参数表示指定的子字符串。

fn:substringAfter("www.it315.org",".")的返回值为字符串"it315.org"

与之对应的EL函数为:fn:substringBefore

自定义EL函数开发步骤

EL自定义函数开发与应用包括以下三个步骤:

编写一个Java类,方法必须是静态方法。

在WEB-INF目录下新建一个tld的文件。

没有标签的提示,复制http://java.sun.com/xml/ns/j2ee , 合并名称

设置2.0,设置url和shortname

编写标签库描述符(tld)文件,在tld文件配置自定义函数

使用function标签配置自定义函数。

使用name标签配置方法名(可以任意)

使用function-class标签配置类的全路径

使用function-signature 标签配置返回值类型(中间有空格)方法名称(参数类型)

在JSP页面中导入和自定义函数

开发EL function注意事项

编写标签库描述文件后,需要将它放置到<web应用>\WEB-INF目录中或WEB-INF目录下的除了classes和lib目录之外的任意子目录中。

TLD文件中的<uri>元素用指定该TLD文件的URI,在JSP文件中需要通过这个URI来引入该标签库描述文件。

<function>元素用于描述一个EL自定义函数,其中:

<name>子元素用于指定EL自定义函数的名称。

<funtion-class>子元素用于指定完整的Java类名。

<function-signature>子元素用于指定Java类中的静态方法的签名,方法签名必须指明方法的返回类型以及各个参数的类型,各个参数之间用逗号分隔。

实例如下:

在src下新建一个cn.itcast.el的包,在包内新建ElDemo1.java

代码如下:

package cn.itcast.el;

public class ElDemo1 {
public static String sayHello(String name){
return "hello "+name;
}
}

在WebRoot/WEB-INF下新建myfn的tld文件 并进行配置:



配置后的代码如下:

<?xml version="1.0" encoding="UTF-8"?>

<taglib version="2.0" xmlns="http://java.sun.com/xml/ns/j2ee"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"> 
<tlib-version>1.0</tlib-version>

<short-name>myfn</short-name>

<uri>http://www.itcast.cn/1110/myfn</uri>

<!-- 配置自定义的EL函数 -->

<function>

<!-- 配置方法名称 -->

<name>sayHi</name>

<!-- 方法所在的类 -->

<function-class>cn.itcast.el.ElDemo1</function-class>

<!-- 配置方法的签名 -->

<function-signature>java.lang.String sayHello(java.lang.String)</function-signature>

</function>

</taglib>


在WebRoot根目录下新建el文件夹,在里面新建demo.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"

pageEncoding="UTF-8"%>

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

<%@ taglib uri="http://www.itcast.cn/1110/myfn" prefix="myfn" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>Insert title here</title>

</head>

<body>

${ fn:length("abcdefg") }

${ fn:toUpperCase("abcdefg") }

${ myfn:sayHi("小风") }

</body>

</html>




自定义标签

自定义标签简介

自定义标签主要用于移除JSP页面中的Java代码,提高代码的复用性

使用自定义标签移除jsp页面在奇偶那个的Java代码,只需要完成以下步骤:

编写一个实现Tag接口的Java类(标签处理器)

编写标签库描述符(tld)文件,在tld文件中对标签处理器类描述成一个标签

参考Tomcat中example项目中的JSP部分

因为企业业务需求是多种多样的,所以常见开源框架只能提供通用的Java代码功能,如果实现既定业务逻辑功能,需要自定义标签。通过自定义标签(简化复杂业务开发)



简单标签

由于传统标签使用三个标签接口来完成不同的功能,显得过于繁琐,不利于标签技术的推广,SUN公司为降低标签技术的学习难度,在JSP2.0中定义了一个更为简单、便于编写和调用的SimpleTag接口来实现标签的功能。实现SimpleTag接口的标签通常称为简单标签。

SimpleTag方法介绍

setJspContext方法:用于把JSP页面的pageContext对象传递给标签处理器对象。

setParent方法:用于把父标签处理器对象传递给当前标签处理器对象。

getParent方法:用于获得当前标签的父标签处理对象。

setJspBody方法:用于把代表标签体的JspFragment对象传递给标签处理器对象。即传入标签体缓存对象(封装了标签体内容)

doTag方法:用于完后所有标签逻辑,包括输出、迭代、修改标签体内容等。在doTag方法中可以抛出javax.servlet.jsp.SkipPageException异常,用于通知WEB容器不再执行JSP页面中位于结束标记后面的内容,这等效于在传统标签的doEndTag方法中返回Tag.SKIP_PAGE常量的情况。

简单标签库开发常用功能,实现SimpleTag接口标签类(SimpleTag JSP2.0 之后为了简化标签开发提供的)

编写简单的标签类,只需要继承SimpleTagSupport类

setJspContext 传入pageContext对象

setParent 传入父标签对象

setJSPBody 传入标签体缓存对象(封装了标签体内容)

doTag (执行标签,在该方法中编写标签代码逻辑)

在setJSPBody方法中传入对象JSPFragment,该对象封装了标签体内容,控制标签体内容输出

最重要方法invoke(Writer out) 意义将标签体内容输出到指定字符输出流中。

注意:在简单标签库中<bodyContent>不能写JSP,而必须写scriptless

SimpleTag接口方法的执行顺序:

当web容器开始执行标签时,会调用如下方法完成标签的初始化:

WEB容器调用标签处理器对象的setJspContext方法,将代表JSP页面的pageContext对象传递给标签处理器对象。

WEB容器调用标签处理器对象的setParent方法,将父标签处理器对象传递给这个标签处理器对象。注意,只有在标签存在父标签的情况下,WEB容器才会调用这个方法。

如果调用标签时设置了属性,容器将调用每个属性对应的setter方法把属性值传递给标签处理器对象。如果标签的属性值是EL表达式,则WEB容器首先计算表达式的值,然后把值传递给标签处理器对象。

如果简单标签有标签体,容器将调用setJSPBody方法把代表标签体的JspFragment对象传递进来。

执行标签时:

容器调用标签处理器的doTag() 方法,开发人员在方法内通过操作JspFragment对象,就可以实现是否执行、迭代、修改标签体的目的。



JSPFragment类

(1)javax.servlet.jsp.tagext.JspFragment类是在JSP2.0中定义的,它的实例对象代表JSP页面中的一段符合JSP语法规范的JSP片段,这段JSP片段中不能包含JSP脚本元素。

(2)WEB容器在处理简单标签的标签体时,会把标签体内容用一个JspFragment对象表示,并调用标签处理器对象的setJSPBody方法把JspFragment对象传递给标签处理器对象。JspFragment类中只定义了两个方法,如下所示:

getJspContext方法:用于返回代表调用页面的JspContext对象——pageContext

public abstract void invoke(java.io.Writer out) 输出标签内容

用于执行JspFragment对象所代表的JSP代码片段

参数out用于指定将JspFragment对象的执行结果写入到哪个输出流对象中,如果传递给参数out的值为null,则 将执行结果写入到JspContext.getOut()方法返回的输出流对象中。(简而言之,可以理解为写给浏览器)

invoke方法详解

JspFragment.invoke方法是JspFragment最重要的方法,利用这个方法可以控制是否执行和输出标签体的内容、是否迭代执行标签体的内容或对标签体的执行结果进行修改后再输出。例如:

在标签处理器中如果没有调用JspFragment.invoke方法,其结果就相当于忽略标签体内容;

在标签体处理器中重复调用JspFragment.invoke方法,则标签体内容会被重复执行;

若想在标签处理器中修改标签体内容,只需在调用invoke方法时指定一个可取出结果数据的输出流对象(例如:StringWriter),让标签体的执行结果输出到该输出流对象中,然后从该输出流对象中取出数据进行修改后在输出到目标设备,即可达到修改标签体的目的。

例:控制标签后的jsp页面是否执行

doTag

throw new SkipPageException

TLD配置

<tag>

<name>demo2</name>

<tag-class>simple.MyTag2</tag-class>

<body-content>empty</body-content>

</tag>

自定义标签入门

需求:自定义标签<myc:print>在页面中输出hello

步骤一:编写标签类

编写一个类,继承SimpleTagSupport

重写两个方法,doTag()和setJspContext(JspContext pc)

通过JspContext 对象可以获取out对象向外输出内容

步骤二:提供tld文件进行配置

通过<tag>标签配置自定义标签

配置标签名称<name>print</name>

配置标签的类<tag-class>xxx.xxx.xxx</tag-class>

配置标签体的内容<body-content>empty</body-content>

步骤三:在JSP页面中引入该标签库

自定义带有标签体的标签

需求:自定义标签<myc:out>在页面中输出内容

步骤一:编写标签类

编写一个类,继承SimpleTagSupport

重写两个方法,doTag()和setJspContext(JspContext pc)

在doTag()中通过getJspBody()获取JspFragment标签体,调用invoke(null)

步骤二:提供tld文件进行配置

通过<tag>标签配置自定义标签

配置标签名称<name>out</name>

配置标签的类<tag-class>xxx.xxx.xxx</tag-class>

配置标签体的内容<body-content>scriptless</body-content>

步骤三:在JSP的页面中引入该标签库

Body-content的配置

<body-content>元素的可选值有:

empty:不能有标签体内容

JSP:标签体内容可以是任何东西:EL、JSTL、<%= %>、<%%>,以及HTML;但不建议使用Java代码段,SimpleTag已经不再支持使用<body-content>JSP</body-content>

scriptless:标签体内容不能是Java代码段,但可以是EL、JSTL等。

tagdependent:标签体内容不做运算,由标签处理类自行处理,无论标签体内容是EL、JSP、JSTL,都不会做运算。

自定义带有属性的标签

需求:自定义标签<myc:if>在页面中输出内容

步骤一:编写标签类

编写一个类,继承SimpleTagSupport类。

提供页面的属性,设置成boolean类型。并提供set方法,页面的属性与类中的属性名称必须相同。

重写doTag()方法,判断属性是否为true,通过getJspBody()获取JspFragment标签体,调用invoke(null)

步骤二:提供tld文件进行配置

通过<tag>标签配置自定义标签

配置标签名称<name>if</name>

配置标签的类<tag-class>xxx.xxx.xxx</tag-class>

配置标签体的内容<body-content>scriptless</body-content>

配置属性<attribute>在属性中配置其他信息</attribute>

步骤三:在JSP页面中引入标签库

attribute的配置

(1)配置属性名称

<name>test</name>

(2)属性是否是必须的

<required>true</required>

(3)配置是否支持EL表达式

<rtexprvalue>true</rtexprvalue>

(4)配置属性的类型

<type>boolean</type>

在TLD中描述标签属性attribute

元素名是否必须指定描述
description用于指定属性的描述信息
name用于指定属性的名称。属性名称是大小写敏感的,并且不能以jsp、
_jsp、java和sun开头
required用于指定在JSP页面中调用自定义标签时是否必须设置这个属性。其
取值包括true和false,默认值是false,true表示必须设置,否则可以
设置也可以不设置该属性。
rtexprvaluertexprvalue是runtime expression value(运行时表达式)的英文简写,
用于指定属性值是一个静态值或动态值。其取值包括true和false,默认值
是false,false表示只能为该属性指定静态文本值,例如"123"; true表示可
以为该属性指定一个JSP动态元素,动态元素的结果作为属性值,例如
JSP表达式<%=value %>
type用于指定属性值的Java类型。默认是String
<tag>元素的<attribute>子元素用于描述自定义
标签的一个属性,自定义标签所具有的每个属性
都要对应一个<attribute>元素 。
<attribute>
<description>description</description>
<name>aaaa</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
<type>ObjectType</type>
</attribute>

实例如下:

在WEB项目的src目录下新建cn.itcast.tag包,在包内新建三个标签实现类

TagDemo1.java (没有标签体的自定义标签)

package cn.itcast.tag;

import java.io.IOException;

import javax.servlet.jsp.JspContext;

import javax.servlet.jsp.JspException;

import javax.servlet.jsp.PageContext;

import javax.servlet.jsp.tagext.SimpleTagSupport;

/**

* 对外输出Hello

* @author Administrator

*

*/

public class TagDemo1 extends SimpleTagSupport{

private PageContext pc;

public void doTag() throws JspException, IOException {

pc.getOut().write("Hello");

}

/**

* 服务器默认先执行该方法

*/

public void setJspContext(JspContext pc) {

this.pc = (PageContext) pc;

}

}


TagDemo2.java (有标签体 处理标签体内容):

package cn.itcast.tag;

import java.io.IOException;
import java.io.StringWriter;

import javax.servlet.jsp.JspContext;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.SimpleTagSupport;

/**
* 带有标签主体
* @author Administrator
*
*/
public class TagDemo2 extends SimpleTagSupport{

private PageContext pc;

public void doTag() throws JspException, IOException {
JspFragment jf = getJspBody();
StringWriter sw = new StringWriter();
//通过invoke方法将标签体内容写入到参数Writer对象sw中
jf.invoke(sw);
// 获取标签体内容
String content = sw.toString().toUpperCase();
pc.getOut().print(content);
}

public void setJspContext(JspContext pc) {
this.pc = (PageContext)pc;
}
}

TagDemo3.java (有属性 有标签体的自定义标签)

package cn.itcast.tag;

import java.io.IOException;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;

/**
* 类似<c:if>标签,带有属性的
* @author Administrator
*
*/
public class TagDemo3 extends SimpleTagSupport{

private boolean test;

public void setTest(boolean test) {
this.test = test;
}

public void doTag() throws JspException, IOException {
if(test){
getJspBody().invoke(null);
}
}

}

在WebRoot/WEB-INF 目录下新建myc.tld文件

配置内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.0" xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"> <tlib-version>1.0</tlib-version>
<short-name>myc</short-name>
<uri>http://www.itcast.cn/1110/myc</uri>

<!-- 配置自定义标签 -->
<tag>
<!-- 配置标签名称 -->
<name>print</name>
<!-- 配置标签的类 -->
<tag-class>cn.itcast.tag.TagDemo1</tag-class>
<!-- 配置标签主体 -->
<body-content>empty</body-content>
</tag>

<!-- 配置自定义标签 -->
<tag>
<!-- 配置标签名称 -->
<name>out</name>
<!-- 配置标签的类 -->
<tag-class>cn.itcast.tag.TagDemo2</tag-class>
<!-- 配置标签主体 -->
<body-content>scriptless</body-content>
</tag>

<!-- 配置自定义标签 -->
<tag>
<!-- 配置标签名称 -->
<name>if</name>
<!-- 配置标签的类 -->
<tag-class>cn.itcast.tag.TagDemo3</tag-class>
<!-- 配置标签主体 -->
<body-content>scriptless</body-content>
<!-- 配置属性 -->
<attribute>
<!-- 配置属性名称 -->
<name>test</name>
<!-- 属性是否是必须的 -->
<required>true</required>
<!-- 是否支持EL表达式 -->
<rtexprvalue>true</rtexprvalue>
<!-- 属性的类型 -->
<type>boolean</type>
</attribute>
</tag>

</taglib>

在WebRoot下新建tag文件夹,新建tag.jsp 测试自定义标签内容

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>

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

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>

<myc:print/>

<myc:out>
liuxun1993
</myc:out>

<c:set var="i" value="10"></c:set>
<myc:if test="${ i eq 10 }">
美美
</myc:if>

</body>
</html>


启动服务器,运行结果如下:



从一下地址整理所得:https://blog.csdn.net/u013087513/article/details/54847678
http://www.runoob.com/jsp/jsp-jstl.html https://www.cnblogs.com/blog-yuesheng521/p/5468624.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: