JSP自定義標籤

      由於之前學習JSP時只是瞭解可以自定義JSP標籤,但從沒自己定義和使用過,具體怎麼定義和使用不太清楚。最近,在項目過程中遇到一些問題,比如頁面中接收或傳遞的某個值需要進行其他處理,而這樣的處理在JSP頁面寫代碼又不太適合,在後臺處理再返回前臺又比較麻煩,於是想到了使用JSP的自定義標籤來解決這樣的問題,然後對JSP自定義標籤進行了簡單學習,在此做下記錄,並附上自己做的簡單示例,希望對有需要的朋友有所幫助。

       下面簡單說一下具體步驟:

1.不用多說都知道,創建Web工程,我的工程命名爲Tag;

2.創建JavaBean實體類Userinfo.java,代碼如下:

package com.util.bean;

public class Userinfo {

	private String userName;
	private int age;
	private String email;

	public String getUserName() {
		return userName;
	}

	public void setUserName(String userName) {
		this.userName = userName;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

}

 

3.創建Tag.java類繼承TagSupport類,用於自定義標籤,代碼如下:

package com.util.taglib;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport;

import com.util.bean.Userinfo;

public class Tag extends TagSupport{

	private Userinfo user;
	//一般情況下我們只需重寫doStartTag(),doEndTag()即可

	//在開始標籤屬性設置後調用,如果返回SKIP_BODY則忽略標籤之中的內容,如果返回EVAL_BODY_INCLUDE則將標籤體的內容進行輸出
	public int doStartTag() throws JspException{
		try{
			JspWriter out = this.pageContext.getOut();
			if(user == null){
				out.println("NO Userinfo Found...");
				return SKIP_BODY;
			}
			out.println("<table width='500px' border='1' align='center'>");
            out.println("<tr>");
            out.println("<td width='20%'>Username:</td>");
            out.println("<td>" + user.getUserName() + "</td>");
            out.println("</tr>");
            out.println("<tr>");
            out.println("<td>Age:</td>");
            out.println("<td>" + user.getAge() + "</td>");
            out.println("</tr>");
            out.println("<tr>");
            out.println("<td>Email:</td>");
            out.println("<td>" + user.getEmail() + "</td>");
            out.println("</tr>");
            out.println("</table>");
		}catch(Exception e){
			System.out.println("出錯啦!");
			throw new JspException(e.getMessage());
		}
		return SKIP_BODY;
	}
	
	@Override
	//在結束標籤之前調用,返回SKIP_PAGE跳過整個jsp頁面後面的輸出,返回EVAL_PAGE執行頁面餘下部分
    public int doEndTag() throws JspException {
        return EVAL_PAGE;
    }

    @Override
    //生命週期結束時調用
    public void release() {
        super.release();
        this.user = null;
    }
    //getter and setter
    public Userinfo getUser(){
    	return user;
    }
    //setPageContext() 將所在jsp頁面的pageContext注入進來,目的是爲了在後面的方法中可以訪問到jsp頁面對象的pageContext屬性
    //setParent()       設置此標籤的父標籤
    //setAttribute()   將標籤中的屬性注入到此class的屬性,不需要自己實現但要提供屬性的get與set方法

    public void setUser(Userinfo user){
    	this.user = user;
    }

}

 

4.創建Taguti.java類,用於自定義標籤功能(函數),代碼如下:

package com.util.taglib;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport;

import com.util.bean.Userinfo;

public class Tag extends TagSupport{

	private Userinfo user;
	//一般情況下我們只需重寫doStartTag(),doEndTag()即可

	//在開始標籤屬性設置後調用,如果返回SKIP_BODY則忽略標籤之中的內容,如果返回EVAL_BODY_INCLUDE則將標籤體的內容進行輸出
	public int doStartTag() throws JspException{
		try{
			JspWriter out = this.pageContext.getOut();
			if(user == null){
				out.println("NO Userinfo Found...");
				return SKIP_BODY;
			}
			out.println("<table width='500px' border='1' align='center'>");
            out.println("<tr>");
            out.println("<td width='20%'>Username:</td>");
            out.println("<td>" + user.getUserName() + "</td>");
            out.println("</tr>");
            out.println("<tr>");
            out.println("<td>Age:</td>");
            out.println("<td>" + user.getAge() + "</td>");
            out.println("</tr>");
            out.println("<tr>");
            out.println("<td>Email:</td>");
            out.println("<td>" + user.getEmail() + "</td>");
            out.println("</tr>");
            out.println("</table>");
		}catch(Exception e){
			System.out.println("出錯啦!");
			throw new JspException(e.getMessage());
		}
		return SKIP_BODY;
	}
	
	@Override
	//在結束標籤之前調用,返回SKIP_PAGE跳過整個jsp頁面後面的輸出,返回EVAL_PAGE執行頁面餘下部分
    public int doEndTag() throws JspException {
        return EVAL_PAGE;
    }

    @Override
    //生命週期結束時調用
    public void release() {
        super.release();
        this.user = null;
    }
    //getter and setter
    public Userinfo getUser(){
    	return user;
    }
    //setPageContext() 將所在jsp頁面的pageContext注入進來,目的是爲了在後面的方法中可以訪問到jsp頁面對象的pageContext屬性
    //setParent()       設置此標籤的父標籤
    //setAttribute()   將標籤中的屬性注入到此class的屬性,不需要自己實現但要提供屬性的get與set方法

    public void setUser(Userinfo user){
    	this.user = user;
    }

}

 

5.在WEB-INF目錄下創建標籤文件tag.tld,文件內容如下:

<?xml version="1.0" encoding="UTF-8" ?>

<!-- <taglib 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"
  version="2.0"> -->
<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 web-jsptaglibrary_2_0.xsd">
  
  <!-- 自定義自定義標籤的版本 -->
  <tlib-version>1.0</tlib-version>
  <!-- 標籤庫要求的JSP規範版本 -->
  <jsp-version>2.0</jsp-version>
  <!-- JSP頁面編寫工具可以用來創建助記名的可選名字 -->
  <short-name>cc</short-name>
  <!-- 唯一標識該標籤庫的的URI(自定義) -->
  <uri>http://www.tag.mytag.com/</uri>
  
  <tag>
    <!-- 唯一標籤名 -->
    <name>dispuserinfo</name>
    <!-- 標籤類的完全限定名 -->
    <tag-class>com.util.taglib.Tag</tag-class>
    <!--  正文內容類型:如果不需要標籤體則設置empty,反之設定jsp -->
    <body-content>empty</body-content>
    <!-- 由工具顯示的可選名 -->
    <display-name>disname</display-name>
    <!-- 可以由工具使用的小圖標 -->
    <!-- <small-icon>aa</small-icon> -->
    <!-- 可以由工具使用的大圖標 -->
    <!-- <large-icon>bb</large-icon> -->
    <!-- 可選的標籤特定的信息 -->
    <!-- <description>descinfo</description> -->
    <!-- 可選的腳本變量信息 -->
    <!-- <variable>param</variable> -->
    <!-- 標籤屬性信息(如果有的話) -->
    <attribute>
      <!-- 指定標籤名 -->
      <name>user</name>
      <!-- 是否是必須,如果非必須沒設置則爲空 -->
      <required>false</required>
      <!-- 是否可在屬性中使用表達式 -->
      <rtexprvalue>true</rtexprvalue>
    </attribute>
  </tag>
  
  <!-- Listener元素(標籤庫可以指定一些事件監聽器類,Web容器將初始化監聽器類並以類似在WAR級定義的監聽器的方式註冊它們,必須包含監聽類的完全限定名) -->
  <!-- <listener>
    <listener-class>com.servlet.taglibServlet</listener-class>
  </listener>
  <listener>
    <listener-class>com.servlet.otherServlet</listener-class>
  </listener>
   -->
  
  <!-- 自定義的函數庫 -->
  <function>
    <!-- 自定義標籤函數功能名(與方法名稱可以不同) -->
    <name>currentTime</name>
    <!-- 自定義標籤函數所在的類全路徑 -->
    <function-class>com.util.taglib.Tagutil</function-class>
    <!-- 自定義標籤所在類方法名 -->
    <function-signature>java.lang.String curTime()</function-signature>
  </function>
  
  <function>
    <name>welcomeInfo</name>
    <function-class>com.util.taglib.Tagutil</function-class>
    <function-signature>java.lang.String welcomeInfo(java.lang.String)</function-signature>
  </function>
  
</taglib>

 6.在web.xml配置文件中配置自定義標籤,配置代碼如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
 
 <!-- 自定義標籤 -->
 <jsp-config>
  <taglib>
   <!-- 標籤庫的uri路徑,即jsp頭文件中聲明<%@ taglib uri="http://www.tag.mytag.com/" prefix="cc"%>的uri -->
   <taglib-uri>http://www.tag.mytag.com/</taglib-uri>
   <!-- tld文件所在的位置 -->
   <taglib-location>/WEB-INF/tag.tld</taglib-location>
  </taglib>
 </jsp-config>
 
 <login-config>
  <auth-method>BASIC</auth-method>
 </login-config>
 
 <welcome-file-list>
  <welcome-file>index.jsp</welcome-file>
 </welcome-file-list>
 
</web-app>

 

7.在JSP頁面中引入相關類及自定義標籤,併爲bean對象賦值,如下:

<%@ page language="java" import="java.util.*,com.util.bean.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://www.tag.mytag.com/" prefix="cc" %>
<%
Userinfo user = new Userinfo();
user.setUserName("花無影");
user.setAge(20);
user.setEmail("[email protected]");
pageContext.setAttribute("userinfo",user);
%>

 

8.使用自定義標籤進行頁面輸出,如下:

<body>
    <center><h1>JSTL自定義標籤</h1></center>
    <hr>
    <center><font color="red"><h2><b>1.自定義標籤</b></h2></font></center>
    <cc:dispuserinfo user="${pageScope.userinfo}"/><br>
    <hr>
    <center><font color="red"><h2><b>2.自定義函數庫</b></h2></font></center>
    當前訪問系統時間:${cc:currentTime() }<br>
    ${cc:welcomeInfo("花無影") }
    <hr>
</body>

 9.頁面顯示結果如圖:



 

    到此結束!

  

    (注:由於本人水平有限,寫的不好還望各位朋友見諒,歡迎各位提出寶貴意見)