diff --git a/apps/showcase/src/main/webapp/WEB-INF/decorators/main.jsp b/apps/showcase/src/main/webapp/WEB-INF/decorators/main.jsp index 39a3a03ea..0d09eb647 100644 --- a/apps/showcase/src/main/webapp/WEB-INF/decorators/main.jsp +++ b/apps/showcase/src/main/webapp/WEB-INF/decorators/main.jsp @@ -113,7 +113,7 @@ - Download image file. + Download image file.
@@ -47,7 +47,7 @@
- Download ZIP file. + Download ZIP file.
diff --git a/apps/showcase/src/main/webapp/WEB-INF/hangman/hangmanNonAjax.ftl b/apps/showcase/src/main/webapp/WEB-INF/hangman/hangmanNonAjax.ftl index 046ab4bab..3c3251892 100644 --- a/apps/showcase/src/main/webapp/WEB-INF/hangman/hangmanNonAjax.ftl +++ b/apps/showcase/src/main/webapp/WEB-INF/hangman/hangmanNonAjax.ftl @@ -125,7 +125,7 @@ <#else> " width="381" height="44" /> - <@s.a href="%{#startHref}" escapeHtmlBody="false"> + <@s.a href="%{#startHref}"> " width="250" height="43" /> <#else> @@ -139,7 +139,7 @@ <@s.a href="%{#url}" id="%{#currentCharacter}" - escapeHtmlBody="false" + > " width="36" border="0" /> diff --git a/apps/showcase/src/main/webapp/WEB-INF/person/new-person.ftl b/apps/showcase/src/main/webapp/WEB-INF/person/new-person.ftl index 6af4da446..07a66d4a6 100644 --- a/apps/showcase/src/main/webapp/WEB-INF/person/new-person.ftl +++ b/apps/showcase/src/main/webapp/WEB-INF/person/new-person.ftl @@ -59,7 +59,7 @@
- <@s.submit value="Create person" cssClass="btn btn-primary" escapeHtmlBody="false"/> + <@s.submit value="Create person" cssClass="btn btn-primary"/>
diff --git a/apps/showcase/src/main/webapp/WEB-INF/tags/non-ui/actionPrefix/actionPrefix.ftl b/apps/showcase/src/main/webapp/WEB-INF/tags/non-ui/actionPrefix/actionPrefix.ftl index 806883716..6e4432ea5 100644 --- a/apps/showcase/src/main/webapp/WEB-INF/tags/non-ui/actionPrefix/actionPrefix.ftl +++ b/apps/showcase/src/main/webapp/WEB-INF/tags/non-ui/actionPrefix/actionPrefix.ftl @@ -35,7 +35,7 @@

The text you've entered is ${text!''}

- <@s.a href="javascript:history.back();" cssClass="btn btn-info" escapeHtmlBody="false"> Back + <@s.a href="javascript:history.back();" cssClass="btn btn-info"> Back diff --git a/apps/showcase/src/main/webapp/WEB-INF/tags/non-ui/actionPrefix/actionPrefixExample.ftl b/apps/showcase/src/main/webapp/WEB-INF/tags/non-ui/actionPrefix/actionPrefixExample.ftl index 63312c786..98b0a9232 100644 --- a/apps/showcase/src/main/webapp/WEB-INF/tags/non-ui/actionPrefix/actionPrefixExample.ftl +++ b/apps/showcase/src/main/webapp/WEB-INF/tags/non-ui/actionPrefix/actionPrefixExample.ftl @@ -57,13 +57,13 @@ <@s.textfield label="Enter Some Text" name="text" /> - <@s.submit action="actionPrefix" value="%{'action prefix'}" cssClass="btn" escapeHtmlBody="false" /> + <@s.submit action="actionPrefix" value="%{'action prefix'}" cssClass="btn" /> - <@s.submit method="alternateMethod" value="%{'method prefix'}" cssClass="btn" escapeHtmlBody="false" /> + <@s.submit method="alternateMethod" value="%{'method prefix'}" cssClass="btn" /> - <@s.submit value="Normal Submit" cssClass="btn" escapeHtmlBody="false" /> + <@s.submit value="Normal Submit" cssClass="btn" /> - <@s.submit action="redirectActionPrefixAction" value="%{'redirectAction without prefix'}" cssClass="btn" escapeHtmlBody="false" /> + <@s.submit action="redirectActionPrefixAction" value="%{'redirectAction without prefix'}" cssClass="btn" /> diff --git a/apps/showcase/src/main/webapp/WEB-INF/tags/non-ui/actionPrefix/methodPrefix.ftl b/apps/showcase/src/main/webapp/WEB-INF/tags/non-ui/actionPrefix/methodPrefix.ftl index b94bf6d88..e2cf0ee56 100644 --- a/apps/showcase/src/main/webapp/WEB-INF/tags/non-ui/actionPrefix/methodPrefix.ftl +++ b/apps/showcase/src/main/webapp/WEB-INF/tags/non-ui/actionPrefix/methodPrefix.ftl @@ -32,10 +32,10 @@

You have come to this page because you used an method prefix.

- +

The text you've enter is ${text!''}

- <@s.a href="javascript:history.back();" cssClass="btn btn-info" escapeHtmlBody="false"> Back + <@s.a href="javascript:history.back();" cssClass="btn btn-info"> Back

diff --git a/apps/showcase/src/main/webapp/WEB-INF/tags/non-ui/actionPrefix/normalSubmit.ftl b/apps/showcase/src/main/webapp/WEB-INF/tags/non-ui/actionPrefix/normalSubmit.ftl index 3052ff173..7df58271d 100644 --- a/apps/showcase/src/main/webapp/WEB-INF/tags/non-ui/actionPrefix/normalSubmit.ftl +++ b/apps/showcase/src/main/webapp/WEB-INF/tags/non-ui/actionPrefix/normalSubmit.ftl @@ -32,10 +32,10 @@

You have come to this page because you did a normal submit.

- +

The text you've enter is %{text}

- <@s.a href="javascript:history.back();" cssClass="btn btn-info" escapeHtmlBody="false"> Back + <@s.a href="javascript:history.back();" cssClass="btn btn-info"> Back

diff --git a/apps/showcase/src/main/webapp/WEB-INF/tags/non-ui/actionPrefix/redirectActionPrefix.ftl b/apps/showcase/src/main/webapp/WEB-INF/tags/non-ui/actionPrefix/redirectActionPrefix.ftl index 602f6bee7..93fee964c 100644 --- a/apps/showcase/src/main/webapp/WEB-INF/tags/non-ui/actionPrefix/redirectActionPrefix.ftl +++ b/apps/showcase/src/main/webapp/WEB-INF/tags/non-ui/actionPrefix/redirectActionPrefix.ftl @@ -32,13 +32,13 @@

You have come to this page because you used an 'redirect-action' prefix.

- +

Because this is a redirect-action, the text will be lost, due to a redirection implies a new request being issued from the client.

The text you've enter is ${text!''}

- <@s.a href="javascript:history.back();" cssClass="btn btn-info" escapeHtmlBody="false"> Back + <@s.a href="javascript:history.back();" cssClass="btn btn-info"> Back

diff --git a/apps/showcase/src/main/webapp/WEB-INF/tags/non-ui/iteratorTag/appendIteratorTagDemoResult.jsp b/apps/showcase/src/main/webapp/WEB-INF/tags/non-ui/iteratorTag/appendIteratorTagDemoResult.jsp index c95de872d..c2c7ff3dd 100644 --- a/apps/showcase/src/main/webapp/WEB-INF/tags/non-ui/iteratorTag/appendIteratorTagDemoResult.jsp +++ b/apps/showcase/src/main/webapp/WEB-INF/tags/non-ui/iteratorTag/appendIteratorTagDemoResult.jsp @@ -46,7 +46,7 @@ - Back To Input + Back To Input diff --git a/apps/showcase/src/main/webapp/WEB-INF/tags/non-ui/iteratorTag/iteratorGeneratorTagDemoResult.jsp b/apps/showcase/src/main/webapp/WEB-INF/tags/non-ui/iteratorTag/iteratorGeneratorTagDemoResult.jsp index fefb0933e..f4a31d897 100644 --- a/apps/showcase/src/main/webapp/WEB-INF/tags/non-ui/iteratorTag/iteratorGeneratorTagDemoResult.jsp +++ b/apps/showcase/src/main/webapp/WEB-INF/tags/non-ui/iteratorTag/iteratorGeneratorTagDemoResult.jsp @@ -41,7 +41,7 @@ - Back To Input + Back To Input diff --git a/apps/showcase/src/main/webapp/WEB-INF/tags/non-ui/iteratorTag/mergeIteratorTagDemoResult.jsp b/apps/showcase/src/main/webapp/WEB-INF/tags/non-ui/iteratorTag/mergeIteratorTagDemoResult.jsp index 3ae67a590..1798da445 100644 --- a/apps/showcase/src/main/webapp/WEB-INF/tags/non-ui/iteratorTag/mergeIteratorTagDemoResult.jsp +++ b/apps/showcase/src/main/webapp/WEB-INF/tags/non-ui/iteratorTag/mergeIteratorTagDemoResult.jsp @@ -45,7 +45,7 @@ - Back To Input + Back To Input diff --git a/apps/showcase/src/main/webapp/WEB-INF/tags/non-ui/iteratorTag/subsetIteratorTagDemoResult.jsp b/apps/showcase/src/main/webapp/WEB-INF/tags/non-ui/iteratorTag/subsetIteratorTagDemoResult.jsp index fc89d5e28..e704e577d 100644 --- a/apps/showcase/src/main/webapp/WEB-INF/tags/non-ui/iteratorTag/subsetIteratorTagDemoResult.jsp +++ b/apps/showcase/src/main/webapp/WEB-INF/tags/non-ui/iteratorTag/subsetIteratorTagDemoResult.jsp @@ -42,7 +42,7 @@ - Back To Input + Back To Input diff --git a/apps/showcase/src/main/webapp/WEB-INF/token/example4.ftl b/apps/showcase/src/main/webapp/WEB-INF/token/example4.ftl index e97fa0820..19dac0114 100644 --- a/apps/showcase/src/main/webapp/WEB-INF/token/example4.ftl +++ b/apps/showcase/src/main/webapp/WEB-INF/token/example4.ftl @@ -51,7 +51,7 @@ <@s.form action="transfer4"> <@s.token/> <@s.textfield label="Amount" name="amount" required=true value="400"/> - <@s.submit value="Transfer money" cssClass="btn btn-primary" escapeHtmlBody="false"/> + <@s.submit value="Transfer money" cssClass="btn btn-primary"/> diff --git a/core/pom.xml b/core/pom.xml index 980714243..cd5677742 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -342,7 +342,7 @@ org.slf4j slf4j-simple - true + test + + + + + + + + diff --git a/plugins/javatemplates/src/main/java/org/apache/struts2/views/java/DefaultTagHandlerFactory.java b/plugins/javatemplates/src/main/java/org/apache/struts2/views/java/DefaultTagHandlerFactory.java index 4e356c3a6..4110320da 100644 --- a/plugins/javatemplates/src/main/java/org/apache/struts2/views/java/DefaultTagHandlerFactory.java +++ b/plugins/javatemplates/src/main/java/org/apache/struts2/views/java/DefaultTagHandlerFactory.java @@ -22,14 +22,15 @@ import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.LogManager; /** - * Default implementation of TagHandlerFactory + * Default implementation of TagHandlerFactory */ public class DefaultTagHandlerFactory implements TagHandlerFactory { - private static final Logger LOG = LogManager.getLogger(DefaultTagHandlerFactory.class); - - private Class tagHandlerClass; - public DefaultTagHandlerFactory(Class tagHandlerClass) { + private static final Logger LOG = LogManager.getLogger(DefaultTagHandlerFactory.class); + + private final Class tagHandlerClass; + + public DefaultTagHandlerFactory(Class tagHandlerClass) { this.tagHandlerClass = tagHandlerClass; } @@ -41,7 +42,7 @@ public class DefaultTagHandlerFactory implements TagHandlerFactory { } catch (Exception e) { LOG.error("Failed to instantiate tag handler class [{}]", tagHandlerClass.getName(), e); } - + return null; } diff --git a/plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/AnchorHandler.java b/plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/AnchorHandler.java index 12df24635..405088f0c 100644 --- a/plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/AnchorHandler.java +++ b/plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/AnchorHandler.java @@ -45,8 +45,10 @@ public class AnchorHandler extends AbstractTagHandler implements TagGenerator { .addIfExists("tabindex", params.get("tabindex")); start("a", attrs); String body = (String) params.get("body"); - if (StringUtils.isNotEmpty(body)) - characters(body, false); + Boolean escapeHtmlBody = (Boolean) params.get("escapeHtmlBody"); + if (StringUtils.isNotEmpty(body)) { + characters(body, escapeHtmlBody); + } end("a"); } } diff --git a/plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/SimpleTheme.java b/plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/SimpleTheme.java index adfc7f9c8..c65a21c05 100644 --- a/plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/SimpleTheme.java +++ b/plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/SimpleTheme.java @@ -65,13 +65,13 @@ public class SimpleTheme extends DefaultTheme { setName("simple"); } - private class FactoryList extends ArrayList { + private static class FactoryList extends ArrayList { private static final long serialVersionUID = -1551895041394434032L; - public FactoryList(Class... classes) { + public FactoryList(Class... classes) { super(); - for (Class cls : classes) { + for (Class cls : classes) { add(new DefaultTagHandlerFactory(cls)); } add(new DefaultTagHandlerFactory(XHTMLTagSerializer.class)); diff --git a/plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/SubmitHandler.java b/plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/SubmitHandler.java index 8207d7ba5..27a39d3f3 100644 --- a/plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/SubmitHandler.java +++ b/plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/SubmitHandler.java @@ -73,6 +73,7 @@ public class SubmitHandler extends AbstractTagHandler implements TagGenerator { public void generate() throws IOException { Map params = context.getParameters(); String body = (String) params.get("body"); + Boolean escapeHtmlBody = (Boolean) params.get("escapeHtmlBody"); String type = StringUtils.defaultString((String) params.get("type"), "input"); if ("button".equals(type)) { @@ -81,16 +82,19 @@ public class SubmitHandler extends AbstractTagHandler implements TagGenerator { characters(body, false); else if (params.containsKey("label")) { String label = (String) params.get("label"); - if (StringUtils.isNotEmpty(label)) - characters(label, false); + if (StringUtils.isNotEmpty(label)) { + characters(label, escapeHtmlBody); + } } end("button"); } else if ("image".equals(type)) { - if (StringUtils.isNotEmpty(body)) - characters(body, false); + if (StringUtils.isNotEmpty(body)) { + characters(body, escapeHtmlBody); + } end("input"); - } else + } else { end("input"); + } } } } diff --git a/plugins/javatemplates/src/test/java/org/apache/struts2/views/java/simple/AnchorTest.java b/plugins/javatemplates/src/test/java/org/apache/struts2/views/java/simple/AnchorTest.java index d727a7440..58709a245 100644 --- a/plugins/javatemplates/src/test/java/org/apache/struts2/views/java/simple/AnchorTest.java +++ b/plugins/javatemplates/src/test/java/org/apache/struts2/views/java/simple/AnchorTest.java @@ -69,6 +69,42 @@ public class AnchorTest extends AbstractTest { assertEquals(expected, output); } + public void testEnableEscapeBody() { + tag.setName("name_"); + tag.setHref("http://sometest.com?ab=10"); + tag.setEscapeHtmlBody(true); + tag.evaluateParams(); + + map.putAll(tag.getParameters()); + context.getParameters().put("body", s("")); + + theme.renderTag(getTagName(), context); + theme.renderTag(getTagName() + "-close", context); + + String output = writer.getBuffer().toString(); + String expected = s("
<i class="i-image"/>"); + + assertEquals(expected, output); + } + + public void testDefaultDisabledEscapeBody() { + tag.setName("name_"); + tag.setHref("http://sometest.com?ab=10"); + //tag.setEscapeHtmlBody(true); + tag.evaluateParams(); + + map.putAll(tag.getParameters()); + context.getParameters().put("body", s("")); + + theme.renderTag(getTagName(), context); + theme.renderTag(getTagName() + "-close", context); + + String output = writer.getBuffer().toString(); + String expected = s(""); + + assertEquals(expected, output); + } + @Override protected void setUp() throws Exception { super.setUp();