У меня есть 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) обрабатываются одновременно?
Часто единственное решение - это попробовать.
Я попробовал это тремя разными способами: с помощью библиотеки пользовательских тегов 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" />
Это конкретное приложение готово, но оно все еще работает и работает нормально. В итоге мы добавили еще один вложенный тег c:when внутри части, которая отображает ввод; он по-разному отображается для определенных тегов, таких как textarea или select.
Как у тебя дела с этим? Я использовал файлы тегов, но все они разваливаются на <select>. Теги Spring проверяют, есть ли у тега параметров родительский тег-предок, но поскольку они находятся в разных файлах тегов, он его не находит. Это вызывает исключение. :(