利用BodyTagSupport创建带标签体的自定义标签

创建自定义标签的处理类 PersonTag.java,需要继承 BodyTagSupport 类,并重写 doStartTag 方法,在该方法内部实现渲染我们业务上需要展示的html对应的逻辑。

package com.terwergreen;

import com.terwergreen.util.StringUtil;

import org.apache.commons.beanutils.PropertyUtils;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.jsp.JspException;

import javax.servlet.jsp.tagext.BodyTagSupport;

import java.io.IOException;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.Iterator;

import java.util.List;

import java.util.Map;

/**

* PersonTag

*

* @author Terwer

* @version 1.0

* 2019/10/16 14:24

**/

public class PersonTag extends BodyTagSupport {

protected String personName;

protected String loginName;

protected String personId;

protected Boolean layer = Boolean.TRUE;

protected Object bean;

public String getPersonName() {

return personName;

}

public void setPersonName(String personName) {

this.personName = personName;

}

public String getLoginName() {

return loginName;

}

public void setLoginName(String loginName) {

this.loginName = loginName;

}

public String getPersonId() {

return personId;

}

public void setPersonId(String personId) {

this.personId = personId;

}

public Boolean getLayer() {

return layer;

}

public void setLayer(Boolean layer) {

this.layer = layer;

}

public Object getBean() {

return bean;

}

public void setBean(Object bean) {

this.bean = bean;

}

public int doStartTag() throws JspException {

try {

String cxpath = ((HttpServletRequest) pageContext.getRequest())

.getContextPath();

StringBuffer sb = new StringBuffer();

List> list = this.parseToOrgList();

for (int i = 0; i < list.size(); i++) {

Map tmpPerson = list.get(i);

if (list.size() > 1 && i != list.size() - 1) {

tmpPerson.put("fdName", tmpPerson.get("fdName") + ";");

}

sb.append(render(cxpath, tmpPerson,

layer != null ? layer.booleanValue() : true));

}

pageContext.getOut().print(sb.toString());

} catch (Exception e) {

e.printStackTrace();

}

return SKIP_BODY;

}

public static StringBuffer render(String cxpath,

Map tmpPerson, boolean layer) {

StringBuffer sb = new StringBuffer();

sb.append("

// sb.append("

// + "href=\""

// + cxpath

// + "/sys/person/sys_person_zone/sysPersonZone.do?method=view&fdId="

// + tmpPerson.get("fdId") + "\" target=\"_blank\"");

if (layer) {

sb.append(" ajax-href=\"" + cxpath + "/sys/zone/resource/zoneInfo.jsp?fdId=" + tmpPerson.get("fdId") + "\"");

sb.append(" onmouseover=\"if(window.LUI && window.LUI.person)window.LUI.person(event,this);\"");

}

sb.append(">");

sb.append(org.apache.commons.lang.StringEscapeUtils.escapeHtml(tmpPerson.get("fdName")));

sb.append("");

return sb;

}

private List> parseToOrgList() throws Exception {

List> rtnList = new ArrayList>();

if (StringUtil.isNotNull(personId)) {

if (personId.indexOf(";") > -1) {

String[] persons = personId.split(";");

String[] names = null;

if (StringUtil.isNotNull(personName)) {

names = personName.split(";");

}

for (int i = 0; i < persons.length; i++) {

rtnList.add(parseToMap(persons[i], names == null ? null

: (names[i] == null ? null : names[i]), loginName));

}

} else {

rtnList.add(parseToMap(personId, personName, loginName));

}

} else if (bean != null) {

Object tmpBean = null;

if (bean instanceof String) {

String beanCfg = (String) bean;

if (beanCfg.indexOf(";") > -1) {

String[] beans = beanCfg.split(";");

for (int i = 0; i < beans.length; i++) {

rtnList.add(parseToMap(pageContext

.getAttribute(beans[i])));

}

} else {

tmpBean = pageContext.getAttribute(beanCfg);

}

} else {

tmpBean = bean;

}

if (tmpBean != null) {

if (tmpBean instanceof Object[]) {

Object[] beans = (Object[]) tmpBean;

for (int i = 0; i < beans.length; i++) {

rtnList.add(parseToMap(beans[i]));

}

} else if (tmpBean instanceof List) {

List beans = (List) tmpBean;

for (int i = 0; i < beans.size(); i++) {

rtnList.add(parseToMap(beans.get(i)));

}

} else if (tmpBean instanceof Map) {

Map beans = (Map) tmpBean;

for (Iterator iterator = beans.values().iterator(); iterator

.hasNext(); ) {

Object tmpObject = (Object) iterator.next();

rtnList.add(parseToMap(tmpObject));

}

} else {

rtnList.add(parseToMap(tmpBean));

}

}

}

return rtnList;

}

private Map parseToMap(String fdId, String fdName,

String fdLoginName) throws Exception {

Map map = new HashMap();

map.put("fdId", fdId);

if (StringUtil.isNotNull(fdName)) {

map.put("fdName", fdName);

map.put("fdLoginName", fdLoginName);

} else {

try {

map.put("fdName", "唐有炜");

} catch (Exception e) {

map.put("fdName", "");

}

}

return map;

}

private Map parseToMap(Object beanObj) throws Exception {

Map map = new HashMap();

if (beanObj != null) {

map.put("fdId", (String) PropertyUtils.getProperty(beanObj, "fdId"));

map.put("fdName",

(String) PropertyUtils.getProperty(beanObj, "fdName"));

map.put("fdLoginName",

(String) PropertyUtils.getProperty(beanObj, "fdLoginName"));

}

return map;

}

}

2、创建tld描述文件,位置放在 WEB-INF/tld/ui.tld 下

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 web-jsptaglibrary_2_0.xsd"

version="2.0">

2.0

2.0

ui

http://www.landray.com.cn/tags/widget

person

com.terwergreen.PersonTag

JSP

personId

personId

false

true

personName

personName

false

true

bean

bean

false

true

java.lang.Object

layer

layer

false

true

java.lang.Boolean

3、web.xml 加入 taglib

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"

version="4.0">

ui

/WEB-INF/tld/ui.tld

4、创建测试页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<%@ taglib uri="/WEB-INF/tld/ui.tld" prefix="ui" %>

Title

Hello World