diff --git a/core/src/main/java/org/apache/struts2/components/Component.java b/core/src/main/java/org/apache/struts2/components/Component.java
index e7bdc3672..6b9d547f3 100644
--- a/core/src/main/java/org/apache/struts2/components/Component.java
+++ b/core/src/main/java/org/apache/struts2/components/Component.java
@@ -278,7 +278,7 @@ public class Component {
public static String stripExpressionIfAltSyntax(ValueStack stack, String expr) {
if (altSyntax(stack)) {
// does the expression start with %{ and end with }? if so, just cut it off!
- if (expr.startsWith("%{") && expr.endsWith("}")) {
+ if (isExpression(expr)) {
return expr.substring(2, expr.length() - 1);
}
}
@@ -511,10 +511,16 @@ public class Component {
}
/**
- * Overwrite to set if body shold be used.
+ * Overwrite to set if body should be used.
* @return always false for this component.
*/
public boolean usesBody() {
return false;
}
+
+ public static boolean isExpression(Object value) {
+ String expr = value.toString();
+ return expr.startsWith("%{") && expr.endsWith("}");
+ }
+
}
diff --git a/core/src/main/java/org/apache/struts2/views/jsp/ui/AbstractUITag.java b/core/src/main/java/org/apache/struts2/views/jsp/ui/AbstractUITag.java
index f157764ba..9a7716346 100644
--- a/core/src/main/java/org/apache/struts2/views/jsp/ui/AbstractUITag.java
+++ b/core/src/main/java/org/apache/struts2/views/jsp/ui/AbstractUITag.java
@@ -22,6 +22,7 @@
package org.apache.struts2.views.jsp.ui;
import org.apache.commons.lang3.ObjectUtils;
+import org.apache.struts2.components.Component;
import org.apache.struts2.components.UIBean;
import org.apache.struts2.views.jsp.ComponentTagSupport;
@@ -291,10 +292,11 @@ public abstract class AbstractUITag extends ComponentTagSupport implements Dynam
}
public void setDynamicAttribute(String uri, String localName, Object value) throws JspException {
- if (value != null && value instanceof String) {
+ if (Component.altSyntax(getStack()) && Component.isExpression(value)) {
dynamicAttributes.put(localName, String.valueOf(ObjectUtils.defaultIfNull(findValue(value.toString()), value)));
} else {
dynamicAttributes.put(localName, value);
}
}
+
}
diff --git a/core/src/test/java/org/apache/struts2/views/freemarker/FreeMarkerResultTest.java b/core/src/test/java/org/apache/struts2/views/freemarker/FreeMarkerResultTest.java
index 666b266d5..d52099eca 100644
--- a/core/src/test/java/org/apache/struts2/views/freemarker/FreeMarkerResultTest.java
+++ b/core/src/test/java/org/apache/struts2/views/freemarker/FreeMarkerResultTest.java
@@ -44,6 +44,8 @@ import java.io.File;
import java.io.PrintWriter;
import java.io.StringWriter;
+import static org.apache.struts2.views.jsp.AbstractUITagTest.normalize;
+
/**
* Test case for FreeMarkerResult.
*
@@ -262,7 +264,7 @@ public class FreeMarkerResultTest extends StrutsTestCase {
+ "\n"
+ "\n"
+ "\n";
- assertEquals(expected, stringWriter.toString());
+ assertEquals(normalize(expected), normalize(stringWriter.toString()));
}
public void testDynamicAttributesInTheme() throws Exception {
diff --git a/core/src/test/java/org/apache/struts2/views/jsp/ui/AnchorTest.java b/core/src/test/java/org/apache/struts2/views/jsp/ui/AnchorTest.java
index b75bd9459..cba1b37d3 100644
--- a/core/src/test/java/org/apache/struts2/views/jsp/ui/AnchorTest.java
+++ b/core/src/test/java/org/apache/struts2/views/jsp/ui/AnchorTest.java
@@ -71,7 +71,7 @@ public class AnchorTest extends AbstractUITagTest {
AnchorTag tag = createTag();
tag.setHref("a");
- tag.setDynamicAttribute("uri", "placeholder", "foo");
+ tag.setDynamicAttribute("uri", "placeholder", "%{foo}");
tag.doStartTag();
tag.doEndTag();