1. 程式人生 > >自定義JSP頁面標籤(有點型別EL表示式)

自定義JSP頁面標籤(有點型別EL表示式)

1.自定義標籤

1.1  標籤語言特點(格式)

  <開始標籤 屬性名="屬性值">標籤體</結束標籤>

   空標籤

   <br/><hr/>

   <開始標籤></結束標籤>

   <開始標籤/>

1.2  自定義標籤的開發及使用步驟

 2.1 建立一個標籤助手類(繼承BodyTagSupport)

      標籤屬性必須助手類的屬性對應、且要提供對應get/set方法

      注1:單例模式

  2.2 建立標籤庫描述檔案(tld),新增自定義標籤的配置

      注:tld檔案必須儲存到WEB-INF目錄或其子目錄

  2.3 在JSP通過taglib指令匯入標籤庫描述檔案,並通過指定字尾

      訪問此自定義標籤

1.3  標籤生命週期

1.4 extends BodyTagSupport中的返回方法

  SKIP_BODY:跳過主體

  EVAL_BODY_INCLUDE:計算標籤主體內容並[輸出]

  EVAL_BODY_BUFFERED:計算標籤主體內容並[快取]

  EVAL_PAGE:計算頁面的後續部分

  SKIP_PAGE:跳過頁面的後續部分

  EVAL_BODY_AGAIN:再計算主體一次

1.5 自定義Select輸出標籤

jsp頁面:

<%@page import="org.apache.jasper.tagplugins.jstl.core.ForEach"%>
<%@page import="com.entity.Test2"%>
<%@page import="java.util.ArrayList"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="m" uri="/WEB-INF/mytag.tld" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<%
	List<String> li = new ArrayList<String>();
	li.add("張三");
	li.add("李四");
	li.add("萬五");
	li.add("趙六");
	request.setAttribute("li", li);
	List<Test2> li2 =  new Test2().init();
	pageContext.setAttribute("li2", li2);
	
%>
<!--  -->
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>自定義標籤測試</title>
</head>
<body>
<h5>22222222222222222222222</h5>
<br/><hr/>
<m:hello name="123">11111111111111</m:hello>
<br/><hr/>
<h5>00000000000000000000</h5>
<br/><hr/>
<m:life name="aa" />
<!-- if自定義控制標籤 -->
	<m:if text="${3>2}">
		<a>真聰明</a>
	</m:if> 
	<!-- out自定義輸出標籤 -->
	<m:out value="123" />
	<!-- Foreach自定義控制標籤 -->
	<m:forEach items="${li }" var="l" varStatus="g"  >
		<li>${l}${g.index }${g.context }</li>
	</m:forEach>
	
<!-- deptList自定義資料標籤 --> <!-- 想測試丟集合到進作用域 -->
	<%-- <m:deptList var="aa" data="${li}" />
	${aa } --%>
	<!-- 自定義Select標籤 -->
	 <m:select name="snsame" textKey="sid" items="${li2 }" valueKey="sname" cssStyle="width:120px;"  headText="歡迎"  /> 
	
	<%--  <m:select2 items="${li2 }" name="select" valueKey="sname" textKey="sid"/>  --%>
	
	
	
	
	
	

</body>
</html>

tld檔案助手類:在WEB-INF中和web.xml平級

<!DOCTYPE taglib
  PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
   "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
<!-- 標籤庫描述符 -->
<taglib xmlns="http://java.sun.com/JSP/TagLibraryDescriptor">
	<tlib-version>1.0</tlib-version>
	<jsp-version>1.2</jsp-version>
	<short-name>test</short-name>
	<!-- hello world標籤 -->
	<tag>
		<!-- 標籤名 -->
		<name>hello</name>
		<!-- 標籤助手類 -->
		<tag-class>com.test.TestTag</tag-class>
		<!-- 標籤的內容型別:empty表示空標籤,jsp表示可以為任何合法的JSP元素 -->
		<body-content>jsp</body-content>
		<attribute>
			<!-- 屬性名 -->
			<name>name</name>
			<!-- 必填  -->
			<required>true</required>
			<!-- 可以為表示式 -->
			<rtexprvalue>true</rtexprvalue>
		</attribute>
	</tag>

	<!-- 生命週期標籤 -->
	<tag>
		<!-- 標籤名 -->
		<name>life</name>
		<!-- 標籤助手類 -->
		<tag-class>com.test.TestTaglife</tag-class>
		<!-- 標籤的內容型別:empty表示空標籤,jsp表示可以為任何合法的JSP元素 -->
		<body-content>empty</body-content>
		<attribute>
			<name>name</name>
			<!-- 必填 -->
			<required>true</required>
			<!-- 不接受表示式 -->
			<rtexprvalue>false</rtexprvalue>
		</attribute>
	</tag>
	
	<!-- if標籤 -->
	<tag>
		<name>if</name>
		<tag-class>com.Servlet.IfTagServlet</tag-class>
		<body-content>jsp</body-content>
			<attribute>
				<name>text</name>
				<!-- 非空 -->
				<required>true</required>
				<!-- 可以接受表示式 -->
				<rtexprvalue>true</rtexprvalue>
			</attribute>
	</tag>
	<!-- out標籤 -->
	<tag>
		<name>out</name>
		<tag-class>com.Servlet.OutTagServlet</tag-class>
		<body-content>jsp</body-content>
		<attribute>
			<!-- 屬性 -->
			<name>value</name>
			<!-- 非空 -->
			<required>false</required>
			<!-- 可以接受表示式 -->
			<rtexprvalue>true</rtexprvalue>
		</attribute>
	</tag>
	<!-- Foreach標籤 -->
	<tag>
		<name>forEach</name>
		<tag-class>com.Servlet.ForeachTagServlet</tag-class>
		<body-content>jsp</body-content>
		<attribute>
			<name>items</name>
			<!-- 非空 -->
			<required>true</required>
			<!-- 可以接收表示式 -->
			<rtexprvalue>true</rtexprvalue>
		</attribute>
		<attribute>
			<name>var</name>
			<!-- 可以為空 -->
			<required>true</required>
			<!-- 不可以接收表示式 -->
			<rtexprvalue>false</rtexprvalue>
		</attribute>
		<attribute>
			<name>varStatus</name>
			<required>false</required>
			<rtexprvalue>false</rtexprvalue>
		</attribute>
	</tag>
	<!-- deptList資料標籤 -->
	<tag>
		<name>deptList</name>
		<tag-class>com.Servlet.DeptListTagServlet</tag-class>
		<body-content>empty</body-content>
		<attribute>
			<name>var</name>
			<!-- 非空 -->
			<required>true</required>
			<!-- 不可以為表示式 -->
			<rtexprvalue>false</rtexprvalue>
		</attribute>
		<attribute>
			<name>data</name>
			<!-- 非空 -->
			<required>true</required>
			<!-- 可以接收表示式 -->
			<rtexprvalue>true</rtexprvalue>
		</attribute>
	</tag>

	<tag>
		<!-- 標籤名 -->
		<name>upper</name>
		
		<!-- 標籤助手類 -->
		<tag-class>tags.ToUpperCaseTag</tag-class>
		<!-- 標籤的內容型別:empty表示空標籤,jsp表示可以為任何合法的JSP元素 -->
		<body-content>jsp</body-content>
	</tag>


	<!-- 迭代器標籤 -->
	<tag>
		<name>forEach</name>
		<tag-class>tags.ForEachTag</tag-class>
		<body-content>jsp</body-content>
		<attribute>
			<name>var</name>
			<required>true</required>
			<rtexprvalue>false</rtexprvalue>
		</attribute>
		<attribute>
			<name>items</name>
			<required>true</required>
			<rtexprvalue>true</rtexprvalue>
		</attribute>
	</tag>
	
	<tag>
		<name>select</name>
		<tag-class>com.entity.SelectTagServlet</tag-class>
		<body-content>empty</body-content>
		
		<attribute>
			<name>name</name>
			<!-- 非空 -->
			<required>true</required>
			<!-- 不可以接收表示式 -->
			<rtexprvalue>false</rtexprvalue>
		</attribute>
		
		<attribute>
			<name>id</name>
			<required>false</required>
			<rtexprvalue>fasle</rtexprvalue>
		</attribute>
		<attribute>
			<name>value</name>
			<required>false</required>
			<rtexprvalue>fasle</rtexprvalue>
		</attribute>
		<attribute>
			<name>cssStyle</name>
			<required>fasle</required>
			<rtexprvalue>fasle</rtexprvalue>
		</attribute>
		<attribute>
			<name>cssClass</name>
			<required>fasle</required>
			<rtexprvalue>false</rtexprvalue>
		</attribute>
		<attribute>
			<name>headText</name>
			<required>fasle</required>
			<rtexprvalue>false</rtexprvalue>
		</attribute>
		<attribute>
			<name>headValue</name>
			<required>fasle</required>
			<rtexprvalue>false</rtexprvalue>
		</attribute>
		<attribute>
			<name>items</name>
			<required>true</required>
			<rtexprvalue>true</rtexprvalue>
		</attribute>
		<attribute>
			<name>valueKey</name>
			<required>true</required>
			<rtexprvalue>false</rtexprvalue>
		</attribute>
		<attribute>
			<name>textKey</name>
			<required>true</required>
			<rtexprvalue>false</rtexprvalue>
		</attribute>
		<attribute>
			<name>selectedValue</name>
			<required>false</required>
			<rtexprvalue>true</rtexprvalue>
		</attribute>
	</tag>
	
	<tag>
		<name>select2</name>
		<tag-class>com.entity.SelectTagServlet2</tag-class>
		<body-content>empty</body-content>
		<attribute>
			<name>name</name>
			<!-- 非空 -->
			<required>true</required>
			<!-- 不接受表示式 -->
			<rtexprvalue>true</rtexprvalue>
		</attribute>
		<attribute>
			<name>id</name>
			<!-- 可以為空 -->
			<required>false</required>
			<!-- 不接受表示式 -->
			<rtexprvalue>true</rtexprvalue>
		</attribute>
		<attribute>
			<name>CssStyle</name>
			<!-- 可以為空 -->
			<required>false</required>
			<!-- 接受表示式 -->
			<rtexprvalue>false</rtexprvalue>
		</attribute>
		
		<!-- 設定第一項的值 -->
		<attribute>
			<name>headText</name>
			<required>false</required>
			<!-- 不接受表示式 -->
			<rtexprvalue>false</rtexprvalue>
		</attribute>
		
		<!-- 資料來源 -->
		<attribute>
			<name>items</name>
			<required>true</required>
			<rtexprvalue>true</rtexprvalue>
		</attribute>
		<attribute>
			<name>valueKey</name>
			<required>true</required>
			<rtexprvalue>true</rtexprvalue>
		</attribute>
		<attribute>
			<name>textKey</name>
			<required>true</required>
			<rtexprvalue>true</rtexprvalue>
		</attribute>
	</tag>
	
</taglib>

Java原始檔:

package com.Servlet;

import java.io.IOException;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.biz.ITestBiz;
import com.biz.impl.TestBizImpl;
import com.entity.Test;

/**
 * 搜尋的Servlet
 * @author Administrator
 *
 */
public class SearchServlet extends HttpServlet{
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doPost(req, resp);
	}
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// TODO Auto-generated method stub
		req.setCharacterEncoding("utf-8");
		resp.setCharacterEncoding("utf-8");
		resp.setContentType("text/html");
		String uname = null;
		if(req.getParameter("search") != null) {
			uname = req.getParameter("search");
			uname.trim();
		}
		ITestBiz itb = new TestBizImpl();
		List<Test> li = itb.likeKeyTest(uname);
		req.getSession().setAttribute("li", li);
		resp.sendRedirect("list.jsp");
	}

}

1.6 控制標籤

1.if標籤

if(this.text) {

return EVAL_BODY_INCLUDE;

}else {

return SKIP_BODY;

}

2..Foreach標籤

繼承BodyTagSupport的類

package com.Servlet;

import java.util.Iterator;
import java.util.List;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport;

/**
 * Foreach自定義標籤
 * @author Administrator
 *
 */
public class ForeachTagServlet extends BodyTagSupport{

	private static final long serialVersionUID = 1L;
	private List<Object> items;   //資料來源
	private String var;			//Key 儲存當前物件到page作用域的一個Key
	private String varStatus;	//Key 儲存一個物件到page作用域的一個Key,此物件是一個內部類,用來記錄迴圈的狀態
	
	public static class status {
		private int index = 0;
		
		public int getIndex() {		//index的get方法
			return index;
		}
		public void increment() {	//用來當做下標記錄
			this.index++;
		}
		
		public int getContext() {   //用來常規的數數
			return index+1;
		}
	}
	
	
	public List<Object> getItems() {
		return items;
	}
	public void setItems(List<Object> items) {
		this.items = items;
	}
	public String getVar() {
		return var;
	}
	public void setVar(String var) {
		this.var = var;
	}
	public String getVarStatus() {
		return varStatus;
	}
	public void setVarStatus(String varStatus) {
		this.varStatus = varStatus;
	}
	
	/**
	 * 本體之前
	 */
	@Override
	public int doStartTag() throws JspException {
		// TODO Auto-generated method stub
		if(this.varStatus != null && !this.varStatus.trim().equals("")) {
			status sta = new status();
			pageContext.setAttribute(this.varStatus,sta);
		}
		if(this.items == null || this.items.size() == 0) {
			return SKIP_BODY;
		}else {
			Iterator<Object> iterator = items.iterator();
			Object next = iterator.next();
			pageContext.setAttribute(this.var, next);
			pageContext.setAttribute("iterator", iterator);
			return EVAL_BODY_INCLUDE;
		}
	}	
	
	/**
	 * 在主體之後
	 */
	@Override
	public int doAfterBody() throws JspException {
		// TODO Auto-generated method stub
		status status = (com.Servlet.ForeachTagServlet.status) pageContext.getAttribute(this.varStatus);
		status.increment();
		Iterator<Object> it = (Iterator<Object>) pageContext.getAttribute("iterator");
		if(it.hasNext()) {
			Object next = it.next();
			pageContext.setAttribute(this.var, next);
			return EVAL_BODY_AGAIN;  //再次計算本體內容並輸出
		}else {
			return SKIP_BODY;		//跳過主體內容
		}
	}
	

}

介面Jsp

<%@page import="java.util.ArrayList"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="m" uri="/WEB-INF/mytag.tld" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<%
	List<String> li = new ArrayList<String>();
	li.add("張三");
	li.add("李四");
	li.add("萬五");
	li.add("趙六");
	request.setAttribute("li", li);
%>
<!--  -->
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>自定義標籤測試</title>
</head>
<body>
<h5>22222222222222222222222</h5>
<br/><hr/>
<m:hello name="123">11111111111111</m:hello>
<br/><hr/>
<h5>00000000000000000000</h5>
<br/><hr/>
<m:life name="aa" />
<!-- if自定義標籤 -->
	<m:if text="${1>2}">
		<a>真聰明</a>
	</m:if> 
	<!-- out自定義標籤 -->
	<m:out value="123" />
	<!-- Foreach自定義標籤 -->
	<m:forEach items="${li }" var="l" varStatus="g"  >
		<li>${l}${g.index }${g.context }</li>
	</m:forEach>

</body>
</html>

如有改進或疑問歡迎QQ聯絡:304808680