TagWriter使用范例
例1
/*******************************************************************************
* Copyright (c) 2005, 2014 springside.github.io
*
* Licensed under the Apache License, Version 2.0 (the "License");
*******************************************************************************/
package org.springside.modules.web.taglib;
import java.util.Collection;
import java.util.Iterator;
import java.util.Map;
import javax.servlet.jsp.JspException;
import org.springframework.beans.BeanWrapper;
import org.springframework.beans.PropertyAccessorFactory;
import org.springframework.util.ObjectUtils;
import org.springframework.web.servlet.tags.form.AbstractMultiCheckedElementTag;
import org.springframework.web.servlet.tags.form.TagWriter;
/**
* 重载实现Twitter Bootstrap的格式.
*
* @author calvin
*/
public abstract class BSAbstractMultiCheckedElementTag extends AbstractMultiCheckedElementTag {
private String labelCssClass;
public void setLabelCssClass(String labelCssClass) {
this.labelCssClass = labelCssClass;
}
/**
* Copy & Paste, 无修正.
*/
@Override
protected int writeTagContent(TagWriter tagWriter) throws JspException {
Object items = getItems();
Object itemsObject = (items instanceof String ? evaluate("items", items) : items);
String itemValue = getItemValue();
String itemLabel = getItemLabel();
String valueProperty = (itemValue != null ? ObjectUtils.getDisplayString(evaluate("itemValue", itemValue))
: null);
String labelProperty = (itemLabel != null ? ObjectUtils.getDisplayString(evaluate("itemLabel", itemLabel))
: null);
Class<?> boundType = getBindStatus().getValueType();
if ((itemsObject == null) && (boundType != null) && boundType.isEnum()) {
itemsObject = boundType.getEnumConstants();
}
if (itemsObject == null) {
throw new IllegalArgumentException(
"Attribute 'items' is required and must be a Collection, an Array or a Map");
}
if (itemsObject.getClass().isArray()) {
Object[] itemsArray = (Object[]) itemsObject;
for (int i = 0; i < itemsArray.length; i++) {
Object item = itemsArray[i];
writeObjectEntry(tagWriter, valueProperty, labelProperty, item, i);
}
} else if (itemsObject instanceof Collection) {
final Collection optionCollection = (Collection) itemsObject;
int itemIndex = 0;
for (Iterator it = optionCollection.iterator(); it.hasNext(); itemIndex++) {
Object item = it.next();
writeObjectEntry(tagWriter, valueProperty, labelProperty, item, itemIndex);
}
} else if (itemsObject instanceof Map) {
final Map optionMap = (Map) itemsObject;
int itemIndex = 0;
for (Iterator it = optionMap.entrySet().iterator(); it.hasNext(); itemIndex++) {
Map.Entry entry = (Map.Entry) it.next();
writeMapEntry(tagWriter, valueProperty, labelProperty, entry, itemIndex);
}
} else {
throw new IllegalArgumentException("Attribute 'items' must be an array, a Collection or a Map");
}
return SKIP_BODY;
}
/**
* Copy & Paste, 无修正.
*/
private void writeObjectEntry(TagWriter tagWriter, String valueProperty, String labelProperty, Object item,
int itemIndex) throws JspException {
BeanWrapper wrapper = PropertyAccessorFactory.forBeanPropertyAccess(item);
Object renderValue;
if (valueProperty != null) {
renderValue = wrapper.getPropertyValue(valueProperty);
} else if (item instanceof Enum) {
renderValue = ((Enum<?>) item).name();
} else {
renderValue = item;
}
Object renderLabel = (labelProperty != null ? wrapper.getPropertyValue(labelProperty) : item);
writeElementTag(tagWriter, item, renderValue, renderLabel, itemIndex);
}
/**
* Copy & Paste, 无修正.
*/
private void writeMapEntry(TagWriter tagWriter, String valueProperty, String labelProperty, Map.Entry entry,
int itemIndex) throws JspException {
Object mapKey = entry.getKey();
Object mapValue = entry.getValue();
BeanWrapper mapKeyWrapper = PropertyAccessorFactory.forBeanPropertyAccess(mapKey);
BeanWrapper mapValueWrapper = PropertyAccessorFactory.forBeanPropertyAccess(mapValue);
Object renderValue = (valueProperty != null ? mapKeyWrapper.getPropertyValue(valueProperty) : mapKey.toString());
Object renderLabel = (labelProperty != null ? mapValueWrapper.getPropertyValue(labelProperty) : mapValue
.toString());
writeElementTag(tagWriter, mapKey, renderValue, renderLabel, itemIndex);
}
/**
* 重载方法,调整元素的输出顺序。
*/
private void writeElementTag(TagWriter tagWriter, Object item, Object value, Object label, int itemIndex)
throws JspException {
String id = resolveId();
String resolvedLabelClass = getInputType();
if (labelCssClass != null) {
resolvedLabelClass += " " + labelCssClass;
}
tagWriter.startTag("label");
tagWriter.writeAttribute("for", id);
tagWriter.writeAttribute("class", resolvedLabelClass);
if (itemIndex > 0) {
Object resolvedDelimiter = evaluate("delimiter", getDelimiter());
if (resolvedDelimiter != null) {
tagWriter.appendValue(resolvedDelimiter.toString());
}
}
tagWriter.startTag("input");
writeOptionalAttribute(tagWriter, "id", id);
writeOptionalAttribute(tagWriter, "name", getName());
writeOptionalAttributes(tagWriter);
tagWriter.writeAttribute("type", getInputType());
renderFromValue(item, value, tagWriter);
tagWriter.endTag();
tagWriter.appendValue(convertToDisplayString(label));
tagWriter.endTag();
}
}
Source View
例2
@Override
protected int writeTagContent(TagWriter tagWriter) throws JspException {
super.writeTagContent(tagWriter);
if (!isDisabled()) {
tagWriter.startTag("input");
tagWriter.writeAttribute("type", "hidden");
String name = WebDataBinder.DEFAULT_FIELD_MARKER_PREFIX + getName();
tagWriter.writeAttribute("name", name);
tagWriter.writeAttribute("value", processFieldValue(name, "on", getInputType()));
tagWriter.endTag();
}
return SKIP_BODY;
}
Source View
例3
@Override
protected void renderFromBodyContent(BodyContent bodyContent, TagWriter tagWriter) throws JspException {
tagWriter.startTag("div");
if(getBindStatus().getErrors().hasFieldErrors(getBindStatus().getExpression())) {
tagWriter.writeAttribute("class", getCssErrorClass());
} else {
tagWriter.writeAttribute("class", getCssClass());
}
tagWriter.appendValue(bodyContent.getString());
tagWriter.endTag();
}
Source View
例4
private void writeArrow(
TagWriter tagWriter,
String imageFilename,
String cssClassName,
String alt,
String href) throws JspException {
tagWriter.startTag("li");
tagWriter.startTag("a");
tagWriter.writeAttribute("class", cssClassName);
tagWriter.writeAttribute("href",href);
tagWriter.writeAttribute("alt",alt);
tagWriter.startTag("img");
tagWriter.writeAttribute("src", "/img/" + imageFilename);
tagWriter.endTag();
tagWriter.endTag();
tagWriter.endTag();
}
Source View
目前只用到这几个,如果有别的需求,可以到原地址去看看。