/*
* Copyright 2002-2018 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.web.servlet.tags;
import java.beans.PropertyEditor;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.TagSupport;
import org.springframework.lang.Nullable;
import org.springframework.web.util.TagUtils;
The <transform>
tag provides transformation for reference data values from controllers and other objects inside a spring:bind
tag (or a data-bound form element tag from Spring's form tag library). The BindTag has a PropertyEditor that it uses to transform properties of
a bean to a String, usable in HTML forms. This tag uses that PropertyEditor
to transform objects passed into this tag.
Attribute Summary
Attribute
Required?
Runtime Expression?
Description
htmlEscape
false
true
Set HTML escaping for this tag, as boolean value. Overrides the default HTML
escaping setting for the current page.
scope
false
true
The scope to use when exported the result to a variable. This attribute
is only used when var is also set. Possible values are page, request, session
and application.
value
true
true
The value to transform. This is the actual object you want to have
transformed (for instance a Date). Using the PropertyEditor that is currently
in use by the 'spring:bind' tag.
var
false
true
The string to use when binding the result to the page, request, session
or application scope. If not specified, the result gets outputted to the
writer (i.e. typically directly to the JSP).
Author: Alef Arendsen, Juergen Hoeller See Also: Since: 20.09.2003
/**
* The {@code <transform>} tag provides transformation for reference data values
* from controllers and other objects inside a {@code spring:bind} tag (or a
* data-bound form element tag from Spring's form tag library).
*
* <p>The BindTag has a PropertyEditor that it uses to transform properties of
* a bean to a String, usable in HTML forms. This tag uses that PropertyEditor
* to transform objects passed into this tag.
*
* <table>
* <caption>Attribute Summary</caption>
* <thead>
* <tr>
* <th>Attribute</th>
* <th>Required?</th>
* <th>Runtime Expression?</th>
* <th>Description</th>
* </tr>
* </thead>
* <tbody>
* <tr>
* <td>htmlEscape</td>
* <td>false</td>
* <td>true</td>
* <td>Set HTML escaping for this tag, as boolean value. Overrides the default HTML
* escaping setting for the current page.</td>
* </tr>
* <tr>
* <td>scope</td>
* <td>false</td>
* <td>true</td>
* <td>The scope to use when exported the result to a variable. This attribute
* is only used when var is also set. Possible values are page, request, session
* and application.</td>
* </tr>
* <tr>
* <td>value</td>
* <td>true</td>
* <td>true</td>
* <td>The value to transform. This is the actual object you want to have
* transformed (for instance a Date). Using the PropertyEditor that is currently
* in use by the 'spring:bind' tag.</td>
* </tr>
* <tr>
* <td>var</td>
* <td>false</td>
* <td>true</td>
* <td>The string to use when binding the result to the page, request, session
* or application scope. If not specified, the result gets outputted to the
* writer (i.e. typically directly to the JSP).</td>
* </tr>
* </tbody>
* </table>
*
* @author Alef Arendsen
* @author Juergen Hoeller
* @since 20.09.2003
* @see BindTag
*/
@SuppressWarnings("serial")
public class TransformTag extends HtmlEscapingAwareTag {
the value to transform using the appropriate property editor. /** the value to transform using the appropriate property editor. */
@Nullable
private Object value;
the variable to put the result in. /** the variable to put the result in. */
@Nullable
private String var;
the scope of the variable the result will be put in. /** the scope of the variable the result will be put in. */
private String scope = TagUtils.SCOPE_PAGE;
Set the value to transform, using the appropriate PropertyEditor
from the enclosing BindTag.
The value can either be a plain value to transform (a hard-coded String
value in a JSP or a JSP expression), or a JSP EL expression to be evaluated
(transforming the result of the expression).
/**
* Set the value to transform, using the appropriate PropertyEditor
* from the enclosing BindTag.
* <p>The value can either be a plain value to transform (a hard-coded String
* value in a JSP or a JSP expression), or a JSP EL expression to be evaluated
* (transforming the result of the expression).
*/
public void setValue(Object value) {
this.value = value;
}
Set PageContext attribute name under which to expose
a variable that contains the result of the transformation.
See Also: - setScope
- setAttribute.setAttribute
/**
* Set PageContext attribute name under which to expose
* a variable that contains the result of the transformation.
* @see #setScope
* @see javax.servlet.jsp.PageContext#setAttribute
*/
public void setVar(String var) {
this.var = var;
}
Set the scope to export the variable to.
Default is SCOPE_PAGE ("page").
See Also: - setVar
- TagUtils.SCOPE_PAGE
- setAttribute.setAttribute
/**
* Set the scope to export the variable to.
* Default is SCOPE_PAGE ("page").
* @see #setVar
* @see org.springframework.web.util.TagUtils#SCOPE_PAGE
* @see javax.servlet.jsp.PageContext#setAttribute
*/
public void setScope(String scope) {
this.scope = scope;
}
@Override
protected final int doStartTagInternal() throws JspException {
if (this.value != null) {
// Find the containing EditorAwareTag (e.g. BindTag), if applicable.
EditorAwareTag tag = (EditorAwareTag) TagSupport.findAncestorWithClass(this, EditorAwareTag.class);
if (tag == null) {
throw new JspException("TransformTag can only be used within EditorAwareTag (e.g. BindTag)");
}
// OK, let's obtain the editor...
String result = null;
PropertyEditor editor = tag.getEditor();
if (editor != null) {
// If an editor was found, edit the value.
editor.setValue(this.value);
result = editor.getAsText();
}
else {
// Else, just do a toString.
result = this.value.toString();
}
result = htmlEscape(result);
if (this.var != null) {
this.pageContext.setAttribute(this.var, result, TagUtils.getScope(this.scope));
}
else {
try {
// Else, just print it out.
this.pageContext.getOut().print(result);
}
catch (IOException ex) {
throw new JspException(ex);
}
}
}
return SKIP_BODY;
}
}