views:

3440

answers:

2

I have a JSP that is using Spring:form tags to bind controls to a command object.

I would like to modify it as follows: if [some condition is true] than display the controls; otherwise, just display the text. (Examples: if the user is an Admin, display the controls, otherwise just display the text. If the whatsit is still open for modification, display the controls, otherwise display the text.)

In other words, I want this:

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

But I want an easy way to create this for every field (there are many).

If I create a custom tag to generate the above text (given "SOME PATH"), will the Spring custom tags get bound?

I guess what I'm really asking is: can I create custom tags that generate Spring custom tags that then get bound? Or do all custom tags (mine and Spring's) get handled simultaneously?

+2  A: 

Frequently the only solution is to try it.

I tried it three different ways -- a JSP custom tag library, a parameterized JSP include, and a JSP2 tag file.

The first two didn't work (although I suspect the tag library can be made to work), but the tag file did! The solution was based loosely on an example given in Expert Spring MVC and Web Flow.

Here's my code in 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>

And here's the code in the jsp: First,with the other taglibs directives:

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

and within the form:

<tag:renderConditionalControl path="someObject.someField" type="text" readOnly="${someBoolean}" className="someClass" />
JacobM
This is exactly what I need!
kosoant
A: 

In your code I can see ${status.expression}, I guess status is bean name. If I wnat to get the bean name from the user .For eg. I may have an attribute say beanName in the tag file.

How do I access ${status.expression}? I can do something like this:

Var beanExpression ='${beanName }'+'.'+${expression};(say expression also taken as an attribute from tag) '${beanExpression }' should give me the same value as '${status.expression}. But this value is null. How do I access this in tag file?

Rashi