diff --git a/core/src/main/java/org/apache/struts2/components/Checkbox.java b/core/src/main/java/org/apache/struts2/components/Checkbox.java index 591f425ac..dd853caba 100644 --- a/core/src/main/java/org/apache/struts2/components/Checkbox.java +++ b/core/src/main/java/org/apache/struts2/components/Checkbox.java @@ -75,7 +75,8 @@ public class Checkbox extends UIBean { } if (submitUnchecked != null) { - addParameter("submitUnchecked", findValue(submitUnchecked, Boolean.class)); + Object parsedValue = findValue(submitUnchecked, Boolean.class); + addParameter("submitUnchecked", parsedValue == null ? Boolean.valueOf(submitUnchecked) : parsedValue); } else { addParameter("submitUnchecked", false); } diff --git a/plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/CheckboxHandler.java b/plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/CheckboxHandler.java index c712ddaeb..6f0e9651b 100644 --- a/plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/CheckboxHandler.java +++ b/plugins/javatemplates/src/main/java/org/apache/struts2/views/java/simple/CheckboxHandler.java @@ -18,13 +18,14 @@ */ package org.apache.struts2.views.java.simple; -import org.apache.struts2.views.java.Attributes; -import org.apache.struts2.views.java.TagGenerator; import org.apache.commons.lang3.StringUtils; import org.apache.commons.text.StringEscapeUtils; +import org.apache.struts2.views.java.Attributes; +import org.apache.struts2.views.java.TagGenerator; import java.io.IOException; import java.util.Map; +import java.util.Objects; public class CheckboxHandler extends AbstractTagHandler implements TagGenerator { public void generate() throws IOException { @@ -35,29 +36,33 @@ public class CheckboxHandler extends AbstractTagHandler implements TagGenerator String id = (String) params.get("id"); String name = (String) params.get("name"); Object disabled = params.get("disabled"); + boolean submitUnchecked = Boolean.parseBoolean(Objects.toString(params.get("submitUnchecked"), "false")); attrs.add("type", "checkbox") - .add("name", name) - .add("value", fieldValue) - .addIfTrue("checked", params.get("nameValue")) - .addIfTrue("readonly", params.get("readonly")) - .addIfTrue("disabled", disabled) - .addIfExists("tabindex", params.get("tabindex")) - .addIfExists("id", id) - .addIfExists("class", params.get("cssClass")) - .addIfExists("style", params.get("cssStyle")) - .addIfExists("title", params.get("title")); + .add("name", name) + .add("value", fieldValue) + .addIfTrue("checked", params.get("nameValue")) + .addIfTrue("readonly", params.get("readonly")) + .addIfTrue("disabled", disabled) + .addIfExists("tabindex", params.get("tabindex")) + .addIfExists("id", id) + .addIfExists("class", params.get("cssClass")) + .addIfExists("style", params.get("cssStyle")) + .addIfExists("title", params.get("title")); start("input", attrs); end("input"); - //hidden input - attrs = new Attributes(); - attrs.add("type", "hidden") + if (!submitUnchecked) { + //hidden input + attrs = new Attributes(); + + attrs.add("type", "hidden") .add("id", "__checkbox_" + StringUtils.defaultString(StringEscapeUtils.escapeHtml4(id))) .add("name", "__checkbox_" + StringUtils.defaultString(StringEscapeUtils.escapeHtml4(name))) .add("value", "__checkbox_" + StringUtils.defaultString(StringEscapeUtils.escapeHtml4(fieldValue))) .addIfTrue("disabled", disabled); - start("input", attrs); - end("input"); + start("input", attrs); + end("input"); + } } } diff --git a/plugins/javatemplates/src/test/java/org/apache/struts2/views/java/simple/CheckboxTest.java b/plugins/javatemplates/src/test/java/org/apache/struts2/views/java/simple/CheckboxTest.java index 10a8e36c2..fa7d53a04 100644 --- a/plugins/javatemplates/src/test/java/org/apache/struts2/views/java/simple/CheckboxTest.java +++ b/plugins/javatemplates/src/test/java/org/apache/struts2/views/java/simple/CheckboxTest.java @@ -45,6 +45,25 @@ public class CheckboxTest extends AbstractCommonAttributesTest { assertEquals(expected, output); } + public void testRenderUncheckCheckbox() { + tag.setName("name_"); + tag.setDisabled("true"); + tag.setTabindex("1"); + tag.setId("id_"); + tag.setCssClass("class"); + tag.setCssStyle("style"); + tag.setTitle("title"); + tag.setFieldValue("xyz"); + tag.setSubmitUnchecked("true"); + + tag.evaluateParams(); + map.putAll(tag.getParameters()); + theme.renderTag(getTagName(), context); + String output = writer.getBuffer().toString(); + String expected = s(""); + assertEquals(expected, output); + } + public void testRenderCheckboxWithNameValue() { tag.setName("name_"); tag.setValue("%{someValue}");