文档章节

JSTl 第2 课 自定义标签 嵌套标签

 小南风
发布于 2016/08/04 13:48
字数 970
阅读 6
收藏 0

1.jsp页面

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ page import="com.userinfo.model.*" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix='fmt' uri="http://java.sun.com/jsp/jstl/fmt" %>  

<%@ taglib prefix="nest" uri="WEB-INF/parentAdnChild.tld" %> 

<html>

  <body>
  1 .<%="jstl jsp" %> <br>
    1 .<%="我是jsp的java自负33" %> <br>
    2.${1==1 }
        <%
   	 pageContext.setAttribute("el", "我是${}");  
     pageContext.setAttribute("sumi", new Integer(1));
     List<Map> list = new   ArrayList();
     Map  map1= new HashMap();
     map1.put("name","张三" );
     map1.put("age",11);
     list.add(map1);
     
     Map  map2= new HashMap();   
     map2.put("name","李四" );
     map2.put("age",22); 
     list.add(map2);
     
     Map  map3= new HashMap();   
     map3.put("name","李世民" );
     map3.put("age",33); 
     list.add(map3);
     pageContext.setAttribute("pageList", list);
    %>
    
     <br>
     <nest:parent id="1">  
        <nest:child  title="姓名" value="${name}:tagValue">${name}</nest:child>  
        <nest:child  title="年龄" value="${age }:tagValue">${age }</nest:child>  
     </nest:parent>

	
  </body>
</html>

显示效果:

tld文件

<?xml version="1.0" encoding="UTF-8" ?>  
<!DOCTYPE taglib  
  PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"  
  "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">  
<taglib>  
    <tlib-version>1.0</tlib-version>  
    <jsp-version>2.0</jsp-version>  
    <short-name>nest</short-name>  
    <uri>/nests/nested.tld</uri>  
    <!-- 父标签 -->  
    <tag>  
        <name>parent</name>  
        <tag-class>parentAndChild.ParentTag</tag-class>  
        <!-- scriptless 主体可以有内容, 而jsp容器会去处理里面的jsp元素, 换句话就是可以是文本, EL表达式,   
        标准动作甚至另一个自定义标记. -->  
        <body-content>scriptless</body-content>  
        
        <attribute>  
            <name>id</name>  
            <required>true</required>  
            <!-- rtexprvalue 是否允许表达式 不允许时${1+1}出错 -->  
            <rtexprvalue>false</rtexprvalue>  
        </attribute>  
    </tag>  
    <!-- 子标签 -->  
    <tag>  
        <name>child</name>  
        <tag-class>parentAndChild.ChildTag</tag-class>  
        <body-content>scriptless</body-content>  
        <attribute>  
            <name>title</name>  
            <required>true</required>  
            <!-- rtexprvalue 是否允许表达式 不允许时${1+1}出错 -->  
            <rtexprvalue>true</rtexprvalue>  
        </attribute>  
        <attribute>  
            <name>value</name>  
            <required>true</required>  
            <!-- rtexprvalue 是否允许表达式 不允许时${1+1}出错 -->  
            <rtexprvalue>true</rtexprvalue>  
        </attribute>  
    </tag>  
</taglib>  

父类标签:

package parentAndChild;


import java.io.IOException;  
import java.util.HashMap;  
import java.util.Iterator;  
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;  
import java.util.Set;  

import javax.servlet.jsp.JspException;  
import javax.servlet.jsp.JspWriter;  
import javax.servlet.jsp.tagext.IterationTag;
import javax.servlet.jsp.tagext.TagSupport;  



public class ParentTag extends TagSupport {  
    private static final long serialVersionUID = 1L;  
      

    private  int current_num=-1;
    private  int   end_num=-1;
    public int getCurrent_num() {
		return current_num;
	}
	public void setCurrent_num(int current_num) {
		this.current_num = current_num;
	}
	/** 
     *  doStartTag()方法返回一个整数值,用来决定程序的后续流程。  
     * A.Tag.SKIP_BODY:表示标签之间的内容被忽略  
     * B.Tag.EVAL_BODY_INCLUDE:表示标签之间的内容被正常执行  
     */  
    public int doStartTag() throws JspException { 
    	System.out.println("parent dostartTag");
    	current_num=-1;
    	List	pageList= 	(List) pageContext.getAttribute("pageList");
    	end_num=pageList.size();
    	System.out.println("pageList.size=="+end_num);
        JspWriter out = pageContext.getOut();    	
        try {
			out.print("<table  border=2 style='background-color:red;border:0px;'><tr>");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
        return EVAL_BODY_INCLUDE;  
    }  
    /**  
     *  doEndTag:当JSP容器遇到自定义标签的结束标志,就会调用doEndTag()方法。doEndTag()方法也返回一个整数值,用来决定程序后续流程。  
     *  A.Tag.SKIP_PAGE:表示立刻停止执行网页,网页上未处理的静态内容和JSP程序均被忽略任何已有的输出内容立刻返回到客户的浏览器上。  
     *  B.Tag.EVAL_PAGE:表示按照正常的流程继续执行JSP网页  
     */  
    public int doEndTag() throws JspException { 
    	System.out.println("parent EndTag");
        JspWriter out = pageContext.getOut();    	
        try {
        	out.print("</table> ");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
        return EVAL_PAGE;  
    } 
    @Override
    public int doAfterBody() throws JspException {
    	current_num++;  //自增一次!  0的位置已经运行了一次了!
       	System.out.println("parent doAfterBody+current_num :"+current_num);
    	JspWriter out = pageContext.getOut();    	       	 
          if(current_num<end_num){
        	  	//设置参数${}到page页面
	      		List pageList	=(List) pageContext.getAttribute("pageList");
	      		Map<String ,String>  map=	(Map) pageList.get(getCurrent_num());
	      		for(String key: map.keySet() ){
	      			Object mapvalue=map.get(key);
	      			System.out.println("key: "+key+"--value:"+mapvalue);
	      			pageContext.setAttribute(key ,mapvalue);
	      		}//设置参数${}到page页面
	            	try {
						out.print("</tr><tr>");
					} catch (IOException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
            	
               return IterationTag.EVAL_BODY_AGAIN;
          }else{
		          	try {
							out.print("</tr>");
						} catch (IOException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}  	
                return IterationTag.SKIP_BODY;
          }
    }//end fun
	public boolean isTitle() {
		// TODO Auto-generated method stub
		if(current_num==-1){
			return true;
		}
		return false;
	}

}  

子标签:

package parentAndChild;

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

import javax.servlet.jsp.JspException;  
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.IterationTag;
import javax.servlet.jsp.tagext.TagSupport;  


public class ChildTag extends TagSupport {  
      
    private static final long serialVersionUID = 1L;  
    //定义标签属性key,value  
    private String title;  
    private String value;

    
    
    
    public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	public String getValue(){  
        return value;  
    }  
    public void setValue(String value){  
        this.value = value;  
    }  
      
    public int doStartTag() throws JspException {  


    	System.out.println("child doStartTag--value:"+value);
    	
        ParentTag pTag = (ParentTag) this.getParent();  
        //调用父标签的addValue方法,给父标签中的map赋值  
        JspWriter out = pageContext.getOut();  
        
         
        try {
        	
        	if(pTag.isTitle()){ //输出标题
        		out.print(  "<th>"+title+"</th>");
        	}else{ //输出身体
        		out.print(  "<td>"); // body交给页面添加内容
        		//设置 数据到身体
        	}	
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
        return EVAL_BODY_INCLUDE;  
    } 
    public int doEndTag() throws JspException {  
    	
    	 ParentTag pTag = (ParentTag) this.getParent();  
        JspWriter out = pageContext.getOut();  
        try {		
        	if(pTag.isTitle()){ // 是否是标题
        		//out.print(  "<td>"+title+"</td>");
        	}else{ //输出身体
        		out.print(  "</td>");
        	}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
       return EVAL_PAGE;  
    }  
}  

 

© 著作权归作者所有

粉丝 4
博文 162
码字总数 59007
作品 0
私信 提问
标准标签库(JSTL)基础

JSTL简介 从JSP 1.1规范开始JSP就支持使用自定义标签,使用自定义标签大大降低了JSP页面的复杂度,同时增强了代码的重用性,因此自定义标签在WEB应用中被广泛使用。许多WEB应用厂商都开发出了...

晨曦之光
2012/05/16
337
0
Java程序员从笨鸟到菜鸟之(二十)jsp自定义标签

一、基本概念 1、标签(Tag) 标签是一种XML元素,通过标签可以使JSP网页变得简洁并且易于维护,还可以方便地实现同一个JSP文件支持多种语言版本。由于标签是XML元素,所以它的名称和属性都是大...

长平狐
2012/11/12
96
0
【J2EE】- JSP自定义标签

用途:在进行JSP页面显示处理的时候,有时候JSTL/Struts/Spring提供的标签库并不能满足项目中显示的需求,特别是对一些要求比较高的定制化服务中,可以使用自定义的标签库去处理。 JSP自定义...

ZeroneLove
03/03
0
0
TagSupport类的声明周期

(1) 当jsp容器在解释jsp页面时,如果遇到自定义标签的开始标记,将利用“标签处理类”创建一个“标签处理对象”。在建立“标签处理对象”的过程中,jsp容器会毁掉setPageContext()方法,然...

晨曦之光
2012/05/16
33
0
JSP复习(四):JSTL标记

JSTL优势:在于EL和标准动作无法达到目的,又不使用脚本代码。(JSTL 1.1不是JSP2.0规范的一部分,TOMCAT高版本已经自带了JSTL的JAR包) 使用JSTL需要使用指令,引入JSTL <%@ taglib prefix=...

这个人很懒-啥都没写
2013/07/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

非递归实现后序遍历二叉树

问题描述 从键盘接受输入先序序列,以二叉链表作为存储结构,建立二叉树(以先序来建立)并对其进行后序遍历,然后将遍历结果打印输出。要求采用非递归方法实现。 解题思路 Push根结点到第一...

niithub
24分钟前
3
0
IDEA 自动删除类中无用的import包

1.手动快捷键 Ctrl + Alt + O 2.配置自动清理 Ctrl + Alt + S 打开设置 然后,进行如下操作:

时刻在奔跑
26分钟前
2
0
cwRsync提示password file must be owned by root when running as root的解决方法

cwRsync提示password file must be owned by root when running as root的解决方法 更新时间:2015年08月30日 23:05:52 投稿:mdxy-dxy 我要评论 今天在配置服务器的时候,用了rsync4.10版本...

rootliu
31分钟前
1
0
Java 交换两个参数

目前有一个小需求: 定义一个函数,交换两个值。于是,有人就写了这样一个函数。 public class exchange_01 { public static void main(String[] args) { // TODO Auto-gen...

hellation_
40分钟前
2
0
ExoPlayer简单使用

一、介绍 ExoPlayer是google开源的应用级媒体播放器项目,该开源项目包含ExoPlayer库和演示demo,github地址:https://github.com/google/ExoPlayer。 二、概述 ExoPlayer库的核心是ExoPlay...

零点B5
49分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部