0
私はタグの作成を学習しています。見つけることができるすべてのチュートリアルは、基本的なものだけを提供しますhello world
例。春の反復可能なフィールドタグmvc
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
に依存する反復可能フィールドのカスタムタグを作成するにはどうすればよいですか?
doTagメソッド内でtagdirからタグを強制的にレンダリングする方法はありますか?
私のデモタグのコード例:
RepeatableField.java
package demo;
import java.lang.reflect.Field;
import java.util.Iterator;
import java.util.List;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.SimpleTagSupport;
import org.springframework.util.ReflectionUtils;
import lombok.Setter;
@Setter
public class RepeatableField extends SimpleTagSupport {
private Object wrapObject;
private String itemsField;
@Override
public void doTag() throws JspException {
JspWriter out = getJspContext().getOut();
try {
StringBuffer sb = new StringBuffer();
Class clazz = wrapObject.getClass();
Field field = ReflectionUtils.findField(clazz, itemsField);
List<? extends Object> items = null;
if (field != null) {
field.setAccessible(true);
items = (List<? extends Object>) field.get(wrapObject);
}
if (items == null) {
throw new Exception("list is empty");
}
Iterator<? extends Object> iterator = items.iterator();
sb.append("<div class='panel panel-flat'>");
sb.append("<div class='repeatable-list'>");
int i = 0;
if (items.isEmpty()) {
sb.append("<div class='list-item'>");
// do rendering of particular item
sb.append("<div class='form-group' style='height: 100%;'>");
sb.append("<label class='col-md-3 control-label'>");
sb.append("description");
sb.append("</label>");
sb.append("<div class='col-md-9'>");
sb.append("<input ");
sb.append("id='");
sb.append(itemsField);
sb.append(i);
sb.append(".description");
sb.append("'");
sb.append("name='");
sb.append(itemsField);
sb.append("[");
sb.append(i);
sb.append("].description");
sb.append("' value='");
sb.append("");
sb.append("' class='form-control' />");
sb.append("</div>");
sb.append("</div>");
sb.append("</div>");
} else {
while (iterator.hasNext()) {
Object item = iterator.next();
Class valueClass = item.getClass();
Field valueField = valueClass.getDeclaredField("description");
valueField.setAccessible(true);
Object val = valueField.get(item);
val = val == null ? "" : val;
sb.append("<div class='list-item'>");
// do rendering of particular item
sb.append("<div class='form-group' style='height: 100%;'>");
sb.append("<label class='col-md-3 control-label'>");
sb.append("description");
sb.append("</label>");
sb.append("<div class='col-md-9'>");
sb.append("<input ");
sb.append("id='");
sb.append(itemsField);
sb.append(i);
sb.append(".description");
sb.append("'");
sb.append("name='");
sb.append(itemsField);
sb.append("[");
sb.append(i);
sb.append("].description");
sb.append("' value='");
sb.append(val);
sb.append("' class='form-control' />");
sb.append("</div>");
sb.append("</div>");
sb.append("</div>");
i++;
}
}
sb.append("<a href='#' class='list-add'>Add</a>");
sb.append("</div>");
sb.append("</div>");
out.println(sb);
} catch (Exception e) {
e.printStackTrace();
}
}
}
は
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
<taglib>
<tlib-version>1.0</tlib-version>
<jsp-version>2.0</jsp-version>
<short-name>testing</short-name>
<description>This is a demonstration tag library</description>
<tag>
<name>RepeatableField</name>
<tag-class>demo.RepeatableField</tag-class>
<body-content>empty</body-content>
<description>Repeatable field implementation</description>
<attribute>
<name>wrapObject</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
<type>java.lang.Object</type>
</attribute>
<attribute>
<name>itemsField</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
<type>java.lang.String</type>
</attribute>
</tag>
</taglib>
とページをRepeatableField.tld:
formPage.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
<%@ taglib uri="/WEB-INF/tlds/RepeatableField.tld" prefix="demo"%>
<form:form class="form-horizontal" modelAttribute="entry">
<h3>repeatable field</h3>
<demo:RepeatableField wrapObject="${entry}" itemsField="items" />
</form:form>
レンダリングされたHTMLは次のようになります。
<form id="entry" class="form-horizontal" action="/main/entry/add" method="post">
<div class="panel panel-flat"><div class="repeatable-list">
<div class="list-item">
<div class="form-group" style="height: 100%;">
<label class="col-md-3 control-label">description</label>
<div class="col-md-9">
<input id="items0.description" name="items[0].description" value="" class="form-control">
</div>
</div>
</div>
<a href="#" class="list-add">Add</a></div></div>
</div>
</form>