2016-05-09 49 views
0

我正在学习标签创建,我可以找到的所有教程只提供基本的hello world示例。春天的RepeatableField标签mvc

如何为可重复字段创建自定义标签,这取决于<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%>

有没有一种方法来强制tagdir内doTag方法的标记呈现?我演示标签

示例代码:

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(); 
     } 
    } 
} 

RepeatableField.tld

<?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> 

和页:

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> 

回答

1

我们可能会被标记是否为空来判断。

Tag tag = TagSupport.findAncestorWithClass(this,FormTag.class); 

例如,如果它为空则抛出异常。