自定义select下拉框标签

第一步 创建助手类并继承BodyTagSupport

第二步 定义属性并提供get/set方法

private List<Object> items=new ArrayList<>();//保存数据
private String value;//保存下拉框的value值
private String text;//保存标签体的内容
private String selectVal;//被选中

第三步 重写doStartTag()方法

 

@Override
public int doStartTag() throws JspException {
    //select没有标签体,又要输出内容,所要用流对象
    JspWriter out = pageContext.getOut();
    //拼接,写一个拼接的方法
    try {
        out.print(pinjie());
    } catch (Exception e) {
        e.printStackTrace();
    }
    return super.doStartTag();
}

第四步 写拼接的方法

private String pinjie() throws Exception{
    //StringBuffer 不能像String那样直接通过赋值的方式完成对象实例化
    StringBuffer sb = new StringBuffer("<select>");
    //遍历
    for (Object o:items){
        System.out.println(o);
        //获取值,所有写一个根据对象取值
        String val=getObjectattrvalue(o,value);
        String tex=getObjectattrvalue(o,text);
        sb.append("<option "+(val.equals(selectVal) ? "selected":"")+" value='"+val+"'>"+tex+"</option>");
    }
    sb.append("</select>");
    return sb.toString();
}

 

第五步 根据对象取值

/**
 * 根据对象取值
 * @param obj 对象
 * @param attr 属性
 */
private String getObjectattrvalue(Object obj,String attr) throws Exception {
    //类/对象
    Class c = obj.getClass();
    //属性(获取单个所有的属性(包括私有的。。。))
    Field f = c.getDeclaredField(attr);
    //打开权限
    f.setAccessible(true);
    return f.get(obj).toString();
}

 

第六步 在WEB-INF或其子目录下导入或创建标签描述文件tld

<tag>
		<!-- 标签名 -->
		<name>select</name>
		<!-- 标签工具类 -->
		<tag-class>com.zking.tag.SelectTag</tag-class>
		<!-- 标签的内容类型:empty表示空标签,jsp表示可以为任何合法的JSP元素 -->
		<body-content>jsp</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>selectVal</name>
			<!-- true表示必填 -->
			<required>true</required>
			<!-- true支持动态值,可以向值里面填jsp表达式、EL表达式,false则不支持 -->
			<rtexprvalue>true</rtexprvalue>
		</attribute>
	</tag>

 

最后一步到jsp页面中引入自定义标签

<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.List" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@taglib prefix="z" uri="/zking" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <%
        List<Dept> list = new ArrayList<>();
        list.add(new Dept(1,"张三"));
        list.add(new Dept(2,"花花"));
        list.add(new Dept(3,"李四"));
        list.add(new Dept(4,"王五"));
        request.setAttribute("names", list);
    %>
   
    <h3>6.自定义select下拉框标签</h3>
   <z:select items="${names}" selectVal="name" text="name" value="id">
        ${name}
   </z:select>

</body>
</html>

                                                 

就是这样的效果,完成啦ヾ(≧▽≦*)o

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值