Взаимодействие Spring MVC с пользовательским тегом

StackOverflow https://stackoverflow.com/questions/439861

Вопрос

У меня есть 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>

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

Если я создам пользовательский тег для генерирования вышеуказанного текста (с учетом "SOME PATH"), будут ли привязаны пользовательские теги Spring?

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

Это было полезно?

Решение

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

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

Первые два не сработали (хотя я подозреваю, что библиотеку тегов можно заставить работать), но файл тегов сработал! Решение было свободно основано на примере, приведенном в Expert 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" />
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top