第一步 创建助手类并继承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