2014-12-12 2 views
0

В моем текущем проекте весна-загрузки, у меня есть следовать thymeleaf процессор:Thymeleaf: обработка внутренних элементов

public class Form extends AbstractProcessor { 
    public static Element form = new Element("form"); 

    @Override 
    public ProcessorResult doProcess(Arguments arguments,ProcessorMatchingContext context,Node node) { 
    form.setProcessable(true); 
    form.setAttribute("role", "form"); 
    form.setAttribute("class", "form"); 
    form.setAttribute("action", ""); 
    form.setAttribute("method", "post"); 
    node.getParent().insertBefore(node, form); 

    List<Element> lista = node.getParent().getElementChildren(); 
    for(Element child : lista) { 
     if(!child.getOriginalName().equals("form")) { 
     child.moveAllChildren(form); 
     } 
    } 

    node.getParent().removeChild(node); 
    return ProcessorResult.OK; 
    } 

    @Override 
    public int getPrecedence() { 
    return 0; 
    } 

    @Override 
    public IProcessorMatcher<? extends Node> getMatcher() { 
    return new ElementNameProcessorMatcher("form"); 
    } 
} 

, который обрабатывает этот тег:

<form:form> 
    <field-box th:each="item : ${command.getClass().getDeclaredFields()}"> 
     <div th:each="item2 : ${item.getDeclaredAnnotations()}"> 
     <div th:switch="${item2.annotationType().getSimpleName()}"> 
      <div th:case="'Checkbox'"><field:checkbox/></div> 
      <div th:case="'DataList'"><field:datalist/></div> 
      <div th:case="'Input'"><field:input/></div> 
      <div th:case="'Radiobutton'"><field:radio/></div> 
      <div th:case="'Select'"><field:select/></div> 
      <div th:case="'Textarea'"><field:textarea/></div> 
     </div> 
     </div> 
    </field-box> 

    <button type="submit" class="btn btn-default">Cadastrar</button> 

    <div id="yes" class="alert alert-success" role="alert" style="display: none;"> 
     <button type="button" class="close" data-hide="alert"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button> 
     <span class="text">Configura&ccedil;&atilde;o salva com sucesso</span> 
    </div> 

    <div id="not" class="alert alert-danger" role="alert" style="display: none;"> 
     <button type="button" class="close" data-hide="alert"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button> 
     <span class="text"></span> 
    </div> 
    </form:form> 

и генерировать этот вывод:

<form role="form" class="form" action="" method="post"> 
    <field-box th:each="item : ${command.getClass().getDeclaredFields()}"> 
     <div th:each="item2 : ${item.getDeclaredAnnotations()}"> 
     <div th:switch="${item2.annotationType().getSimpleName()}"> 
      <div th:case="'Checkbox'"><field:checkbox></field:checkbox></div> 
      <div th:case="'DataList'"><field:datalist></field:datalist></div> 
      <div th:case="'Input'"><field:input></field:input></div> 
      <div th:case="'Radiobutton'"><field:radio></field:radio></div> 
      <div th:case="'Select'"><field:select></field:select></div> 
      <div th:case="'Textarea'"><field:textarea></field:textarea></div> 
     </div> 
     </div> 
    </field-box> 

    <button type="submit" class="btn btn-default">Cadastrar</button> 

    <div id="yes" class="alert alert-success" role="alert" style="display: none;"> 
     <button type="button" class="close" data-hide="alert"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button> 
     <span class="text">Configura&ccedil;&atilde;o salva com sucesso</span> 
    </div> 

    <div id="not" class="alert alert-danger" role="alert" style="display: none;"> 
     <button type="button" class="close" data-hide="alert"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button> 
     <span class="text"></span> 
    </div> 
    </form> 

Как видно из приведенного выше примера, код не обрабатывает элементы внутри тега <form:form>. Кто-нибудь знает, как это исправить?

ответ

0

Наконец-то я нашел решение этой проблемы. Конечным кодом для класса процессора FormProcessor является то, что:

public class Form extends AbstractProcessor { 
    public static Element form = new Element("form"); 

    @Override 
    public ProcessorResult doProcess(Arguments arguments,ProcessorMatchingContext context,Node node) { 
    form.setProcessable(true); 
    form.setAttribute("role", "form"); 
    form.setAttribute("class", "form"); 
    form.setAttribute("action", ""); 
    form.setAttribute("method", "post"); 
    node.getParent().insertBefore(node, form); 

    List<Element> lista = node.getParent().getElementChildren(); 
    for(Element child : lista) { 
     if(!child.getOriginalName().equals("form")) child.moveAllChildren(form); 
    } 

    List<Element> lista2 = form.getElementChildren(); 
    for(Element child : lista2) { 
     child.setProcessable(true); 
    } 

    node.getParent().removeChild(node); 
    return ProcessorResult.OK; 
    } 

    @Override 
    public int getPrecedence() { 
    return 0; 
    } 

    @Override 
    public IProcessorMatcher<? extends Node> getMatcher() { 
    return new ElementNameProcessorMatcher("form"); 
    } 
} 
Смежные вопросы