Spring MVC标记与自定义标记的交互

时间:2009-01-13 17:09:58

标签: spring spring-mvc jstl jsp-tags

我有一个JSP,它使用Spring:form标签将控件绑定到命令对象。

我想修改它如下:如果[某些条件为真]则显示控件;否则,只显示文字。 (示例:如果用户是管理员,则显示控件,否则只显示文本。如果whatsit仍然打开进行修改,则显示控件,否则显示文本。)

换句话说,我想要这个:

<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)?

1 个答案:

答案 0 :(得分:10)

通常唯一的解决方案是尝试它。

我尝试了三种不同的方式 - JSP自定义标记库,参数化JSP包含和JSP2标记文件。

前两个不起作用(虽然我怀疑标签库可以工作),但标签文件确实有效!该解决方案基于Expert Spring MVC and 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" />