JSP自定义标签02

1、z标签

    ui:将数据输出到界面上。

    例如:

    z:out

    1、首先实例化一个out标签助手类,继承BodyTagSupport,根据自定义标签的特点先去分析out标签的属性,

         是否有标签体、是否非空、是否必填......

         就像下面的代码这样:

package com.zking.mvc.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 static final long serialVersionUID = 1L;

//out标签没有标签体
private  Object  value ;//非空  必填

private  String  defaultValue;

public String getDefaultValue() {
	return defaultValue;
}

public void setDefaultValue(String defaultValue) {
	this.defaultValue = defaultValue;
}

public Object getValue() {
	return value;
}

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


//调用doStartTag()方法

@Override

public int doStartTag() throws JspException {

		// page  request   session  application 

	     try {
	    	JspWriter out=this.pageContext.getOut();//内置的out方法

	    	if(null!=this.value) {//如果value值不为空

			out.println(this.value);//就输出value值

			}
	    	else if(null!=this.defaultValue) {//如果默认值不为空

	    		out.println(this.defaultValue);//就输出默认值
	    	}
	    	else{
	    		out.println();//这里不会显示信息
	    	}
	    	 return SKIP_BODY;

		   }catch (Exception e) {
			// TODO Auto-generated catch block

			throw  new RuntimeException(e);
		}
	}
}

  2、然后写一个z.tld去配置所写的out标签 

<!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-version>1.2</jsp-version>
	<short-name>Simple Tags</short-name>
	<!--标签地址:一般通常放公司的域名+项目名  -->
	<uri>/zking</uri>
	<!--标签 -->
	<tag>
		<!-- 标签名 -->
		<name>out</name>
		<!-- 标签助手类 -->
		<tag-class>com.zking.mvc.tag.OutTag</tag-class>
		<!-- 标签的内容类型:empty表示空标签,jsp表示可以为任何合法的JSP元素 -->
		<body-content>empty</body-content>
		<!--标签属性 -->
		<attribute>
		   <!--属性名称 -->
		   <name>value</name>
		   <!--属性是否必填 -->
		   <required>true</required>
		   <!--属性能否接收一个表达式作为值-->
		   <rtexprvalue>true</rtexprvalue>
		   <!--属性的描述  可写可不写  -->
		   <description></description>
		</attribute>
		<attribute>
		   <name>defaultValue</name>
		   <required>false</required>
		   <rtexprvalue>false</rtexprvalue>
		</attribute>
	</tag>
</taglib>

 3、然后再写一个index.jsp(或者jsp页面)去验证你所写的内容:

<%@taglib prefix="z" 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>Insert title here</title>
</head>
<body>
    <%
    request.setAttribute("userName1", "李易峰");
    %>
    <h1>JSP自定义标签的生命周期<%=System.currentTimeMillis()%></h1>
    <z:test>${23+44}</z:test>
    <br/>
    ${10+10}
    <h2>LYF!!!</h2> 
    <ul>
       <li>
       <h2>z:out</h2>
       <div>
       <z:out value="${userName}" defaultValue=""></z:out>
       </div>
       </li>
       <li>  
   </ul>
</body>
</html>

然后运行结果:

     补充知识点:page、session、request、application几个内置对象的作用域:

    page作用于当前页面

    session作用于当前会话

    request作用于当前请求

    application作用于当前应用

  控制:通过标签整体信息进行展示,但是不需要显示在界面上

  例如:

  z:if    z:forEach

  数据:

  z:dictList

   1、首先写一个DictListTag的标签助手类,并继承BodyTagSupport,如下图所示:

public class DictListTag extends BodyTagSupport{

private static final long serialVersionUID =-8411305497745885433L;

private String var;//保存数据到page作用域  非空

private DeptDAO deptdao=new DeptDAO();

public String getVar() {

	return var;
}

public void setVar(String var) {

	this.var = var;
}

public DeptDAO getDeptdao() {

	return deptdao;
}

public void setDeptdao(DeptDAO deptdao) {

	this.deptdao = deptdao;

}

public static long getSerialversionuid() {

	return serialVersionUID;
}

//开始标签
@Override
	public int doStartTag() throws JspException {
	
	    List ls=deptdao.list();

	    this.pageContext.setAttribute(this.var, ls);

		return SKIP_BODY;//跳过标签主体
	}
}

    2、相关的配置文件  其实就是你的后缀名为.tld的文件!

<!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>Simple Tags</short-name>
	<!--标签地址:一般通常放公司的域名+项目名  -->
	<uri>/zking</uri>
    <tag>
		<!-- 标签名 -->
		<name>dictList</name>
		<!-- 标签助手类 -->
		<tag-class>com.zking.mvc.tag.DictListTag</tag-class>
		<!-- 标签的内容类型:empty表示空标签,jsp表示可以为任何合法的JSP元素 -->
		<body-content>empty</body-content>
		<!-- 标签属性 -->
		<attribute>
		  <name>var</name>
		  <required>true</required>
		  <rtexprvalue>false</rtexprvalue>
		</attribute>
	</tag>
</taglib>

   3、验证的页面代码:

  实体类:

dao方法: 

  jsp页面:

 <ul>
  <li>
          <h2>z:dictList</h2>
             <div>
                <z:dictList var="dislist"/>
                ${dislist}
             </div>
   </li>
  </ul>

  4、最后运行的结果:

   z:select    下拉框标签

    1、首先写一个SelectTag的标签助手类,并继承BodyTagSupport,就像下面展示的代码这样:

         根据select下拉框的属性,定义好该定义的属性,以及写好set/get方法。

public class SelectTag  extends  BodyTagSupport{

private static final long serialVersionUID = 1L;
private String name;//非空 不支持表达式
private String id;//允许空
private String cssStyle;//允许空
private String cssClass;//允许空
private String onchange;//允许空
private List   items;//数据源
private String valueProperty;//不允许为空 <option value='valueProperty'>
private String textProperty;//不允许为空 <option>textProperty</option>
private String headValue;//允许空  用来生成第一项内容
private String headText;//允许空  用来生成第一项内容
private String selectedValue;//选中  允许空值

public String getSelectedValue() {
	return selectedValue;
}
public void setSelectedValue(String selectedValue) {
	this.selectedValue = selectedValue;
}
public String getName() {
	return name;
}
public void setName(String name) {
	this.name = name;
}
public String getId() {
	return id;
}
public void setId(String id) {
	this.id = id;
}
public String getCssStyle() {
	return cssStyle;
}
public void setCssStyle(String cssStyle) {
	this.cssStyle = cssStyle;
}
public String getCssClass() {
	return cssClass;
}
public void setCssClass(String cssClass) {
	this.cssClass = cssClass;
}
public String getOnchange() {
	return onchange;
}
public void setOnchange(String onchange) {
	this.onchange = onchange;
}
public List getItems() {
	return items;
}
public void setItems(List items) {
	this.items = items;
}
public String getValueProperty() {
	return valueProperty;
}
public void setValueProperty(String valueProperty) {
	this.valueProperty = valueProperty;
}
public String getTextProperty() {
	return textProperty;
}
public void setTextProperty(String textProperty) {
	this.textProperty = textProperty;
}
public String getHeadValue() {
	return headValue;
}
public void setHeadValue(String headValue) {
	this.headValue = headValue;
}
public String getHeadText() {
	return headText;
}
public void setHeadText(String headText) {
	this.headText = headText;
}
public static long getSerialversionuid() {
	return serialVersionUID;
}

//开始标签
@Override
public int doStartTag() throws JspException {
   try {
	 //获取out
	 JspWriter out=this.pageContext.getOut();
	 out.println(toHtml());
	 return SKIP_BODY;
	}catch (Exception e) {
		// TODO: handle exception
		throw new RuntimeException(e);
	}
   
	}


    //拼接select
    public String toHtml() throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
    	StringBuffer sb=new StringBuffer();
    	sb.append("<select");
    	sb.append(" name='"+this.name+"'");
    	if(null!=this.id && "".equals(this.id)) {
    		sb.append(" id='"+this.id+"'");
    	}
    	if(null!=this.cssStyle && "".equals(cssStyle)) {
    		sb.append(" Style='"+cssStyle+"'");
    	}
    	if(null!=this.cssClass && "".equals(this.cssClass)) {
    		sb.append(" Class='"+this.cssClass+"'");
    	}
    	if(null!=this.onchange && "".equals(this.onchange)) {
    		sb.append(" onchange='"+this.onchange+"'");
    	}
    	
    	sb.append(">");
    	if(null!=this.headText) {
			sb.append("<option value='"+this.headValue+"'> "+headText+"</option>");
		}
    	//开始拼接option
    	for(int i=0;null!=items && i<items.size();i++) {
    		Object item=items.get(i);
    		//如果第一项填写了值 就使用默认值     		
    		Object value=PropertyUtils.getProperty(item, this.valueProperty);
    		Object text=PropertyUtils.getProperty(item, this.textProperty);
    		if(null!=this.selectedValue) {
    		  this.selectedValue.equals(value);
    		  sb.append("<option selected value='"+value+"'> "+text+"</option>");
    		}else {
			sb.append("<option value='"+value+"'> "+text+"</option>");
		}
    	}
    	sb.append("</select>");
    	return sb.toString();
    }


	

}

   2、相关配置文件(z.tld)

        在配置文件的时候,写tag标签的时候,标签的地址   也就是Uri我们一般放  公司的域名+项目名

        然后再写好相关的标签名称、设置值的时候根据情况而定,比如哪些必填,哪些是否支持表达式......

<!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>Simple Tags</short-name>
	<!--标签地址:一般通常放公司的域名+项目名  -->
	<uri>/zking</uri>
<!-- 自定义下拉框标签 -->
	<tag>
		<name>Select</name>
		<tag-class>com.zking.mvc.tag.SelectTag</tag-class>
		<body-content>empty</body-content>
	  <attribute>
		    <name>name</name>
		    <required>true</required>
		    <rtexprvalue>false</rtexprvalue>
	     </attribute> 
	   <attribute>
		     <name>id</name>
		     <required>false</required>
		     <rtexprvalue>false</rtexprvalue>
	   </attribute> 
	   <attribute>
	     <name>cssStyle</name>
	     <required>true</required>
	     <rtexprvalue>true</rtexprvalue>
	  </attribute> 
	  <attribute>
	     <name>cssClass</name>
	     <required>false</required>
	     <rtexprvalue>false</rtexprvalue>
	  </attribute>
	  <attribute>
	     <name>onchange</name>
	     <required>false</required>
	     <rtexprvalue>false</rtexprvalue>
	  </attribute>
	  <attribute>
	     <name>items</name>
	     <required>true</required>
	     <rtexprvalue>true</rtexprvalue>
	  </attribute> 
	     
	  <attribute>
	     <name>valueProperty</name>
	     <required>true</required>
	     <rtexprvalue>false</rtexprvalue>
	  </attribute>   
	     
	 <attribute>
	     <name>textProperty</name>
	     <required>true</required>
	     <rtexprvalue>false</rtexprvalue>
	  </attribute>   
	  
	 <attribute>
	     <name>headValue</name>
	     <required>false</required>
	     <rtexprvalue>false</rtexprvalue>
	     </attribute> 
    <attribute>
	     <name>headText</name>
	     <required>false</required>
	     <rtexprvalue>false</rtexprvalue>
  </attribute> 
   <attribute>
	     <name>selectedValue</name>
	     <required>false</required>
	     <rtexprvalue>true</rtexprvalue>
   </attribute> 
   </tag> 
</taglib>

3、用来进行验证的代码:

     这里我用的集合名字都是上面已经写好了的,所以就直接拿过来使用了!!

<%@page import="com.zking.mvc.entity.Student"%>
<%@page import="java.util.ArrayList"%>
<%@page import="java.util.List"%>
<%@page import="com.zking.mvc.dao.DeptDAO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib prefix="z" 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>Insert title here</title>
</head>
<body>
    <ul>
       <li>
         <h2>z:select</h2>
         <div>
           <z:Select  headText="---请选择---"  items="${dislist}"  name="deptId" valueProperty="deptId" textProperty="deptName" cssStyle="width:200px;"/>
         </div>
         <div>
            <z:Select selectedValue="${deptId}" headText="---请选择---"  items="${dislist}"  name="deptId" valueProperty="deptId" textProperty="deptName" cssStyle="width:200px;"/>
         </div>
       </li>
     </ul>
</body>
</html>

4、运行结果:

Z:Radio  单选框标签

1、先写好一个RadioTag的标签助手类,并继承BodyTagSupport,根据需要的属性,定义好属性,写好对应的set/get方法........

public class RadioTag extends BodyTagSupport{

private static final long serialVersionUID = -7069758898902811916L;
private String name;//允许空   不支持表达式
private String value;//非空   不支持表达式
private String checked;//允许空  不支持表达式
private String text;//非空   不支持表达式

public String getName() {
	return name;
}


public void setName(String name) {
	this.name = name;
}


public String getValue() {
	return value;
}


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


public String getChecked() {
	return checked;
}


public void setChecked(String checked) {
	this.checked = checked;
}


public String getText() {
	return text;
}


public void setText(String text) {
	this.text = text;
}


public static long getSerialversionuid() {
	return serialVersionUID;
}

//开始标签
@Override
	public int doStartTag() throws JspException {
		try {
		JspWriter out=this.pageContext.getOut();
	    out.println(toHtml());
	    return SKIP_BODY;
		}catch (Exception e) {
			throw  new RuntimeException(e);
		}
	}

//拼接Radio
public String toHtml() {
	StringBuffer sb=new StringBuffer();
	sb.append( "<input type='radio'");
	if(null!=this.name) {
		sb.append(" name= '"+this.name+"'");
	}
	sb.append(" value='"+this.value+"'");
	if(null!=this.checked) {
		if(this.checked.equals(this.value)) {
			sb.append( "checked='checked'");
		}
	}
	sb.append("/>");
	sb.append(this.text);
	return sb.toString();
}

  2、相关配置文件(z.tld)

<!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>Simple Tags</short-name>
	<!--标签地址:一般通常放公司的域名+项目名  -->
	<uri>/zking</uri>
    <!--radio标签  -->
   <tag>
    <name>radio</name>
    <tag-class>com.zking.mvc.tag.RadioTag</tag-class>
    <body-content>empty</body-content>
    <attribute>
       <name>name</name>
       <required>false</required>
       <rtexprvalue>false</rtexprvalue>
    </attribute>
     <attribute>
       <name>value</name>
       <required>true</required>
       <rtexprvalue>false</rtexprvalue>
    </attribute>
    <attribute>
       <name>checked</name>
       <required>false</required>
       <rtexprvalue>false</rtexprvalue>
    </attribute>
     <attribute>
       <name>text</name>
       <required>true</required>
       <rtexprvalue>false</rtexprvalue>
    </attribute>
   </tag>
</taglib>

3、验证代码:

<%@page import="com.zking.mvc.entity.Student"%>
<%@page import="java.util.ArrayList"%>
<%@page import="java.util.List"%>
<%@page import="com.zking.mvc.dao.DeptDAO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib prefix="z" 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>Insert title here</title>
</head>
<body>
       
         <li>
         <h2>z:radio</h2>
	         <z:radio value="男" text="男"/>
	         <z:radio value="女" text="女" checked="女"/>
        </li>
     </ul>
</body>
</html>

 4、运行结果:

Z:CheckBox   复选框标签

1、先写一个CheckBoxTag的标签助手类,并继承BodyTagSupport.....

public class CheckBoxTag extends BodyTagSupport{

private static final long serialVersionUID = 2872470383710736929L;
private String value;//非空   不支持表达式
private String checked;//允许空   不支持表达式
private String text;//非空  不支持表达式

public String getValue() {
	return value;
}

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

public String getChecked() {
	return checked;
}

public void setChecked(String checked) {
	this.checked = checked;
}

public String getText() {
	return text;
}

public void setText(String text) {
	this.text = text;
}

public static long getSerialversionuid() {
	return serialVersionUID;
}

//开始标签
@Override
	public int doStartTag() throws JspException {
		try {
		JspWriter out=this.pageContext.getOut();
		out.println(toHtml());
		}catch (Exception e) {
			// TODO: handle exception
			throw new RuntimeException(e);
		}
		return super.doStartTag();
	}

//开始拼接checkbox
   public String toHtml() {
	   StringBuffer sb=new StringBuffer();
	   sb.append("<input type='checkbox' ");
	   sb.append(" value='"+this.value+"' ");
	   if(null!=this.checked) {
		   if(this.checked.equals(this.value)) {
			   sb.append(" checked='checked'");
		   }
	   }
	   sb.append("/>");
	   sb.append(this.text);
	   return sb.toString();
   }
	
}

2、相关配置文件(z.tld)

<!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>Simple Tags</short-name>
	<!--标签地址:一般通常放公司的域名+项目名  -->
	<uri>/zking</uri>
   <!--checkbox标签  -->
    <tag>
    <name>checkbox</name>
    <tag-class>com.zking.mvc.tag.CheckBoxTag</tag-class>
    <body-content>empty</body-content>
     <attribute>
       <name>value</name>
       <required>true</required>
       <rtexprvalue>false</rtexprvalue>
    </attribute>
    <attribute>
       <name>checked</name>
       <required>false</required>
       <rtexprvalue>false</rtexprvalue>
    </attribute>
     <attribute>
       <name>text</name>
       <required>true</required>
       <rtexprvalue>false</rtexprvalue>
    </attribute>
   </tag>
</taglib>

 3、验证代码:

<%@page import="com.zking.mvc.entity.Student"%>
<%@page import="java.util.ArrayList"%>
<%@page import="java.util.List"%>
<%@page import="com.zking.mvc.dao.DeptDAO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib prefix="z" 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>Insert title here</title>
</head>
<body>
         <h2>z:checkbox</h2>
	         <z:checkbox value="敲代码" text='敲代码' checked='敲代码' />
	         <z:checkbox value="听音乐" text='听音乐' checked='听音乐' />
	         <z:checkbox value="刷抖音" text='刷抖音' /> 
       </li>
     </ul>
</body>
</html>

    4、运行结果:

好了,基本上常用的标签的用法就总结到这了,接下来我们来看一下标签有哪些内容类型吧!!

 

2、标签的内容类型:

     empty表示空标签    jsp可以表示为任何合法的元素

然后是标签的属性啦!!!

 

3、标签属性:

       1、一般使用<atttribute></attribute>标签来设置标签属性

       2、<name></name>表示标签名称

       3、<required></required>表示标签属性是否必填    true表示必填   false表示不一定要填

       4、<rtexprvalue></rtexprvalue>表示是否可接收表达式为值    true表示可接收   false则相反

      5、<description></description>表示属性描述   可写可不写的  一般放在标签属性的最后面

     JSP自定义标签的知识点就讲到这里了,有什么更好的想法或者建议欢迎评论或者私信交流噢!!!

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值