Взаимодействие тега Spring MVC с настраиваемым тегом

У меня есть JSP, который использует теги Spring: form для привязки элементов управления к объекту команды.

Я хотел бы изменить его следующим образом: если [какое-то условие истинно], чем отображать элементы управления; в противном случае просто отобразите текст. (Примеры: если пользователь является администратором, отобразите элементы управления, в противном случае просто отобразите текст. Если элемент все еще открыт для изменения, отобразите элементы управления, в противном случае отобразите текст.)

Другими словами, я хочу это:

<c:choose>
     <c:when test = "SOME TEST HERE">
          <form:input path = "SOME PATH" />
     </c:when>
     <c:otherwise>
          <p>${SOME PATH}</p>
     </c:otherwise>
</c:choose>

Но мне нужен простой способ создать это для каждого поля (их много).

Если я создам настраиваемый тег для генерации указанного выше текста (с учетом «НЕКОТОРЫЙ ПУТЬ»), будут ли привязаны настраиваемые теги Spring?

Я предполагаю, что на самом деле я спрашиваю: могу ли я создавать собственные теги, которые генерируют настраиваемые теги Spring, которые привязываются тогда? Или все пользовательские теги (мои и Spring) обрабатываются одновременно?

8
0
17 022
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Часто единственное решение - это попробовать.

Я попробовал это тремя разными способами: с помощью библиотеки пользовательских тегов JSP, параметризованного включения JSP и файла тегов JSP2.

Первые два не работали (хотя я подозреваю, что библиотеку тегов можно заставить работать), но файл тегов работал! Решение было основано на примере, приведенном в Эксперт Spring MVC и Web Flow.

Вот мой код в WEB-INF / tags / renderConditionalControl.tag:

<%@ tag body-content = "tagdependent" isELIgnored = "false" %>
<%@ attribute name = "readOnly" required = "true" %>
<%@ attribute name = "path" required = "true" %>
<%@ attribute name = "type" required = "false" %>
<%@ attribute name = "className" required = "true" %>
<%@ taglib prefix = "c" uri = "http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix = "fmt" uri = "http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix = "form" uri = "/WEB-INF/spring-form.tld" %>
<%@ taglib prefix = "spring" uri = "/WEB-INF/spring.tld" %>

<c:if test = "${empty type}">
<c:set var = "type" value = "text" scope = "page" />
</c:if>

<spring:bind path = "${path}">
    <c:choose>
        <c:when test = "${readOnly}">
            <span class = "readOnly">${status.value}</span>
        </c:when>
        <c:otherwise>
           <input type = "${type}" id = "${status.expression}" name = "${status.expression}"
                    value = "${status.value}" class = "${className}" />
        </c:otherwise>
    </c:choose>
</spring:bind>

А вот код в jsp:

Во-первых, с другими директивами taglibs:

<%@ taglib tagdir = "/WEB-INF/tags" prefix = "tag" %> 

и в форме:

<tag:renderConditionalControl path = "someObject.someField" type = "text" readOnly = "${someBoolean}" className = "someClass" />

Как у тебя дела с этим? Я использовал файлы тегов, но все они разваливаются на <select>. Теги Spring проверяют, есть ли у тега параметров родительский тег-предок, но поскольку они находятся в разных файлах тегов, он его не находит. Это вызывает исключение. :(

Ben Thurley 02.11.2012 20:28

Это конкретное приложение готово, но оно все еще работает и работает нормально. В итоге мы добавили еще один вложенный тег c:when внутри части, которая отображает ввод; он по-разному отображается для определенных тегов, таких как textarea или select.

Jacob Mattison 03.11.2012 01:04

Другие вопросы по теме