zoukankan      html  css  js  c++  java
  • Servlet 自定义标签

    自定义标签

           1)用户定义的一种jsp标记,当一个含有自定义标签的jsp页面被jsp引擎编译成servlet时,tag标签被转化成了对一个称为 标签处理类 的对象的操作。于是,当jsp页面被jsp引擎转化为servlet后,实际上tag标签被转化为了对tag处理类的操作。

           2)所有的标签处理器类都要实现 JspTag 接口,该接口中没有定义任何方法,主要作为 Tag 和 SimpleTag 接口的父接口。编写完成标签功能的 Java 类(标签处理器) 

    public class ForEachTag extends SimpleTagSupport{
    
    	private Collection<?> items;//集合变量名 
    	public void setItems(Collection<?> items) {
    		this.items = items;
    	} 
    	private String var;//变量 
    	public void setVar(String var) {
    		this.var = var;
    	} 
    	@Override
    	public void doTag() throws JspException, IOException { 
    		if(items != null){
    			for(Object obj: items){
    		     //	 遍历的对象放入到 pageContext
    				getJspContext().setAttribute(var, obj); 
    				//把标签体的内容直接输出到页面上. 
    				getJspBody().invoke(null);  
    			}
    		} 
    	} 
    }
    

      3)编写标签库描述(tld)文件,在tld文件中对自定义中进行描述

              标签库描述(Tag Library Description)文件简称为 tld 文件,其扩展名为 .tld,多个标签的集合就形成了一个标签库,标签库中的所有标签都必须在标签文件中进行描述。Tld 文件可以放置在 web 应用程序的 WEB-INF 目录及其子目录中,但不能放置在 WEB-INF 目录下的 classes 和 lib 子目录中 。

    <?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">
    
    	<description>MyTag 1.2 core library</description>
    	<display-name>MyTag core</display-name>
    	<tlib-version>1.2</tlib-version>
    	<short-name>myself</short-name>
    	<uri>http://myself.com/myTag/core</uri> 
    <tag> <name>forEach</name> <tag-class>com.demo.tag.ForEachTag</tag-class> <body-content>scriptless</body-content> <attribute> <name>items</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> <attribute> <name>var</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> </tag> <tag> <name>choose</name> <tag-class>com.demo.tag.ChooseTag</tag-class> <body-content>scriptless</body-content> </tag> <tag> <name>when</name> <tag-class>com.demo.tag.WhenTag</tag-class> <body-content>scriptless</body-content> <attribute> <name>test</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> </tag> <tag> <name>otherwise</name> <tag-class>com.demo.tag.OtherwiseTag</tag-class> <body-content>scriptless</body-content> </tag> </taglib>

      4) 在 JSP 页面使用 taglib 指令引入标签库描述文件:

                <%@ taglib prefix=“” uri=“” %>   uri:属性用于指定所引入的标签库描述(tld)文件中所定义的 <uri> 元素的内容;prefix 属性用于为引入的 tld 文件指定一个”引用代号”。Prefix 属性可以由 jsp 文件的作者任意指定,只要与其他 taglib 指令的 prefix 属性值不同就可以。

    <%@page import="com.demo.tag.Customer"%>
    <%@page import="java.util.ArrayList"%>
    <%@page import="java.util.List"%>
    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    <%@ taglib prefix="myself" uri="http://myself.com/myTag/core" %>  
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>show mytag</title>
    </head>
    <body> 
    	<% 
    		List<Customer> customers = new ArrayList<Customer>(); 
    		customers.add(new Customer(1, "AAA"));
    		customers.add(new Customer(2, "BBB"));
    		customers.add(new Customer(3, "CCC"));
    		customers.add(new Customer(4, "DDD"));
    		customers.add(new Customer(5, "EEE")); 
    		request.setAttribute("customers", customers); 
    	%>   
    	<myself:forEach items="${requestScope.customers }" var="cust">
    		--${pageScope.cust.id } -- ${cust.name } <br>
    	</myself:forEach> 
    	<br><br> 
    	<myself:choose>
    		<myself:when test="${param.age > 30}">中年...</myself:when>
    		<myself:when test="${param.age > 20}">青年...</myself:when>
    		<myself:otherwise>少年...</myself:otherwise>
    	</myself:choose>
    </body>
    </html>
    

      5)访问http://127.0.0.1:8080/demo/tag/test.jsp?age=30 

                                    

  • 相关阅读:
    bash变量作用域问题
    grep sed awk find用法
    vim compare 比对
    python的位数问题
    mysql使用
    lua 学习
    iptables的使用
    地铁换乘
    NOJ 1063 生活的烦恼
    猴子的下落
  • 原文地址:https://www.cnblogs.com/walkwithmonth/p/10292319.html
Copyright © 2011-2022 走看看