JAVAWEB开发之JSTL标签库的使用、 自定义EL函数、自定义标签(带属性的、带标签体的)
JSTL
- 核心标签库(core)---c(重点)
- XML(x:操作xml的标签库)
- SQL(sql标签库)
- FMT(fmt:国际化标签库)
- JSTL函数(EL函数)el
<c:out>标签
属性名 | 是否支持EL | 属性类型 | 属性描述 |
value | true | Object | 指定要输出的内容 |
escapeXml | true | Boolean |
指定是否将>、<、&、'、" 等 特殊字符进行HTML编码转换 后再进行输出。默认值是true。 |
default | true | Object | 指定如果value属性的值为null时所输出的默认值 |
<!-- c:out 输出数据到浏览器 -->
<c:out value="Hello c out "></c:out>
Hello c out
<!-- 输出一个变量 -->
<c:set var="m" value="10" scope="page"/>
<c:out value="${m}"></c:out>
${m }
<!-- 转义HTML 默认转义,通过设置escapeXml 为false 不进行转义-->
<c:out value="<a href='xxx'>link</a>" />
${fn:escapeXml("<a href='xxx'>link</a>") }
<!-- 允许输出默认值 ,如果city不存在,输出北京-->
<c:out value="${city}" default="北京"></c:out>
${empty city?"北京":city }
实例代码如下:
<%@ 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 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><h4>传统方式</h4>
<%= "Hello" %>
<%int a = 10;request.setAttribute("name", "xy");
%>
<%= a %><h4>JSTL的方式 </h4>
<c:out value="Hello"></c:out>
<c:out value="${name }"></c:out>
<!-- "" -->
<c:out value="${ city }" default="北京"></c:out>
<c:out value="<a href='#'>超链接</a>" escapeXml="false"/>
<c:out value="<a href='#'>超链接2</a>" escapeXml="true"/></body>
</html>
<c:set>标签
- 向4个域中存入值。(var value scope属性)
- 设置Web域中的java.util.Map 类型的属性对象或JavaBean类型的属性对象的属性(target property value属性)
属性名 | 是否支持EL | 属性类型 | 属性描述 |
value | true | Object | 用于指定属性 |
var | false | String | 用于指定要设置的Web域属性的名称 |
scope | false | String | 用于指定属性所在的Web域 |
target | true | Object |
用于指定要设置属性的对象,这个对象必须是 JavaBean对象或java.util.Map对象 |
property | true | String | 用于指定当前要为对象设置的属性名称 |
<%@page import="cn.itcast.vo.User"%>
<%@ 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 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><h4>传统方式</h4>
<%pageContext.setAttribute("name", "10", pageContext.REQUEST_SCOPE);%><%User user = new User();user.setUsername("美美");user.setPassword("123");request.setAttribute("user", user);
%>
${ user.username }<h4>JSTL方式</h4>
<c:set var="i" value="10" scope="request" ></c:set>
${ i }<c:set target="${ user }" property="username" value="小凤"></c:set>
${ user.username }</body>
</html>
<c:remove>标签
request.setAttribute("age",20);
// 删除age
request.removeAttribute("age");
%>
<c:set var="age" value="20" scope="request"></c:set>
<c:remove var="age" scope="request"/>
<%@ 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 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><h4>传统方式</h4>
<%request.setAttribute("name", "美美");request.removeAttribute("name");
%><c:set var="name" value="小凤" scope="page"></c:set>
${ name }<c:remove var="name" scope="page"/>
${name }</body>
</html>
<c:catch>标签
- <c:catch>标签用于捕获嵌套在标签中的内容抛出的异常,其语法格式如下:<c:catch [var="varName"]> nested actions </c:catch>
- var属性用于标识<c:catch>标签捕获的异常对象,它将保存在page这个web域中。
<%@ page contentType="text/html;charset=gb2312" %>
<c:catch var="myex“ >
<%
10/0;
%>
</c:catch>
异常:<c:out value="${myex}" /> ${myex}<br />
异常 myex.getMessage:<c:out value="${myex.message}" /><br />
异常 myex.getCause:<c:out value="${myex.cause}" /><br />
异常 myex.getStackTrace:<c:out value="${myex.stackTrace}" />
<%@ 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 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><h4>传统方式</h4>
<%try{}catch(Exception e){e.printStackTrace();}
%><h4>JSTL的方式</h4>
<c:catch var="e"><%int a = 10/0;%>
</c:catch>
${ e.message }</body>
</html>
<c:if>标签
属性名 | 是否支持EL | 属性类型 | 属性描述 |
test | true | boolean | 决定是否处理标签体中的内容的条件表达式 |
var | false | String | 用于指定将test属性的执行结果保存到某个Web域中的某个属性的名称 |
scope | false | String | 指定将test属性的执行结果保存到哪个Web域中 |
注意:没有<c:else>
<%@ 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 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><h4>传统方式</h4>
<%int a = 10;if(a >= 10){out.print("a >= 10");}else{out.print("a < 10");}
%><h4>JSTL方式</h4>
<c:set var="i" value="10" scope="page"></c:set>
<c:if test="${ i ge 10 }" var="x" scope="page">i >= 10
</c:if>
<c:if test="${ i lt 10 }">i < 10
</c:if>${ x }</body>
</html>
<c:choose>
<%@ 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>
<%@ 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 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><h4>获取参数</h4>
<%= request.getParameter("username") %><h4>传统方式</h4>
<%int a = 10;if(a >= 10 ){out.print("a >= 10");}else if(a < 10){out.print("a < 10");}else{out.print("其他");}
%><h4>JSTL方式</h4>
<c:set var="i" value="10" scope="page"></c:set>
<c:choose><c:when test="${ i ge 10 }">i >= 10</c:when><c:when test="${ i lt 10 }">i < 10</c:when><c:otherwise>其他</c:otherwise>
</c:choose></body>
</html>
<c:forEach>标签
属性名 | 是否支持EL | 属性类型 | 属性描述 |
var | false | String | 指定将当前迭代到的元素保存到page这个域中的属性名称 |
varStatus | false | String | 记住用于保存迭代信息的对象 |
items | true | 任何支持的类型 | 将要迭代的集合对象 |
begin | true | int |
如果指定items属性,就从集合中的第begin个元素开始进行迭代 ,begin的索引值从0开始编号,如果没有指定items属性,就从 begin指定的值开始迭代,直到end值时结束迭代 |
end | true | int | 与begin属性类似 |
step | true | int | 指定迭代的步长,即迭代因子的迭代增量 |
<c:forEach>迭代数据
<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属性:
属性 | 类型 | 意义 |
index | number | 现在指到成员的索引 |
count | number | 总共指到成员的总数 |
first | boolean | 现在指到的成员是否是第一个成员 |
last | boolean | 现在指到的成员是否是最后一个成员 |
遍历10到100的偶数,每到第三个数,显示红色:
<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>
在WebRoot/jstl目录下新建forEach.jsp
<%@page import="cn.itcast.vo.User"%>
<%@page import="java.util.HashMap"%>
<%@page import="java.util.Map"%>
<%@page import="java.util.ArrayList"%>
<%@page import="java.util.List"%>
<%@ 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 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><h4>遍历数组</h4>
<%String [] arrs = {"美美","小凤","芙蓉","小苍"};request.setAttribute("arrs", arrs);
%>
<!-- for(String s : arrs){ } -->
<c:forEach var="s" items="${ arrs }">${ s }
</c:forEach><h4>遍历集合</h4>
<%List<String> list = new ArrayList<String>();list.add("美美");list.add("小凤");list.add("芙蓉");list.add("小泽");request.setAttribute("list", list);
%>
<c:forEach var="s" items="${ list }">${ s }
</c:forEach><h4>遍历Map集合</h4>
<%Map<String,String> map = new HashMap<String,String>();map.put("aa", "美美");map.put("bb", "小凤");map.put("cc", "芙蓉");request.setAttribute("map", map);
%>
<c:forEach var="entry" items="${ map }">${ entry.key } -- ${ entry.value }
</c:forEach><h4>遍历对象的集合</h4>
<%List<User> uList = new ArrayList<User>();uList.add(new User("美美","123"));uList.add(new User("小风","234"));uList.add(new User("芙蓉","345"));request.setAttribute("uList", uList);
%>
<c:forEach var="user" items="${ uList }">${ user.username } -- ${ user.password }
</c:forEach><h4>迭代数据</h4>
<h4>迭代从1到10</h4>
<c:forEach var="i" begin="1" end="10" step="2">${ i }
</c:forEach><h4>计算从1加到100的和</h4>
<c:set var="sum" value="0" scope="page"></c:set>
<c:forEach var="i" begin="1" end="100" step="1" varStatus="status"><c:set var="sum" value="${ sum + i }"></c:set>
</c:forEach>
${ sum }<h4>遍历10到100的偶数,每到第3个数,显示红色</h4>
<c:forEach var="i" begin="10" end="100" step="2" varStatus="status"><c:choose><c:when test="${ status.first }"><font color="blue">${ i }</font></c:when><c:when test="${ status.count % 3 eq 0 }"><font color="red">${ i }</font></c:when><c:otherwise>${ i }</c:otherwise></c:choose>
</c:forEach></body>
</html>
<c:forTokens>
名称 | 说明 | EL | 类型 | 必须 | 默认值 |
var | 用来存放现在指到的成员 | N | String | 否 | 无 |
items | 被迭代的字符串 | Y | String | 是 | 无 |
delims | 定义用来分割字符串的字符 | N | String | 是 | 无 |
varStatus | 用来存放现在指到的相关成员信息 | N | String | 否 | 无 |
begin | 开始的位置 | Y | int | 否 | 0 |
end | 结束的位置 | Y | int | 否 | 最后一个成员 |
<c:set var="s" value="aaa,bbb,ccc" scope="page"></c:set>
<c:forTokens items="${s}" delims="," var="e">
${e }
</c:forTokens>
items=要切分的字符串
delims=按着什么格式切分
var=定义变量
[varStatus="varStatusName"]
[begin="begin"]
[end="end"]
[step="step"]>
//body内容
</c:forTokens>
<%@ 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 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><h4>分隔字符串</h4>
<c:set var="i" value="aa,bb,cc" scope="page"></c:set>
<c:forTokens items="${i }" delims="," var="x">${ x }
</c:forTokens></body>
</html>
<c:param>标签
- 在JSP页面进行URL的相关操作时,经常要在URL地址后面附加一些参数。<c:param>标签可以嵌套在<c:import>、<c:url>或<c:redirect>标签内,为这些标签所使用的URL地址附加参数。
- <c:param>标签在为一个URL地址附加参数时,将自动对参数值进行URL编码,例如:如果传的参数值为“中国”,则将其转换为“%d6%d0%b9%fa”后再附加到URL地址后面,这也就是使用<c:param>标签的最大好处
- 示例:<c:param name="name" value="value" />
<c:import>标签
名称 | 说明 | EL | 类型 | 必须 | 默认值 |
url | 一文件被包含的地址 | Y | String | 是 | 无 |
context | 项目虚拟路径 | Y | String | 否 | 无 |
var | 储存被包含的文件的内容(以String类型存入) | Y | String | 否 | 无 |
scope | var变量的JSP范围 | N | String | 否 | page |
charEncoding | 被包含文件的内容的编码方式 | Y | String | 否 | 无 |
varReader | 储存被包含的文件的内容(以Reader类型存入) | N | String | 否 | 无 |
<!-- 引入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>
<!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><h4>JSTL方式</h4>
<c:import url="/jstl/choose.jsp" context="/day13" var="i" scope="page"><c:param name="username" value="meimei"></c:param>
</c:import>${ i }</body>
</html>
<c:url>标签
属性名 | 是否支持EL | 属性类型 | 属性描述 |
value | true | String | 指定要构造的URL |
var | false | String | 指定将构造出的URL结果保存到Web域中的属性名称 |
scope | false | String | 指定将构造出的URL结果保存在哪个域中 |
<%@ 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 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><h4>JSTL方式</h4>
<c:url var="i" value="/jstl/choose.jsp" scope="request" context="/day13"><c:param name="username" value="xiaofeng"></c:param>
</c:url>
<c:set var="s" value="刘勋" scope="session"></c:set>
<a href="${ i }">choose</a> <br>
i= ${i } <br>
<%String url = "/day12/index.jsp";url = response.encodeURL(url);
%><!-- 将/day8/index.jsp 进行url重写,保存page范围 myurl中 -->
<c:url value="/index.jsp" context="/day13" var="myurl" scope="page" />url= <%=url %> <br>
myurl= ${myurl } <br><!-- 通过c:url 结合 c:param 对中文完成URL编码 -->
<c:url value="/login" context="/day13" var="myurl2" scope="page"><c:param name="username" value="张三"></c:param>
</c:url>
myurl2= ${myurl2 } <br></body>
</html>
修改choose.jsp 如下:
<%@ 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 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>
<c:out value="${s }"></c:out>
<h4>获取参数</h4>
<%= request.getParameter("username") %><h4>传统方式</h4>
<%int a = 10;if(a >= 10 ){out.print("a >= 10");}else if(a < 10){out.print("a < 10");}else{out.print("其他");}
%><h4>JSTL方式</h4>
<c:set var="i" value="10" scope="page"></c:set>
<c:choose><c:when test="${ i ge 10 }">i >= 10</c:when><c:when test="${ i lt 10 }">i < 10</c:when><c:otherwise>其他</c:otherwise>
</c:choose></body>
</html>
禁用浏览器的cookie后,运行如下:
点击choose跳转到choose.jsp
<c:redirect>标签
属性名 | 是否支持EL | 属性类型 | 属性描述 |
url | true | String | 指定要转发或重定向到的目标资源的URL地址 |
context | true | String |
当要使用相对路径重定向到同一个服务器下的其他WEB应用程序中的 资源时,context属性指定其他WEB应用程序的名称 |
// 以前重定向
// response.sendRedirect("/day12/index.jsp");
%>
<c:redirect url="/index.jsp" context="/day12"></c:redirect>
<%@ 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 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><h4>JSTL方式</h4><c:redirect url="/jstl/choose.jsp" context="/day13"><c:param name="username" value="furong"></c:param>
</c:redirect></body>
</html>
EL函数库
JSTL中的常用EL函数
fn:toLowerCase
fn:toUpperCase
fn:trim
fn:length
fn:split
fn:join
fn:indexOf
fn:contains
fn:startsWith
fn:replace
fn:substring
fn:substringAfter
自定义EL函数开发步骤
开发EL function注意事项
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>
自定义标签
自定义标签简介
- 编写一个实现Tag接口的Java类(标签处理器)
- 编写标签库描述符(tld)文件,在tld文件中对标签处理器类描述成一个标签
- 参考Tomcat中example项目中的JSP部分
简单标签
- setJspContext方法:用于把JSP页面的pageContext对象传递给标签处理器对象。
- setParent方法:用于把父标签处理器对象传递给当前标签处理器对象。
- getParent方法:用于获得当前标签的父标签处理对象。
- setJspBody方法:用于把代表标签体的JspFragment对象传递给标签处理器对象。即传入标签体缓存对象(封装了标签体内容)
- doTag方法:用于完后所有标签逻辑,包括输出、迭代、修改标签体内容等。在doTag方法中可以抛出javax.servlet.jsp.SkipPageException异常,用于通知WEB容器不再执行JSP页面中位于结束标记后面的内容,这等效于在传统标签的doEndTag方法中返回Tag.SKIP_PAGE常量的情况。
SimpleTag接口方法的执行顺序:
- WEB容器调用标签处理器对象的setJspContext方法,将代表JSP页面的pageContext对象传递给标签处理器对象。
- WEB容器调用标签处理器对象的setParent方法,将父标签处理器对象传递给这个标签处理器对象。注意,只有在标签存在父标签的情况下,WEB容器才会调用这个方法。
- 如果调用标签时设置了属性,容器将调用每个属性对应的setter方法把属性值传递给标签处理器对象。如果标签的属性值是EL表达式,则WEB容器首先计算表达式的值,然后把值传递给标签处理器对象。
- 如果简单标签有标签体,容器将调用setJSPBody方法把代表标签体的JspFragment对象传递进来。
- 容器调用标签处理器的doTag() 方法,开发人员在方法内通过操作JspFragment对象,就可以实现是否执行、迭代、修改标签体的目的。
JSPFragment类
invoke方法详解
- 在标签处理器中如果没有调用JspFragment.invoke方法,其结果就相当于忽略标签体内容;
- 在标签体处理器中重复调用JspFragment.invoke方法,则标签体内容会被重复执行;
- 若想在标签处理器中修改标签体内容,只需在调用invoke方法时指定一个可取出结果数据的输出流对象(例如:StringWriter),让标签体的执行结果输出到该输出流对象中,然后从该输出流对象中取出数据进行修改后在输出到目标设备,即可达到修改标签体的目的。
自定义标签入门
自定义带有标签体的标签
Body-content的配置
- empty:不能有标签体内容
- JSP:标签体内容可以是任何东西:EL、JSTL、<%= %>、<%%>,以及HTML;但不建议使用Java代码段,SimpleTag已经不再支持使用<body-content>JSP</body-content>
- scriptless:标签体内容不能是Java代码段,但可以是EL、JSTL等。
- tagdependent:标签体内容不做运算,由标签处理类自行处理,无论标签体内容是EL、JSP、JSTL,都不会做运算。
自定义带有属性的标签
在TLD中描述标签属性attribute
元素名 | 是否必须指定 | 描述 |
description | 否 | 用于指定属性的描述信息 |
name | 是 |
用于指定属性的名称。属性名称是大小写敏感的,并且不能以jsp、 _jsp、java和sun开头 |
required | 否 |
用于指定在JSP页面中调用自定义标签时是否必须设置这个属性。其 取值包括true和false,默认值是false,true表示必须设置,否则可以 设置也可以不设置该属性。 |
rtexprvalue | 否 |
rtexprvalue是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>
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>
启动服务器,运行结果如下:
JAVAWEB开发之JSTL标签库的使用、 自定义EL函数、自定义标签(带属性的、带标签体的)相关推荐
- JAVAWEB开发之Session的追踪创建和销毁、JSP详解(指令,标签,内置对象,动作即转发和包含)、JavaBean及内省技术以及EL表达式获取内容的使用
Session的追踪技术 已知Session是利用cookie机制的服务器端技术,当客户端第一次访问资源时 如果调用request.getSession() 就会在服务器端创建一个由浏览器独享的ses ...
- Web---JSTL(Java标准标签库)-Core核心标签库、I18N国际化、函数库
前面为JSTL中的常用EL函数,后面的为具体演示实例! JSTL简介: JSTL(Java Standard Tag Library) –Java标准标签库. SUN公司制定的一套标准标签库的规范. ...
- 自定义EL函数、自定义JSTL标签
自定义EL函数 1.做一个类(静态) package com.maya.el;public class ELBiaoDaoShi {public static String TiHuan(String ...
- 自定义EL函数解决JSTL标签不足之处——按字节长度截取字符串
题外话:做过大型网站前台的Web开发程序员最头疼的事情就是前台首页的布局,这其中最最头疼的就是标题字符的截取的问题,虽然有fn:substring,但表现率以及对中文的支持均不够完善,其实最终还是归结 ...
- [转]EL函数、自定义EL函数、自定义标签
EL函数 1.EL函数的作用:操作字符串 2.在JSP页面中要引入EL函数库 <%@ taglib prefix="fn" uri="http://java.sun ...
- JAVAWEB开发之Session的追踪创建和销毁、JSP具体解释(指令,标签,内置对象,动作即转发和包括)、JavaBean及内省技术以及EL表达式获取内容的使用...
Session的追踪技术 已知Session是利用cookie机制的server端技术.当client第一次訪问资源时 假设调用request.getSession() 就会在server端创建一个由 ...
- JAVAWEB开发之JSP、EL、及会话技术(Cookie和Session)的使用详解
Servlet的缺点 开发人员要十分熟悉JAVA 不利于页面调试和维护(修改,重新编译) 很难利用网页设计工具进行页面设计(HTML内容导入到servlet中,用PrintWriter的对象进行输出) ...
- JAVAWEB开发之HttpServletResponse和HttpServletRequest详解(上)(各种乱码、验证码、重定向和转发)
HttpServletResponse简介 Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象.和代表响应的response对象 request和re ...
- JAVAWEB开发之SpringMVC详解(二)——高级开发、数据回显、参数绑定集合、图片上传、json交互、validation校验、异常处理、RESTful支持、拦截器
知识回顾 springmvc框架 用户请求url到DispatcherServlet前端控制器,相当于中央调度器,降低系统各组件之间的耦合度. DispatcherServlet前端控制器通过Hand ...
最新文章
- soapui工具_python接口自动化(四)--接口测试工具介绍(详解)
- spring aop使用详解
- JZOJ 3943. 【GDOI2015模拟11.29】环游世界
- GDCM:gdcm::Printer的测试程序
- python编写一个登陆验证程序_python项目实战:实现验证码登录网址实例
- HBase性能优化总结
- c语言成绩管理系统开题报告,学生信息管理系统,开题报告(共篇).doc
- spring security系列一:架构概述
- 就在这段时间让自己充实起来
- 中国成全球第二AI医疗交易国,上半年AI制药融资数等于去年全年 | 报告
- FIFO算法与LRU算法
- 实验五 单表查询(V2.0版)
- Android 字母导航条实现
- 玛雅Maya 2022 for Mac(三维动画制作软件)
- 【转】《风雨哈佛路》观后感
- linux最大lun空间,Linux上每个SCSI设备的最大LUN数目是多少(by quqi99)
- 大唐凌烟阁开国廿四将
- 抖音只有几十个播放量的原因是什么?
- msm8996平台的一些debug方法
- Java 首字母转大写,StringUtils.capitalize
热门文章
- RPA+AI打造智能政务雇员,来也科技助力数字化政府建设
- c语言输入输出语句题目,C语言题目解答8程序填空,不要改变与输入输出有关的语句输入一个 爱问知识人...
- 怎样在线做动图?一招教你快速完成gif动画制作
- python格式年月日_python日期格式
- 专注的力量 敬业的精神
- opencascade 获取鼠标选中对象
- 泰坦尼克船员生存预测
- 腾讯云后端 15 连问
- python csv模块 reader_Python的CSV模块
- 【深度首发】车萝卜CEO马斌斌:以一百万销量、一个亿营收为小目标,成为汽车市场的“后装之王”丨Xtecher封面