00 06JSP學習之自定義標籤

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>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章