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