jar包提取链接: https://pan.baidu.com/s/1q3piAsbjkOx-RriWtrL31Q
提取码: zsbb
- 自定义标签开发步骤
1.1 助手类
1.2 tld
1.3 taglib - UI标签
z:select //比较麻烦的 - 数据标签
z:set
tid文件
<?xml version="1.0" encoding="UTF-8" ?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
version="2.0">
<description>liubiao 1.1 core library</description>
<display-name>liubiao core</display-name>
<tlib-version>1.1</tlib-version>
<short-name>z</short-name>
<uri>/liubiao</uri>
</taglib>
set标签配置
<tag>
<name>set</name>//标签名
<tag-class>com.liubiao.tag.SetTag</tag-class>
<body-content>empty</body-content>
<attribute>
<name>value</name>//属性值
<required>true</required>//是否必填
<rtexprvalue>false</rtexprvalue>//是否支持表达式
</attribute>
</tag>
set标签助手类
package com.liubiao.tag;
import java.util.List;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport;
import com.liubiao.dao.DeptDao;
import com.liubiao.entity.Dept;
public class SetTag extends BodyTagSupport {
private String value;//保存数据的key
private DeptDao deptDao=new DeptDao();//数据库获取方法类
public SetTag() {
super();
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public DeptDao getDeptDao() {
return deptDao;
}
public void setDeptDao(DeptDao deptDao) {
this.deptDao = deptDao;
}
//为了方便为连接数据库获取数据
@Override
public int doStartTag() throws JspException {
List<Dept> list = deptDao.list();
pageContext.setAttribute(value, list);
return super.doStartTag();
}
}
dao方法类
package com.liubiao.dao;
import java.util.ArrayList;
import java.util.List;
import com.liubiao.entity.Dept;
public class DeptDao {
public List<Dept> list(){
//访问数据库
List<Dept> list=new ArrayList<Dept>();
list.add(new Dept(1,"教质部"));
list.add(new Dept(2,"教学部"));
list.add(new Dept(3,"财务部"));
list.add(new Dept(4,"就业部"));
return list;
}
}
select自定义标签配置
<tag>
<name>select</name>
<tag-class>com.liubiao.tag.SelectTag</tag-class>
<body-content>empty</body-content>
<attribute>
<name>items</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>name</name>
<required>false</required>
<rtexprvalue>false</rtexprvalue>
</attribute>
<attribute>
<name>valueKey</name>
<required>true</required>
<rtexprvalue>false</rtexprvalue>
</attribute>
<attribute>
<name>textKey</name>
<required>true</required>
<rtexprvalue>false</rtexprvalue>
</attribute>
<attribute>
<name>cssStyle</name>
<required>false</required>
<rtexprvalue>false</rtexprvalue>
</attribute>
<attribute>
<name>headKey</name>
<required>false</required>
<rtexprvalue>false</rtexprvalue>
</attribute>
<attribute>
<name>headValue</name>
<required>false</required>
<rtexprvalue>false</rtexprvalue>
</attribute>
<attribute>
<name>selectedOptionValue</name>
<required>false</required>
<rtexprvalue>false</rtexprvalue>
</attribute>
</tag>
select下拉框自定义标签助手类
package com.liubiao.tag;
import java.util.List;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.BodyTagSupport;
import org.apache.commons.beanutils.PropertyUtils;
public class SelectTag extends BodyTagSupport {
private static final Object Object = null;
private List<Object> items;//下拉框内容集合
private String name;//name值
private String valueKey;//保存option中的value的key
private String textKey;//保存option中text文本的key
private String cssStyle;//css样式
private String headKey;//option请选择的value值
private String headValue;//option的文本值(自己设置)
private String selectedOptionValue;//默认选中
public SelectTag() {
super();
}
public List<Object> getItems() {
return items;
}
public void setItems(List<Object> items) {
this.items = items;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getValueKey() {
return valueKey;
}
public void setValueKey(String valueKey) {
this.valueKey = valueKey;
}
public String getTextKey() {
return textKey;
}
public void setTextKey(String textKey) {
this.textKey = textKey;
}
public String getCssStyle() {
return cssStyle;
}
public void setCssStyle(String cssStyle) {
this.cssStyle = cssStyle;
}
public String getHeadKey() {
return headKey;
}
public void setHeadKey(String headKey) {
this.headKey = headKey;
}
public String getHeadValue() {
return headValue;
}
public void setHeadValue(String headValue) {
this.headValue = headValue;
}
public String getSelectedOptionValue() {
return selectedOptionValue;
}
public void setSelectedOptionValue(String selectedOptionValue) {
this.selectedOptionValue = selectedOptionValue;
}
@Override
public int doStartTag() throws JspException {
JspWriter out = pageContext.getOut();
try {
//调用标签拼接方法
String html = toHtml();
//打印到jsp界面上
out.println(html);
} catch (Exception e) {
throw new RuntimeException();
}
return super.doStartTag();
}
private String toHtml() throws Exception, NoSuchMethodException {
//拼接用的
StringBuffer sb=new StringBuffer();
sb.append("<select name='"+name+"'");
sb.append(" style='"+cssStyle+"'");
sb.append(">");
//如果集合有数据默认选中"请选择"列
if(null!=items && 0!=items.size()) {
if(null!=headKey && !"".equals(headKey.trim())) {
sb.append("<option value='"+headKey+"'>"+headValue+"</option>");
}
//option的value值
Object value=null;
//option文本内容
Object text=null;
//遍历集合进行拼接
for (Object object : items) {
//可以写反射代码进行数据反射
//我这里用了2个jar包能不用写反射代码
value=PropertyUtils.getProperty(object, valueKey);
text=PropertyUtils.getProperty(object, textKey);
if(value.toString().equals(selectedOptionValue.trim())) {
sb.append("<option selected value='"+value+"'>"+text+"</option>");
}else {
sb.append("<option value='"+value+"'>"+text+"</option>");
}
}
}
sb.append("</select>");
return sb.toString();
}
}
jsp界面代码
<%@page import="java.util.ArrayList"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="l" uri="/liubiao" %>>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>标签</title>
</head>
<body>
<h2>自定义标签set</h2>
<l:set value="deptList"/>
<l:out value="${deptList }"/>
<h2>自定义标签select</h2>
<l:select selectedOptionValue="3" headKey="-1" headValue="----请选择----" cssStyle="width:150px" items="${deptList }" valueKey="deptId" textKey="deptName"/>
</body>
</html>
jsp界面结果图