JSP总结二------tablig指令与自定义标签
<!--[if !supportLists]-->1.??????<!--[endif]-->taglib指令
在JSP页面中,可以直接使用JSP提供的一些动作元素标记来完成特定功能,如使用<jsp:include>包含一个文件。通过使用taglib指令,开发者就可以在页面中使用这些基本标记或自定义的标记来完成特殊的功能。
taglib指令的使用格式如下:
<%@taglib uri="tagURI" prefix="tagPrefix" %>
?
参数说明
?
uri属性:该属性指定了JSP要在web.xml文件中查找的标签库描述符,该描述符是一个标签描述文件(*.tld)的映射。在tld标签描述文件中定义了该标签库中的各个标签名称,并为每个标签指定一个标签处理类。另外,通过uri属性直接指定标签描述文件的路径,而无需在web.xml文件中进性配置,同样可以使用指定的标记。
?
prefix属性:该属性指定一个在页面中使用由uri属性指定的标签库的前缀。但是前缀命名不能为:jsp、jspx、java、javax、sun、servlet和sunw开发者可以通过前缀来引用标签库中的标签。
如
一个简单的使用JSTL的代码:
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<c:setvar="name" value="hello"/>
上述代码通过<c:set>标签将“hello”值赋给了变量“name”。
?
引入strut2的标签:
?<%@ tablig=”/struts-tag”? prefix=”s”%>
步骤如下
1) 实现自己的处理类,一般是从TagSupport,BodyTagSupport继承
2) 写自定义Tag的tld文件
3) web.xml中指定你的tld文件(现在的服务器可以不需要此步骤)
4) 在JSP页面使用自定义标签
?Tag.EVAL_BODY_INCLUDE 包含主体内容
??? ?? ???? ?? Tag.SKIP_BODY???? 不包含主体内容
??? ?? ???? ?? Tag.EVAL_PAGE??? ? 包含后面的页面内容?
??? ?? ???? ?? Tag.SKIP_PAGE???? 不包含主体的内容
package mytag;
?
import java.io.IOException;
?
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport;
?
public class OutputTag extends TagSupport {
??? private static final long serialVersionUID = -1696650192224172611L;
?
??? @Override
??? public int doStartTag() throws JspException {
?????? // TODO Auto-generatedmethod stub
?????? JspWriter out = this.pageContext.getOut();
?????? try {
?????????? out.println("HelloWorld!");
?????? } catch (IOException e) {
?????????? // TODO Auto-generatedcatch block
?????????? e.printStackTrace();
?????? }
?????? return super.doStartTag();
??? }
??? }
?
<?xml version="1.0"encoding="UTF-8"?>?
<!DOCTYPE taglib PUBLIC "-//SunMicrosystems, Inc.//DTD JSP Tag Library 1.2//EN" "web-jsptaglibrary_1_2.dtd" >?
<taglib>?
? <tlibversion>1.0</tlibversion>? <!-- 你自定义标签的版本数 -->?
? <jsp-version>1.2</jsp-version>? <!-- 指定你的JSP版本,扩张签是在JSP1.2之后兼容的 -->?
? <shortname>out</shortname> <!-- 标签的简写 -->?
? <tag>?
??? <name>tags</name>? <!-- 标签名字 -->?
??? <tagclass>mytag.OutputTag</tagclass>? <!-- 指定你的标签的类 -->?
? </tag>?
其中,标签库元素<taglib>属性:表格如下
<taglib>属性表格</taglib>
属性
描述
tlib-version
本标签库实现版本
jsp-version
标签库依赖的JSP版本
short-name
被JSP创作工具使用的一个短的默认名词
uri
指定这个标签库的uri信息
display-name
被工具使用的显示用的名字
small-icon
被工具使用的小图标
large-icon
被工具使用的大图标
description
本标签的描述
validator
TLD验证信息
listener
实践监听器规范
??? ??? tag标签相关属性:
tag标签相关属性表
属性
描述
name
tag标签唯一的名称
tag-class
tag标签的处理类
tei-class
body-content
标签主体的内容
display-name
显示的名称
small-icon
被工具使用的小图标
large-icon
被工具使用的大图标
description
本标签的描述
variable
脚本变量的信息
attribute
标签属性的信息
??? <jsp-config>
?????? <taglib>
?????????? <!--设置自定义标签的uri(不一定存在,但是一定要唯一),为页面的部署做好准备 -->
?????????? <taglib-uri>http://test.com/mytag.tld</taglib-uri>
?????????? <!--定位你的tld文件的相对路径?? -->
?????????? <taglib-location>/WEB-INF/mytag.tld</taglib-location>
?????? </taglib>
<%@ page language="java"import="java.util.*" pageEncoding="ISO-8859-1"%>
<%-- <%@ taglib uri="/WEB-INF/mytag.tld"prefix="out" %> --%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
? <head>
??? <base href="<%=basePath%>">
???
??? <title>My JSP 'index.jsp' starting page</title>
??? <meta http-equiv="pragma" content="no-cache">
??? <meta http-equiv="cache-control" content="no-cache">
??? <meta http-equiv="expires" content="0">???
??? <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
??? <meta http-equiv="description" content="This is my page">
??? <!--
??? <link rel="stylesheet"type="text/css" href="styles.css">
??? -->
? </head>
?
? <body>
??? <out:tags/>
? </body>
?<!--[endif]-->
package mytag;
?
?
import javax.servlet.jsp.JspTagException;
import javax.servlet.jsp.tagext.BodyContent;
import javax.servlet.jsp.tagext.BodyTagSupport;
?
public class PrintBodyTag extends BodyTagSupport {?
??? private int counts;?
??? ?
??? public PrintBodyTag() {?
??????? super();?
??? }?
?
??? public void setCounts(int counts) { ?
??????? this.counts = counts;?
??? }?
?
??? public int doStartTag() throws JspTagException {?
??????? System.out.println("doStartTag...");?
??????? if (counts > 0) {?
??????????? return EVAL_BODY_AGAIN;?
??????? } else {?
??????????? return SKIP_BODY;?
??????? }?
??? }?
?
??? public void setBodyContent(BodyContent bodyContent){?
??????? System.out.println("setBodyContent...");?
??????? this.bodyContent = bodyContent;?
??? }?
?
??? public void doInitBody() throws JspTagException {?
???? ???System.out.println("doInitBody....");?
??? }?
?
??? public int doAfterBody() throws JspTagException {?
??????? System.out.println("do After body..." + counts);?
??????? if (counts > 1) {?
??????????? counts--;?
??????????? return EVAL_BODY_AGAIN;?
??????? } else {?
??????????? return SKIP_BODY;?
??????? }?
??? }?
?
??? public int doEndTag() throws JspTagException {?
??????? System.out.println("do end Tag...");?
??????? try {?
??????????? if (bodyContent != null) {?
??????????????? bodyContent.writeOut(bodyContent.getEnclosingWriter());?
??????????? }?
??????? } catch (java.io.IOException e) {?
??????????? throw new JspTagException("IO Error: " +e.getMessage());?
??????? }?
??????? return EVAL_PAGE;?
??? }??
}
<?xml version="1.0"encoding="UTF-8"?>?
<!DOCTYPE taglib PUBLIC "-//SunMicrosystems, Inc.//DTD JSP Tag Library 1.2//EN" "web-jsptaglibrary_1_2.dtd" >?
<taglib>?
? <tlibversion>1.0</tlibversion>? <!-- 你自定义标签的版本数 -->?
? <jsp-version>1.2</jsp-version>? <!-- 指定你的JSP版本,扩张标签是在JSP1.2之后兼容的 -->?
? <shortname>out</shortname> <!-- 标签的简写 -->?
? <tag>?
??? <name>tags</name>? <!-- 标签名字 -->?
??? <tagclass>mytag.OutputTag</tagclass>? <!-- 指定你的标签的类 -->?
? </tag>
? <tag>?
??? <name>bodytags</name>? <!-- 标签名字 -->?
? ??<tagclass>mytag.PrintBodyTag</tagclass>? <!-- 指定你的标签的类 -->?
??? <attribute>?
??? <name>counts</name>?
??? <required>true</required>?
??? <rtexprvalue>true</rtexprvalue>?
??? </attribute>
? </tag>?
??? <out:bodytags counts="5">HHHHHHHHHHH
??? <br/>
<!--[endif]-->
doStartTag...
setBodyContent...
doInitBody....
do After body...5
do After body...4
do After body...3
do After body...2
do After body...1
do end Tag...
?