J2EE基础之jsp标签

一、JSP的特点:
            1、jsp的构成:开始标签、标签主体、结束标签 例如:                  <z:demo1>demo1</z:demo1>2
            2、标签的分类:标签的分类主要是有四种
                   第一种:空标签 例如:<br>、<hr>
                      第二种:数据标签 例如:<c:set var="name" value="zs"></c:set>
<c:out value="${ name }"></c:out>
                      第三种:控制标签:<c:forEach items="" var=""></c:forEach>
<c:if test=""></c:if>
                       第四种:UI标签:<table><tr></tr></table>、<input>
二、自定义标签的步骤:
第一步:自己创建一个tld类,把跳转的域名改成自己想要跳转的路径。

<tag>
  <!--    标签库的名字 --> 
    <name>demo1</name>
    <!--该标签对应的助手类  -->
    <tag-class>com.ycx.tag.DemoTap1</tag-class>
     <!--代表是一个jsp标签  -->
    <body-content>JSP</body-content>
   <!--  <attribute> -->
      <!--    改自定义jsp标签的属性名称 -->
      <!--   <name>var</name> -->
         <!--   该属性是否必填  -->
      <!--   <required>false</required> -->
         <!-- 该属性值是否支持表达式  -->
        <!-- <rtexprvalue>false</rtexprvalue> -->
  <!--   </attribute> -->
  </tag>

 第二步:新建一个tld助手类

package com.ycx.tag;

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

/**
 * 助手类	必须继承bodytagSupport
 * @author 杨总
 *
 */
public class DemoTap1 extends BodyTagSupport{
	@Override
	public int doStartTag() throws JspException {
		System.out.println("------dostaretag-------");
//		return super.doStartTag();
//		return SKIP_BODY;
		return EVAL_BODY_INCLUDE;
	}
	@Override
	public int doAfterBody() throws JspException {
		System.out.println("------doAfterBody-------");
		return super.doAfterBody();
//		return EVAL_BODY_AGAIN;
//		return SKIP_PAGE;
	}
	@Override
	public int doEndTag() throws JspException {
		System.out.println("------doEndTag-------");
		return super.doEndTag();
//		return SKIP_PAGE;
	}
}

第三步:引用自己创建的JSP标签。

<y:demo1>xx</y:demo1>

         1、自定义标签库是与tld文件相关 
         2、标签库中的标签与tld中的tag元素有关,也就是跟tag元素对应的助手类有关

  三:JSP生命周期:

JSP标签生命周期一共有三条路线:

1.有标签体的情况下默认会调用助手类的dostarttag,doafterBody,doendtag方法
2.如果将dostarttag的返回值改为skip_body,那么doafterbody就不会调用(路线1)
3.如果将dostarttag的返回值改为eval_body_include,那么就会调用doendtag方法(路线2)
4.如果将afterBody的返回值改为eval_Body_again,那么会一直调用doafterBody,进入循环(路线3)

IfTag类:

package com.ycx.tag;

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

/**
 * if标签
 * 如果满足条件:就打印标签体--->dostarttag的返回值eval-body_include
 * 如果不满足条件,就不输出标签体--->dostarttag的返回值skip_body
 * 需要获取到是否满足条件的结果值,那么该标签就有一个属性,属性值是boolean
 * @author 杨总
 *
 */
public class IfTag extends BodyTagSupport{
	private boolean test;
	
	public boolean isTest() {
		return test;
	}

	public void setTest(boolean test) {
		this.test = test;
	}

	public int  dostarttag() throws JspException{
		// TODO Auto-generated method stub
		return test?EVAL_BODY_INCLUDE:SKIP_BODY;
	}
}

  OutTag类:

package com.ycx.tag;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.BodyTagSupport;
/**
 * servelet中后台代码前台输出内容 out.print
 * 将数据输出到前台,首先拿到输出流
 * @author 杨总
 *
 */
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 (Exception e) {
		e.printStackTrace();
	}
		return super.doStartTag();
	}
}

SetTag类: 

package com.ycx.tag;

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

/**
* 数据标签:存储数据的
* 作用域pagecontext,request,session,application(ServletContext)
* @author	杨总
*
*/
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();
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_65808248/article/details/125347217