自定义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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值