自定义标签2


请先看链接内容再看本章https://blog.csdn.net/IJump_/article/details/91060606

1.自定义deptList数据标签,select标签

  • 定义了两个模拟实体类
package com.zking.jspTag.entity;

import java.io.Serializable;

public class Address implements Serializable {
	
	private int sid;
	private String sname;
	public int getSid() {
		return sid;
	}
	public void setSid(int sid) {
		this.sid = sid;
	}
	public String getSname() {
		return sname;
	}
	public void setSname(String sname) {
		this.sname = sname;
	}
	public Address(int sid, String sname) {
		super();
		this.sid = sid;
		this.sname = sname;
	}
	@Override
	public String toString() {
		return "Address [sid=" + sid + ", sname=" + sname + "]";
	}
	public Address() {
	}
}
**第二个实体类**
package com.zking.jspTag.entity;

import java.io.Serializable;

public class Deptment implements Serializable {
	private Integer id;
	private String	name;
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Deptment(Integer id, String name) {
		super();
		this.id = id;
		this.name = name;
	}
	@Override
	public String toString() {
		return "Deptment [id=" + id + ", name=" + name + "]";
	}
}

  • 一个dao类两个模拟数据方法
package com.zking.jspTag.dao;

import java.util.ArrayList;
import java.util.List;

import com.zking.jspTag.entity.Address;
import com.zking.jspTag.entity.Deptment;

public class DeptmentDao {
	
	public List<Deptment> queryDept(){
		List<Deptment> lst = new ArrayList<Deptment>();
		lst.add(new Deptment(1, "市场部"));
		lst.add(new Deptment(2, "财务部"));
		lst.add(new Deptment(3, "研发部"));
		lst.add(new Deptment(4, "经济"));
		return lst;	
	}
	
	public List<Address> queryAddressDept(){
		List<Address> lst = new ArrayList<Address>();
		lst.add(new Address(5, "湖南"));
		lst.add(new Address(6, "上海"));
		lst.add(new Address(7, "北京"));
		lst.add(new Address(8, "天津"));
		return lst;	
	}

}
  • 两个Tag(SelectTag 标签/数据标签)
//SelectTag 
package com.zking.jspTag.test;

import java.lang.reflect.Field;
import java.util.List;

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

public class SelectTag extends BodyTagSupport{
	//数据源
	private List<Object> items;
	//定义option中的value
	private String value;
	//定义option中的text
	private String text;
	//默认值
	private Object defualt;

	public Object getDefualt() {
		return defualt;
	}
	public void setDefualt(Object defualt) {
		this.defualt = defualt;
	}
	public List<Object> getItems() {
		return items;
	}
	public void setItems(List<Object> items) {
		this.items = items;
	}
	public String getValue() {
		return value;
	}
	public void setValue(String value) {
		this.value = value;
	}
	public String getText() {
		return text;
	}
	public void setText(String text) {
		this.text = text;
	}
	@Override
	public int doEndTag() throws JspException {
		return EVAL_PAGE;
	}
	@Override
	public int doStartTag() throws JspException {
		try {
			JspWriter out = pageContext.getOut();
			out.write(toHtml());
		} catch (Exception e) {
			e.printStackTrace();
		}
		return SKIP_BODY;
	}
	
	public String toHtml() throws IllegalArgumentException, IllegalAccessException {
		if(null==items||0==items.size()) 
			return "";
		else {
			StringBuilder sb = new StringBuilder();
			sb.append("<select>");
			//默认值
			sb.append("<option value=''>请选择</option>");
			
			//遍历集合obj==Deptment
			for (Object obj : items) {
				//根据value获取对应的属性值,绑定到option标签中的value属性
				String val = getObjectValue(obj, value);
				//根据text获取对应的属性值,绑定到option标签体的位置
				String txt = getObjectValue(obj, text);
				//绑定option标签
				if(val.equals(defualt))
					sb.append("<option value='"+val+"' selected>"+txt+"</option>"); 
				else
					sb.append("<option value='"+val+"'>"+txt+"</option>"); 
			}
			sb.append("</select>");
			return sb.toString();
			
		}	
		
	}
	
	//利用反射
	private String getObjectValue(Object obj,String name) throws IllegalArgumentException, IllegalAccessException {
		Object val = null;
		//获取类对象
		Class cla = obj.getClass();
		//获取类中的所有属性数组
		Field[] fields = cla.getDeclaredFields();
		//遍历属性数据
		for (Field field : fields) {
			//获取属性名
			String filedname = field.getName();
			//将属性名与name进行比较
			if(filedname.toUpperCase().equals(name.toUpperCase())) {
				//设置访问权限
				field.setAccessible(true);
				//取值
				val = field.get(obj);
				break;
			}
		}
		return val.toString();
		
	}
}
//数据标签
package com.zking.jspTag.test;

import java.io.IOException;
import java.util.List;

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

import com.zking.jspTag.dao.DeptmentDao;
import com.zking.jspTag.entity.Address;
import com.zking.jspTag.entity.Deptment;

public class DeptTag extends BodyTagSupport{
	//将数据保存到page中并以var来命名
	private String var;
	
	public String getVar() {
		return var;
	}

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

	@Override
	public int doEndTag() throws JspException {
		return EVAL_PAGE;
	}

	@Override
	public int doStartTag() throws JspException {
		DeptmentDao deptDao = new DeptmentDao();
		List<Deptment> lst = deptDao.queryDept();
		List<Address> lst1 = deptDao.queryAddressDept();
		pageContext.setAttribute("address", lst1);
		pageContext.setAttribute(var, lst);
		try {
			JspWriter out = pageContext.getOut();
			out.write("输出成功");
		} catch (Exception e) {
			e.printStackTrace();
		}
		return SKIP_BODY;
	}
	
}

  • 一个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>b</short-name>
	<!-- 你标签库的引用uri -->
	<uri>/zking</uri>
	
	<!-- Dept标签 -->
	<tag>
		<!-- 标签名 -->
		<name>data</name>
		<!-- 标签工具类 -->
		<!-- 反射Class.forName(com.zking.jspTag.test.DeptTag) -->
		<tag-class>com.zking.jspTag.test.DeptTag</tag-class>
		<!-- 标签的内容类型:empty表示空标签,jsp表示可以为任何合法的JSP元素 -->
		<body-content>empty</body-content>
		<!-- 自定义标签的属性定义,请注意一定要在标签类中提供对应的get/set方法 -->
		<attribute>
			<!-- 自定义标签的属性名称 -->
			<name>var</name>
			<!-- true表示必填 -->
			<required>true</required>
			<!-- true支持动态值,可以向值里面填jsp表达式、EL表达式,false则不支持 -->
			<rtexprvalue>false</rtexprvalue>
		</attribute>
	</tag>
	
	<!-- select标签 -->
	<tag>
		<!-- 标签名 -->
		<name>select</name>
		<!-- 标签工具类 -->
		<!-- 反射Class.forName(com.zking.jspTag.test.SelectTag) -->
		<tag-class>com.zking.jspTag.test.SelectTag</tag-class>
		<!-- 标签的内容类型:empty表示空标签,jsp表示可以为任何合法的JSP元素 -->
		<body-content>empty</body-content>
		<!-- 自定义标签的属性定义,请注意一定要在标签类中提供对应的get/set方法 -->
		<attribute>
			<!-- 自定义标签的属性名称 -->
			<name>items</name>
			<!-- true表示必填 -->
			<required>true</required>
			<!-- true支持动态值,可以向值里面填jsp表达式、EL表达式,false则不支持 -->
			<rtexprvalue>true</rtexprvalue>
		</attribute>
		<attribute>
			<!-- 自定义标签的属性名称 -->
			<name>value</name>
			<!-- true表示必填 -->
			<required>true</required>
			<!-- true支持动态值,可以向值里面填jsp表达式、EL表达式,false则不支持 -->
			<rtexprvalue>false</rtexprvalue>
		</attribute>
		<attribute>
			<!-- 自定义标签的属性名称 -->
			<name>text</name>
			<!-- true表示必填 -->
			<required>true</required>
			<!-- true支持动态值,可以向值里面填jsp表达式、EL表达式,false则不支持 -->
			<rtexprvalue>false</rtexprvalue>
		</attribute>
		<attribute>
			<!-- 自定义标签的属性名称 -->
			<name>defualt</name>
			<!-- true表示必填 -->
			<required>false</required>
			<!-- true支持动态值,可以向值里面填jsp表达式、EL表达式,false则不支持 -->
			<rtexprvalue>false</rtexprvalue>
		</attribute>
	</tag>
	
</taglib>
  • 一个jsp页面 (测试效果)
<%@ 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" %>    
<%@ page import="java.util.*" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Insert title here</title>
</head>
<body>
<h2>数据标签</h2>
<b:data var="data"/>
${data }
${address}
<h2>select标签</h2>
<b:select items="${data}" value="id" text="name"/>
<b:select items="${address }" value="sid" text="sname" defualt="5"/>
</body>
</html> 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值