【问题标题】:RepeatableField tag in spring mvcspring mvc中的RepeatableField标签
【发布时间】:2016-09-04 07:14:31
【问题描述】:

我正在学习标签创建,我能找到的所有教程都只提供基本的 hello world 示例。

如何为可重复字段创建自定义标签,这将取决于<%@ 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();
        }
    }
}

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>

【问题讨论】:

    标签: jsp spring-mvc custom-tags


    【解决方案1】:

    我们可能会通过标签是否为空来判断。

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

    例如,如果为null则抛出异常。

    【讨论】:

      猜你喜欢
      • 2023-04-01
      • 2018-02-04
      • 1970-01-01
      • 1970-01-01
      • 2014-12-19
      • 2013-06-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-01
      相关资源
      最近更新 更多