自定義JSP頁面標籤(有點型別EL表示式)
阿新 • • 發佈:2018-12-21
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