栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

J2EE基础--自定义JSP标签

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

J2EE基础--自定义JSP标签

目录

思维导图

​编辑

一、标签语言的特点

二、自定义标签的开发及其使用步骤

三、标签的生命周期

接下来就来了解一下它的生命周期吧:

经过多次运行试验我们得到一些结论:

四、实践自定义标签:if、set、out

4.3 配置tld文件:

Set标签类:这个我们就是拿到一个存储数据的地方:pageContext

Out标签类:这个我们主要就是拿到一个输出流:pageContext.getOut();


思维导图

一、标签语言的特点

形式是:

<开始标签 属性=“属性值”>标签体

分类有:控制标签、数据标签、UI标签

二、自定义标签的开发及其使用步骤

2.1 在了解了标签的一些基本结构以及特点后,我们进一步探索,

根据上面点击 if 标签 发现自定义标签是与tld文件有关的;

我们再次试验发现把c.tld文件中的tag元素删除后相关的标签就不能用了;

因此我们得到两条结论:   

于是我们想到如果把这个tld文件复制一份,把需要改的地方改成自己的,那是不是也能使用?

如下:

 我们就创一个demo来测试一下,可以看到它是存在的

 我们在jsp里写一个

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://jsp.hmj.cn" prefix="z"%>




Insert title here



true
false



然后运行一下

我们看出,可正常使用

三、标签的生命周期

3.1 我们又了解了跟自定义标签相关的tld文件、tag元素,

接下来就来了解一下它的生命周期吧:

我们新建一个类,继承tag元素对应的助手类:BodyTagSupport

DemoTag1类:

package com.heminjie.tag;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport;


public class DemoTag1 extends BodyTagSupport{
	@Override
	public int doStartTag() throws JspException {
		System.out.println("=======doStartTag==========");
		return EVAL_BODY_INCLUDE;
	}
	
	@Override
	public int doAfterBody() throws JspException {
		System.out.println("=======doAfterBody==========");
		return super.doAfterBody();
//		return EVAL_BODY_AGAIN;
	}
	
	@Override
	public int doEndTag() throws JspException {
		System.out.println("==========doEndTag==========");
		return super.doEndTag();
//		return SKIP_PAGE;
	}
	
}

经过多次运行试验我们得到一些结论:

1.有标签体的情况下,默认会调用助手类的doStartTag、doAfterBody、doEndTag方法
2.如果将doStartTag的返回值为skip——body,那么doafterbody就不会调用执行(路线1)
3.如果将dostartag的返回值改为EVAL_BODY_INCLUDE,那么doafterbody就会执行(路线2)
4.如果将doAfterBody的返回值改为EVAL_BODY_AGAIN,那么会一直调用doafterbody,进入循环(路线3)

四、实践自定义标签:if、set、out


了解了那么多理论知识,大多都是试验测试,不怎么好看运行结果,而接下来我们就来利用我们了解的理论知识来实践一下:

4.1自定义几个属于自己的标签吧~
4.2 if标签的的定义
我们需要先建一个if标签类,继承助手类:定义一个if属性test:boolean类型
 

package com.heminjie.tag;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport;


public class IfTag extends BodyTagSupport{
	private boolean test;
	
	public boolean isTest() {
		return test;
	}
	
	public void setTest(boolean test) {
		this.test = test;
	}
	
	@Override
	public int doStartTag() throws JspException {
//		如果满足条件,就打印标签体-》dostarttag的返回值EVAL_BODY_INCLUDE
//		如果不满足条件,就不输出标签体->dostarttag的返回值skip_body		
		return test ? EVAL_BODY_INCLUDE : SKIP_BODY;
	}
	
}

 我们写好这个标签类后就要去heminjie.tld文件里写好相关的配置,我们把其他的配置全部删除,

 留下一个范本:

4.3 配置tld文件:



    
  JSTL 1.1 core library
  JSTL core
  1.1
  z
  http://jsp.hmj.cn

  
    
        Provides core validation features for JSTL tags.
    
    
        org.apache.taglibs.standard.tlv.JstlCoreTLV
    
  
  
  	
    demo1
    
    com.heminjie.tag.DemoTag1
    
    JSP

    
        
        
        
        
       
   
  
  
  	
    if
    
    com.heminjie.tag.IfTag
    
    JSP
    
        test 
        true 
     true 
    
  
  
  	
    set
    
    com.heminjie.tag.SetTag
    
    JSP
    
        var 
        true 
     false 
    
    
        value 
        true 
     true 
    
  
  
  	
    out
    
    com.heminjie.tag.OutTag
    
    JSP
    
        value 
        true 
     true 
    
  


我们使用测试一下:

true

false

结果 

我们发现没有问题!

接着我们继续来试一下Set以及Out标签的定义:

Set标签类:这个我们就是拿到一个存储数据的地方:pageContext
package com.heminjie.tag;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport;


public class SetTag extends BodyTagSupport{
	
	private String var;
	private Object value;
	public String getVar() {
		return var;
	}


	public void setVar(String var) {
		this.var = var;
	}


	public Object getValue() {
		return value;
	}


	public void setValue(Object value) {
		this.value = value;
	}


	@Override
	public int doStartTag() throws JspException {
//		要存储数据,以键值得方式进行存储,分析得来标签有2个属性
		pageContext.setAttribute(var, value);
		return super.doStartTag();
	}
}

我们继续定义标签类:

Out标签类:这个我们主要就是拿到一个输出流:pageContext.getOut();
package com.heminjie.tag;

import java.io.IOException;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.BodyTagSupport;

public class OutTag extends BodyTagSupport{
	private Object value;

	public Object getValue() {
		return value;
	}

	public void setValue(Object value) {
		this.value = value;
	}
	@Override
	public int doStartTag() throws JspException {
		JspWriter out = pageContext.getOut();
		try {
			out.print(value);
		} catch (IOException e) {
			e.printStackTrace();
		}
		return super.doStartTag();
	}
}

我们写出来运行一下

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://jsp.hmj.cn" prefix="z"%>




Insert title here


	
	xx
	true
	false
	
	

ok,我的分享就到这里了

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/981116.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号