HOME> 世界杯女排决赛> 详细介绍如何操作自定义标签&作用&特点&生命周期&实现

详细介绍如何操作自定义标签&作用&特点&生命周期&实现

2025-05-26 06:30:33     世界杯女排决赛    

1.为什么要使用自定义标签

我们在Javaweb中常常会用到一些jsp的标签,比如c:foreach、c:if、fmt:formatDate等标签,但是sun公司提供的这些标签虽然能够满足我们大部分的应用需求,但是对于一些特殊应用需求就不能满足了,这时候我们就需要自定义一些我们自己的标签库。要开始编写我们自定义的标签库之前,我们需要了解下自定义标签的作用是什么和自定义标签的实现骤是什么?然后采用对应的步骤针对这几个作用来进行自定义标签的学习和应用

2.自定义标签作用

用于移除jsp页面的Java代码。

控制jsp页面某一部分内容是否执行(内容权限控制)

控制整个jsp页面是否执行(页面权限控制)

控制jsp页面内容(标签体)重复执行

修改jsp页面的内容输出

3.标签语言特点

标签是由三个部分组成的:开始标签,标签体,结束标签

<开始标签 属性="属性值">标签体

空标签:<开始标签/> 例如:

标准标签:<开始标签>标签体 例如:

4.自定义标签开发及使用步骤

第一步:创建一个标准的标签工具类,并继承BodyTagSupport;

public class TestTag extends BodyTagSupport {

...

}

标签属性必须与工具类中的属性对应、且要提供对应get/set方法

第二步:创建标签库描述文件(.tld),添加自定义标签的配置;

PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"

"http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">

1.0

1.2

test

/zking

yy

com.zking.TestTag

jsp

name

true

false

注:.tld文件必须保存到WEB-INF目录或其子目录

第三步:在JSP页面中通过taglib指令导入标签库;

<%@taglib prefix="z" uri="/zking" %>

5.自定义标签的生命周期

doStartTag

但JSP容器遇到自定义标签的起始标志,就会调用doStartTag()方法,doStartTag()方法返回一个整数值,用来决定程序的后续流程。

demo

当执行到z:test开始标签时,将会执行对应标签工具类中的doStartTag方法

doEndTag

但JSP容器遇到自定义标签的结束标志,就会调用doEndTag()方法。doEndTag()方法也返回一个整数值,用来决定程序后续流程。

demo

当执行到/z:test结束标签时,将会执行对应标签工具类中的doEndTag方法

doAfterBody

遇到标签体执行

demo

调用z:test并执行动作之后(输出了一次标签主体内容之后),在/z:test执行动作之前所执行的动作

返回值

方法返回值备注SKIP_BODY跳过主体,不输出主体内容EVAL_BODY_INCLUDE计算标签主体内容并输出EVAL_PAGE计算页面的后续部分SKIP_PAGE跳过页面的后续部分EVAL_BODY_AGAIN再计算主体一次并输出

6.自定义标签运行流程

流程A

流程B

7.自定义标签实现

7.1.自定义out标签

创建OutTag标签类,定义属性value,在mytag.tld标签描述文件中定义out输出标签及属性信息。

package com.zking.jspTag.tag;

import javax.servlet.jsp.JspException;

import javax.servlet.jsp.JspWriter;

import javax.servlet.jsp.tagext.BodyTagSupport;

import java.io.IOException;

/**

* 自定义Out标签

*/

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 {

try {

JspWriter out = pageContext.getOut();

out.write(value.toString());

return SKIP_BODY;

} catch (IOException e) {

e.printStackTrace();

}

return SKIP_BODY;

}

@Override

public int doEndTag() throws JspException {

return EVAL_PAGE;

}

}

out

com.zking.jspTag.tag.OutTag

empty

value

true

false

7.2.自定义if标签

创建if标签类,定义属性test,在mytag.tld标签描述文件中定义if判断标签及属性信息

package com.zking.jspTag.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 {

if(this.test)

return EVAL_BODY_INCLUDE;

else

return SKIP_BODY;

}

@Override

public int doEndTag() throws JspException {

return super.doEndTag();

}

}

if

com.zking.jspTag.tag.IfTag

jsp

test

true

true

7.3.自定义forEach标签

创建forEach标签类,定义属性var和items,在mytag.tld标签描述文件中定义forEach循环标签及属性信息。

package com.zking.jspTag.tag;

import javax.servlet.jsp.JspException;

import javax.servlet.jsp.tagext.BodyTagSupport;

import java.util.Iterator;

import java.util.List;

public class ForEachTag extends BodyTagSupport {

//循环遍历的变量名 var="" -> ${n}

//将每次循环遍历的结果保存到作用域中,并以var属性来命名

//request.setAttribute(var,循环变量的量)

private String var;

//循环遍历的集合

private List items;

public String getVar() {

return var;

}

public void setVar(String var) {

this.var = var;

}

public List getItems() {

return items;

}

public void setItems(List items) {

this.items = items;

}

@Override

public int doStartTag() throws JspException {

if(null!=items&&items.size()>0){

//获取items的迭代器对象

Iterator it = items.iterator();

//通过next方法移动下标并取出元素

Object value = it.next();

//将当前取出的元素保存到pageContext作用域,并以var属性来命名

//四大作用域:page/request/session/application

pageContext.setAttribute(var,value);

//将没有遍历玩的it迭代器对象保存page作用域

//留到doAfterBody中再次判断是否继续执行

pageContext.setAttribute("it",it);

return EVAL_BODY_INCLUDE;

}

return SKIP_BODY;

}

@Override

public int doAfterBody() throws JspException {

//将page作用域中为遍历完的it迭代器对象取出来

Iterator it = (Iterator) pageContext.getAttribute("it");

//判断it迭代器对象中的下一个元素是否存在

if(it.hasNext()){

//通过next方法移动下标并取出元素

Object value = it.next();

//将取出的元素保存到page作用域,并以var来命名

pageContext.setAttribute(var,value);

//将没有遍历玩的it迭代器对象保存page作用域

//留到doAfterBody中再次判断是否继续执行

pageContext.setAttribute("it",it);

return EVAL_BODY_AGAIN;

}

return SKIP_BODY;

}

@Override

public int doEndTag() throws JspException {

return EVAL_PAGE;

}

}

forEach

com.zking.jspTag.tag.ForEachTag

jsp

var

true

false

items

true

true

7.4.自定义dept数据标签

创建DeptTag类,定义属性var和scope,并在mytag.tld标签描述文件中定义DeptTag标签及属性信息

package com.zking.jspTag.tag;

import com.zking.jspTag.entity.Dept;

import javax.servlet.ServletContext;

import javax.servlet.ServletRequest;

import javax.servlet.http.HttpSession;

import javax.servlet.jsp.JspException;

import javax.servlet.jsp.tagext.BodyTagSupport;

import java.util.ArrayList;

import java.util.List;

public class DeptTag extends BodyTagSupport {

private String var;

private String scope;

public String getVar() {

return var;

}

public void setVar(String var) {

this.var = var;

}

public String getScope() {

return scope;

}

public void setScope(String scope) {

this.scope = scope;

}

@Override

public int doStartTag() throws JspException {

List lst=new ArrayList<>();

boolean b = lst.add(new Dept(1, "666"));

lst.add(new Dept(2,"555"));

lst.add(new Dept(3,"444"));

if(null==scope||scope.equals("page")){

pageContext.setAttribute(var,lst);

}else if(scope.equalsIgnoreCase("request")){

ServletRequest request = pageContext.getRequest();

request.setAttribute(var,lst);

}else if(scope.equalsIgnoreCase("session")){

HttpSession session = pageContext.getSession();

session.setAttribute(var,lst);

}else if(scope.equalsIgnoreCase("application")){

ServletContext application = pageContext.getServletContext();

application.setAttribute(var,lst);

}else{

pageContext.setAttribute(var,lst);

}

return EVAL_BODY_INCLUDE;

}

@Override

public int doEndTag() throws JspException {

return EVAL_PAGE;

}

}

dept

com.zking.jspTag.tag.DeptTag

jsp

var

true

false

scope

false

false

7.5.自定义select下拉框标签

创建SelectTag类,定义相关属性,并在mytag.tld标签描述文件中定义SelectTag标签及属性信息

public class SelectTag extends BodyTagSupport {

//数据源

private List items;

//设置select中option的值

private String value;

//设置select中option的显示文本

private String text;

...

}

Copyright © 2022 德国世界杯主题曲_足球世界杯歌曲 - dtsykj.com All Rights Reserved.