[J2EE-09]-jsp自定义标签

本文详细介绍了Java反射机制,包括动态实例化对象、读写属性、调用方法和构造函数。同时,讲解了自定义标签的开发步骤,从创建标签助手类、定义标签库描述文件(TLD)到在JSP中使用自定义标签。此外,还探讨了JSP标签的生命周期和执行流程。
摘要由CSDN通过智能技术生成

一:回顾

1.什么是反射
    反射是一种机制,利用反射机制可以动态的实例化对象、读写属性、调用方法及构造函数

2.传统方式和反射方式的区别
    传统方式
        Student stu=new Student();
    反射方式
        获取类对象
        Object obj = cls.newInstance();

3.获取类对象
    类名.class
    对象名.getClass()
    Class.forName(类的全路径名/全限定名)

4.综合案例


    读写属性(Field)
        getField
            只能获取公共的
        getDeclaredField
            获取所有类型
            设置访问权限
                field.setAccessible(true)
        set(赋值)
            参数1
                实例化对象名
            参数2
                赋值的值
        get(取值)
            参数
                实例化对象名


    调用方法(Method)
        getMethod
        getDeclaredMethod
        setAccessible
            设置访问权限
        invoke
            执行方法
            参数1
                实例化对象名
            参数2
                被调用方法的参数,必须按照方法的参数个数及顺序进行参数传递
            返回值
                被调用方法执行后的返回结果


    调用构造函数(Constructor)
        getConstructor
        getDeclaredConstructor
        newInstance
 

二. 标签语言特点

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

空标签
 <br/><hr/>
 <开始标签></结束标签>
 <开始标签/>

三. 自定义标签的开发及使用步骤+代码示例(浏览器使用:google/firefox) 

3.1 创建一个标签助手类(继承BodyTagSupport)
      标签属性必须与助手类的属性对应、且要提供对应get/set方法
      rtexprvalue

package com.zking.tag;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport;
/**
 * 自定义标签开发
 * 1)创建标签助手类,并继承BodyTagSupport
 * 2)创建标签描述文件(tld),必须将其放在WEB-INF目录或其子目录下
 * 3)在页面中通过taglib指令引入自定义标签库
 * @author 李婷
 *
 */

public class TestTag extends BodyTagSupport{
	/**
	 * doEndTag():表示<结束标签>所对应执行的动作
	 * 例如:对应</z:test>所执行的动作
	 * @return 返回值:
	 * 1)SKIP_PAGE:跳过页面的后续内容
	 * 2)EVAL_PAGE:计算页面的后续内容
	 * @throws JspException
	 */
	private Object name;
	private int count=0;
	
	
	public Object getName() {
		return name;
	}
	public void setName(Object name) {
		this.name = name;
	}
	@Override
	public int doEndTag() throws JspException {
		// TODO Auto-generated method stub
		System.out.println("doEnddTag():表示<结束标签>所对应执行的动作");

		return EVAL_PAGE;
	}
/**
 * doStartTag():表示<开始标签>所对应执行的动作
 * 例如:对应<z:test>所执行的动作
 * @return 返回值:
 * 1)SKIP_BODY:跳过主体内容不输出
 * 2)EVAL_BODY_INCLUDE:计算主体内容并包含在输出中
 * @throws JspException
 */
	@Override
	public int doStartTag() throws JspException {
		// TODO Auto-generated method stub
		System.out.println("name="+this.name);
		System.out.println("doStartTag():表示<开始标签>所对应执行的动作");
		return EVAL_BODY_INCLUDE;
	}
	/**
	 * doAfterBody:介于<开始标签>标签体与</结束标签>之间所执行的动作
	 * 例如:介于<z:test>T277与</z:test>之间执行的动作
	 *  1)SKIP_BODY:跳过主体内容不输出(可以理解为:for循环中的break)
	 *  2)EVAL_BODY_AGAIN:再次计算主体内容并包含在输出中(理解为:continue)
	 * @return
	 * @throws JspException
	 */
@Override
public int doAfterBody() throws JspException {
	// TODO Auto-generated method stub
	
	System.out.println("doAfterBody:介于<开始标签>标签体与</结束标签>之间所执行的动作");
	if(count<3){
		count++;
		return EVAL_BODY_AGAIN;
	}
	return SKIP_BODY;
}

}

  3.2 创建标签库描述文件(tld),添加自定义标签的配置
      注:tld文件必须保存到WEB-INF目录或其子目录
      jstl标签库

<!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的版本 -->
	<jsp-version>1.2</jsp-version>
	<!-- 你的标签库的简称 -->
	<short-name>z</short-name>
	<!-- 你标签库的引用uri -->
	<uri>/zking</uri>

	<tag>
		<!-- 标签<z:test> -->
		<name>text</name>
		<!-- 标签工具类 -->
		<tag-class>com.zking.tag.TestTag</tag-class>
		<!-- 标签的内容类型:empty表示空标签,jsp表示可以为任何合法的JSP元素 -->
		<body-content>jsp</body-content>
		<!-- 自定义标签的属性定义,请注意一定要在标签类中提供对应的get/set方法 -->
		<!--  -->
		<!-- 自定义标签的属性定义,请注意一定要在标签类中提供对应的get/set方法 -->
		<attribute>
			<!-- 自定义标签的属性名称 -->
			<name>name</name>
			<!-- true表示必填 -->
			<required>true</required>
			<!-- true支持动态值,可以向值里面填jsp表达式、EL表达式,false则不支持 -->
			<rtexprvalue>false</rtexprvalue>
		</attribute>
	</tag>
</taglib>

  3.3 在JSP通过taglib指令导入标签库,并通过指定后缀访问自定义标签
 

<%@page import="java.util.List"%>
<%@page import="java.util.Arrays"%>
<%@page import="java.lang.reflect.Array"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@taglib prefix="b" uri="/zking"%>
<!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>主界面</title>
</head>
<body>
	<%
		List<String> lst=Arrays.asList(new String[]{"lj","lt","lw"});
	request.setAttribute("lst", lst);
	
	//page->request->session->application
	
	%>
	
	
	<c:forEach items="${lst}" var="lt">
	
	${lst}
	
	</c:forEach>
	<h2>我自己的</h2>
	<b:text name="s">你好呀!</b:text>
	112131<br/>
	
	
</body>
</html>

  3.4  .....    jrebal 热加载

  注释:

 SKIP_BODY:跳过主体
  EVAL_BODY_INCLUDE:计算标签主体内容并[输出]
  EVAL_PAGE:计算页面的后续部分
  SKIP_PAGE:跳过页面的后续部分
  EVAL_BODY_AGAIN:再计算主体一次


四:JSP生命周期:


  流程A:
                                      SKIP_BODY
 
3.1  实例化标签助手类->doStartTag()------------->doEndTag()
       //主要用开发简单标签

  流程B:
                                      EVAL_BODY_INCLUDE         SKIP_BODY
  3.2  实例化标签助手类->doStartTag()------------->doAfterBody---------------->doEndTag()...
                                                              EVAL_BODY_AGAIN

图例:

        

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值