一自定义标签:
1.JSP标签的形式:
开始标记 主体 结束标记
<前缀:标签名 [属性名="值"...]>主体</前缀:标签名>
<前缀:标签名 [属性名="值"...] />
2.自定义标签的执行过程
jsp --> servlet
<jsp:useBean .../> --> 标签处理类(Java类)
3.两种方式的处理类实现:
1)传统标签类:
a)只能决定是否显示主体内容 TagSupport:
<my:Tag1 att="value" - setAtt(..)
doStartTag() att2="value"> - setAtt2(..)
doAfterBody() body content
doEndTag() </my:Tag1>
执行流程:
1. 遇到开始标记: 调用属性的set方法,把属性的值传到处理类中,然后调用doStartTag()
2. 如果doStartTag()返回 SKIP_BODY(要求JSP容器忽略主体内容)直接跳到第4步。
EVAL_BODY_INCLUDE(要求JSP容器要显示标签主体内容)执行第3步
3. 显示主体内容,然后调用doAfterBody(),如果它返回SKIP_BODY,它就执行第4步,如果它返回EVAL_BODY_AGAIN,重复执行主体内容.
4. 遇到结束标记,调用doEndTag(),返回EVAL_PAGE,它就继续处理剩下的页面,如果返回SKIP_PAGE,这个标签之后的所有内容不再处理。
b)还可以决定是否更改主体内容 BodyTagSupport:
<my:Tag1 att="value" - setAtt(..)
doStartTag() att2="value"> - setAtt2(..)
doAfterBody() body content - doInitbody(), setBodyContent() 缓存主体内容
doEndTag() </my:Tag1>
执行流程:
1. 遇到开始标记: 调用属性的set方法,把属性的值传到处理类中,然后调用doStartTag()
2. 如果doStartTag()返回 SKIP_BODY(要求JSP容器忽略主体内容)直接跳到第4步。
EVAL_BODY_INCLUDE(要求JSP容器要显示标签主体内容)执行第3步
EVAL_BODY_BUFFERED , 就会执行setBodyContent()和doInitBody()
3. 显示主体内容,然后调用doAfterBody(),如果它返回SKIP_BODY,它就执行第4步,如果它返回EVAL_BODY_AGAIN,重复执行主体内容.
4. 遇到结束标记,调用doEndTag(),返回EVAL_PAGE,它就继续处理剩下的页面,如果返回SKIP_PAGE,这个标签之后的所有内容不再处理。
2)简单标签处理类:SimpleTagSupport: doTag()
与传统标签处理类不同之处,页面中每遇到一次对应的标签时,容器都要创建一个实例。而传统标签处理类是针对一类标签只有一个处理类的实例。
简单标签处理类在tld文件中声明<body-content>时,不能使用JSP,只能是empty,scriptless, tagdependent中的一个值。
4. 标签库描述文件xxx.tld放置在WEB-INF或jar包的META-INF下:
5. 在页面的使用:
1)导入标签库描述文件:<%@ taglib uri="指定在tld文件中声明的url"
prefix="指定引用自定义标签的前缀" %>
2)使用自定义的标签: <前缀:标签名 ...></前缀:标签名>
6. 自定义标签示例:
1) <my:hello name="zs"/> - 页面显示:hello: zs TagSupport
2) <my:upper count="3">hello,world</my:upper> -页面显示效果: HELLO,WORLD HELLO,WORLD HELLO,WORLD - BodyTagSupport
3) <my:if test="true|false">主体内容</my:if> 如果test为true,就执行主体内容,否则不执行主体 - SimpleTagSupport
4) 数据分页的自定义标签
<my:pager pageSize="10" pageNo="1" recordCount="100" url="index.jsp" />
7.自定义标签打包:
-->jar包 用winrar来打成xxx.zip改成xxx.jar
|-- 处理类的字节码
|--META-INF
|-- MANIFEST.MF
|-- XXX.tld
8. 用标签文件实现自定义标签:--功能不够强大。
二JSTL:JSP标准标签库
1. <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 完成一些通用的功能
1). <c:out value="${}" /> 会把一些HTML的特殊字符进行转换
2). <c:set value="..." var="变量" scope=""/>
3). <c:if test="布尔表达式" var="">....</c:if>
4). <c:choose>
<c:when test="">...</c:when>
<c:when test="">...</c:when>
<c:otherwise>...</c:otherwise>
</c:choose>
★5). <c:forEach var="i" begin="1" end="100" step="1">${i}</c:forEach>
<c:forEach var="str" items="${requestScope.list}"> ${str}</c:forEach>
<c:forEach var="str" items="${requestScope.list}" varStatus="s">
${s.index}-${s.count}-${str}
</c:forEach>
6). <c:forTokens />
7). <c:url value="URL路径" var="" scope="">
<c:param name="名" value="值"/>
</c:url> --> URL路径?名=值 ;不支持Cookie: URL路径;sessionid=xxxx?名=值
2. <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> 国际化和格式化
格式化:<fmt:formatNumber/> <fmt:formatDate/>
<fmt:formatDate value="${date}" type="both"/>
国际化:<fmt:setLocale> <fmt:bundle> <fmt:setBundle> <fmt:message>
3. <%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %> 操作数据库
4. <%@ taglib uri="http://java.sun.com/jsp/jstl/xml" prefix="xml" %> 操作XML文件
5. <%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> 一些函数的调用.只能用在EL中 ${fn:xxx(...)}
${fn:length(collection)}, ${fn:trim(string)}
1.JSP标签的形式:
开始标记 主体 结束标记
<前缀:标签名 [属性名="值"...]>主体</前缀:标签名>
<前缀:标签名 [属性名="值"...] />
2.自定义标签的执行过程
jsp --> servlet
<jsp:useBean .../> --> 标签处理类(Java类)
3.两种方式的处理类实现:
1)传统标签类:
a)只能决定是否显示主体内容 TagSupport:
<my:Tag1 att="value" - setAtt(..)
doStartTag() att2="value"> - setAtt2(..)
doAfterBody() body content
doEndTag() </my:Tag1>
执行流程:
1. 遇到开始标记: 调用属性的set方法,把属性的值传到处理类中,然后调用doStartTag()
2. 如果doStartTag()返回 SKIP_BODY(要求JSP容器忽略主体内容)直接跳到第4步。
EVAL_BODY_INCLUDE(要求JSP容器要显示标签主体内容)执行第3步
3. 显示主体内容,然后调用doAfterBody(),如果它返回SKIP_BODY,它就执行第4步,如果它返回EVAL_BODY_AGAIN,重复执行主体内容.
4. 遇到结束标记,调用doEndTag(),返回EVAL_PAGE,它就继续处理剩下的页面,如果返回SKIP_PAGE,这个标签之后的所有内容不再处理。
b)还可以决定是否更改主体内容 BodyTagSupport:
<my:Tag1 att="value" - setAtt(..)
doStartTag() att2="value"> - setAtt2(..)
doAfterBody() body content - doInitbody(), setBodyContent() 缓存主体内容
doEndTag() </my:Tag1>
执行流程:
1. 遇到开始标记: 调用属性的set方法,把属性的值传到处理类中,然后调用doStartTag()
2. 如果doStartTag()返回 SKIP_BODY(要求JSP容器忽略主体内容)直接跳到第4步。
EVAL_BODY_INCLUDE(要求JSP容器要显示标签主体内容)执行第3步
EVAL_BODY_BUFFERED , 就会执行setBodyContent()和doInitBody()
3. 显示主体内容,然后调用doAfterBody(),如果它返回SKIP_BODY,它就执行第4步,如果它返回EVAL_BODY_AGAIN,重复执行主体内容.
4. 遇到结束标记,调用doEndTag(),返回EVAL_PAGE,它就继续处理剩下的页面,如果返回SKIP_PAGE,这个标签之后的所有内容不再处理。
2)简单标签处理类:SimpleTagSupport: doTag()
与传统标签处理类不同之处,页面中每遇到一次对应的标签时,容器都要创建一个实例。而传统标签处理类是针对一类标签只有一个处理类的实例。
简单标签处理类在tld文件中声明<body-content>时,不能使用JSP,只能是empty,scriptless, tagdependent中的一个值。
4. 标签库描述文件xxx.tld放置在WEB-INF或jar包的META-INF下:
5. 在页面的使用:
1)导入标签库描述文件:<%@ taglib uri="指定在tld文件中声明的url"
prefix="指定引用自定义标签的前缀" %>
2)使用自定义的标签: <前缀:标签名 ...></前缀:标签名>
6. 自定义标签示例:
1) <my:hello name="zs"/> - 页面显示:hello: zs TagSupport
2) <my:upper count="3">hello,world</my:upper> -页面显示效果: HELLO,WORLD HELLO,WORLD HELLO,WORLD - BodyTagSupport
3) <my:if test="true|false">主体内容</my:if> 如果test为true,就执行主体内容,否则不执行主体 - SimpleTagSupport
4) 数据分页的自定义标签
<my:pager pageSize="10" pageNo="1" recordCount="100" url="index.jsp" />
7.自定义标签打包:
-->jar包 用winrar来打成xxx.zip改成xxx.jar
|-- 处理类的字节码
|--META-INF
|-- MANIFEST.MF
|-- XXX.tld
8. 用标签文件实现自定义标签:--功能不够强大。
二JSTL:JSP标准标签库
1. <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 完成一些通用的功能
1). <c:out value="${}" /> 会把一些HTML的特殊字符进行转换
2). <c:set value="..." var="变量" scope=""/>
3). <c:if test="布尔表达式" var="">....</c:if>
4). <c:choose>
<c:when test="">...</c:when>
<c:when test="">...</c:when>
<c:otherwise>...</c:otherwise>
</c:choose>
★5). <c:forEach var="i" begin="1" end="100" step="1">${i}</c:forEach>
<c:forEach var="str" items="${requestScope.list}"> ${str}</c:forEach>
<c:forEach var="str" items="${requestScope.list}" varStatus="s">
${s.index}-${s.count}-${str}
</c:forEach>
6). <c:forTokens />
7). <c:url value="URL路径" var="" scope="">
<c:param name="名" value="值"/>
</c:url> --> URL路径?名=值 ;不支持Cookie: URL路径;sessionid=xxxx?名=值
2. <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> 国际化和格式化
格式化:<fmt:formatNumber/> <fmt:formatDate/>
<fmt:formatDate value="${date}" type="both"/>
国际化:<fmt:setLocale> <fmt:bundle> <fmt:setBundle> <fmt:message>
3. <%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %> 操作数据库
4. <%@ taglib uri="http://java.sun.com/jsp/jstl/xml" prefix="xml" %> 操作XML文件
5. <%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> 一些函数的调用.只能用在EL中 ${fn:xxx(...)}
${fn:length(collection)}, ${fn:trim(string)}