1 自定義標籤入門
1、自定義標籤的步驟
(1)標籤處理類(標籤也是一個對象,那麼就需要先有類)。
(2)tld文件,它是一個xml。
(3)在頁面中使用taglib來指定tld文件的位置。
2、標籤處理類(SimpleTag接口)
(1)接口定義:
public interface SimpleTag extends JspTag{}
(2)方法:
|——void doTag():每次執行標籤時都會調用這個方法。
|——JspTag getParent():返回父標籤。(非生命週期方法)
|——void setParent(JspTag):設置父標籤。
|——void setJspBody(JspFragment):設置標籤體。
|——void setJspContext(JspContext):設置JSP上下文對象,它兒子是PageContext。
其中doTag()會在其他三個方法之後被tomcat調用。
package org.lks.tag;
import java.io.IOException;
import javax.servlet.jsp.JspContext;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.JspTag;
import javax.servlet.jsp.tagext.SimpleTag;
public class MyTag1 implements SimpleTag {
private JspFragment body;
private JspContext context;
@Override
public void doTag() throws JspException, IOException {
this.context.getOut().print("hello, i'm tag");
}
@Override
public JspTag getParent() {
// TODO Auto-generated method stub
return null;
}
@Override
public void setJspBody(JspFragment body) {
this.body = body;
}
@Override
public void setJspContext(JspContext context) {
this.context = context;
}
@Override
public void setParent(JspTag arg0) {
// TODO Auto-generated method stub
}
}
3、tld文件配置
tld文件一般都放到WEB-INF之下,這樣保證客戶端訪問不到。
<tag>
<name>...</name> <!-- 指定當前標籤的名稱 -->
<tag-calss>...</tag-class> <!-- 指定當前標籤的標籤處理類 -->
<body-content>...</body-content> <!-- 指定標籤體的類型 -->
</tag>
<tag>
<name>mytag1</name>
<tag-class>org.lks.tag.MyTag1</tag-class>
<body-content>empty</body-content>
</tag>
4、導標籤庫
導標籤庫,就是爲頁面指定tld文件的位置。
<%@ taglib prefix="lks" uri="/WEB-INF/tlds/mytag.tld" %>
2 自定義標籤之標籤體內容類型
1、標籤體內容
(1)empty:無標籤體。
(2)JSP:jsp2.0已經不再支持,標籤體內容可以是java腳本、標籤、EL表達式。
(3)scriptless:只能是EL表達式,也可以是其他的標籤。
(4)tagdependent:標籤體內容不會被執行,而是直接賦值標籤處理類。
測試頁面:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="lks" uri="/WEB-INF/tlds/mytag.tld" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MyTag Test</title>
</head>
<body>
<h1><lks:mytag1 /></h1>
<h2><lks:mytag2>${param.info }</lks:mytag2></h2>
</body>
</html>
tag類:
package org.lks.tag;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;
public class MyTag2 extends SimpleTagSupport {
@Override
public void doTag() throws JspException, IOException {
this.getJspBody().invoke(this.getJspContext().getOut());
}
}
3 自定義標籤之SkipPageException
在標籤處理類中的doTag()中使用SkipPageException來結束。因爲Tomcat會調用處理類中的doTag()方法,然後Tomcat會得到SkipPageException,它會跳過本頁面其他內容。
Tag類:
package org.lks.tag;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.SkipPageException;
import javax.servlet.jsp.tagext.SimpleTagSupport;
public class MyTag3 extends SimpleTagSupport {
@Override
public void doTag() throws JspException, IOException {
this.getJspContext().getOut().print("Nothing!!"); //如果invoke的參數爲null,則相當於this.getJspContent().getOut()
throw new SkipPageException(); //拋出SkipPageException會跳過此自定義標籤以下的內容而不是輸出至瀏覽器
}
}
測試:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="lks" uri="/WEB-INF/tlds/mytag.tld" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MyTag Test</title>
</head>
<body>
<h1><lks:mytag3/></h1>
<h1><lks:mytag1/></h1>
<h2><lks:mytag2>${param.info }</lks:mytag2></h2>
</body>
</html>
4 自定義標籤之帶有屬性的標籤
1、步驟:
(1)給標籤處理類添加屬性。
package org.lks.tag;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;
public class MyTag4 extends SimpleTagSupport {
private Boolean test;
public Boolean isTest() {
return this.test;
}
public void setTest(Boolean test) {
this.test = test;
}
@Override
public void doTag() throws JspException, IOException {
if(test) {
this.getJspBody().invoke(null);
}
}
}
(2)在tld文件中對屬性進行配置。
<tag>
<name>mytag4</name>
<tag-class>org.lks.tag.MyTag4</tag-class>
<body-content>scriptless</body-content>
<attribute>
<name>test</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
測試:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="lks" uri="/WEB-INF/tlds/mytag.tld" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MyTag Test</title>
</head>
<body>
<lks:mytag4 test="${empty param.info }">
<h1><lks:mytag3/></h1>
</lks:mytag4>
<h1><lks:mytag1/></h1>
<h2><lks:mytag2>${param.info }</lks:mytag2></h2>
</body>
</html>