Skip to content

Commit 0bf0901

Browse files
committed
SelectTag consistently checks specified 'multiple' attribute now, never falling back to forceMultiple in case of user-provided value
Issue: SPR-11903 (cherry picked from commit 779ca99)
1 parent 7d94b5e commit 0bf0901

File tree

2 files changed

+113
-6
lines changed

2 files changed

+113
-6
lines changed

spring-webmvc/src/main/java/org/springframework/web/servlet/tags/form/SelectTag.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ public class SelectTag extends AbstractHtmlInputElementTag {
8484
* Indicates whether or not the '{@code select}' tag allows
8585
* multiple-selections.
8686
*/
87-
private Object multiple = Boolean.FALSE;
87+
private Object multiple;
8888

8989
/**
9090
* The {@link TagWriter} instance that the output is being written.
@@ -249,9 +249,9 @@ private void writeHiddenTagIfNecessary(TagWriter tagWriter) throws JspException
249249

250250
private boolean isMultiple() throws JspException {
251251
Object multiple = getMultiple();
252-
if (multiple != null && (Boolean.TRUE.equals(multiple) ||
253-
Boolean.parseBoolean(multiple.toString()) || "multiple".equals(multiple))) {
254-
return true;
252+
if (multiple != null) {
253+
String stringValue = multiple.toString();
254+
return ("multiple".equalsIgnoreCase(stringValue) || Boolean.parseBoolean(stringValue));
255255
}
256256
return forceMultiple();
257257
}

spring-webmvc/src/test/java/org/springframework/web/servlet/tags/form/SelectTagTests.java

Lines changed: 109 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -256,6 +256,7 @@ public String getAsText() {
256256
assertTrue(output.startsWith("<select "));
257257
assertTrue(output.endsWith("</select>"));
258258
assertFalse(output.contains("selected=\"selected\""));
259+
assertFalse(output.contains("multiple=\"multiple\""));
259260
}
260261

261262
public void testNestedPathWithListAndEditor() throws Exception {
@@ -731,7 +732,7 @@ public String getAsText() {
731732
}
732733
}
733734

734-
public void testMultiForCollection() throws Exception {
735+
public void testMultipleForCollection() throws Exception {
735736
this.bean.setSomeList(new ArrayList());
736737

737738
this.tag.setPath("someList");
@@ -760,7 +761,35 @@ public void testMultiForCollection() throws Exception {
760761
assertNotNull(inputElement);
761762
}
762763

763-
public void testMultiExplicit() throws Exception {
764+
public void testMultipleWithStringValue() throws Exception {
765+
this.tag.setPath("name");
766+
this.tag.setItems(Country.getCountries());
767+
this.tag.setItemValue("isoCode");
768+
this.tag.setMultiple("multiple");
769+
int result = this.tag.doStartTag();
770+
assertEquals(Tag.SKIP_BODY, result);
771+
772+
String output = getOutput();
773+
output = "<doc>" + output + "</doc>";
774+
775+
SAXReader reader = new SAXReader();
776+
Document document = reader.read(new StringReader(output));
777+
Element rootElement = document.getRootElement();
778+
assertEquals(2, rootElement.elements().size());
779+
780+
Element selectElement = rootElement.element("select");
781+
assertEquals("select", selectElement.getName());
782+
assertEquals("name", selectElement.attribute("name").getValue());
783+
assertEquals("multiple", selectElement.attribute("multiple").getValue());
784+
785+
List children = selectElement.elements();
786+
assertEquals("Incorrect number of children", 4, children.size());
787+
788+
Element inputElement = rootElement.element("input");
789+
assertNotNull(inputElement);
790+
}
791+
792+
public void testMultipleExplicitlyTrue() throws Exception {
764793
this.tag.setPath("name");
765794
this.tag.setItems(Country.getCountries());
766795
this.tag.setItemValue("isoCode");
@@ -788,6 +817,84 @@ public void testMultiExplicit() throws Exception {
788817
assertNotNull(inputElement);
789818
}
790819

820+
public void testMultipleExplicitlyFalse() throws Exception {
821+
this.tag.setPath("name");
822+
this.tag.setItems(Country.getCountries());
823+
this.tag.setItemValue("isoCode");
824+
this.tag.setMultiple("false");
825+
int result = this.tag.doStartTag();
826+
assertEquals(Tag.SKIP_BODY, result);
827+
828+
String output = getOutput();
829+
output = "<doc>" + output + "</doc>";
830+
831+
SAXReader reader = new SAXReader();
832+
Document document = reader.read(new StringReader(output));
833+
Element rootElement = document.getRootElement();
834+
assertEquals(1, rootElement.elements().size());
835+
836+
Element selectElement = rootElement.element("select");
837+
assertEquals("select", selectElement.getName());
838+
assertEquals("name", selectElement.attribute("name").getValue());
839+
assertNull(selectElement.attribute("multiple"));
840+
841+
List children = selectElement.elements();
842+
assertEquals("Incorrect number of children", 4, children.size());
843+
}
844+
845+
public void testMultipleWithBooleanTrue() throws Exception {
846+
this.tag.setPath("name");
847+
this.tag.setItems(Country.getCountries());
848+
this.tag.setItemValue("isoCode");
849+
this.tag.setMultiple(true);
850+
int result = this.tag.doStartTag();
851+
assertEquals(Tag.SKIP_BODY, result);
852+
853+
String output = getOutput();
854+
output = "<doc>" + output + "</doc>";
855+
856+
SAXReader reader = new SAXReader();
857+
Document document = reader.read(new StringReader(output));
858+
Element rootElement = document.getRootElement();
859+
assertEquals(2, rootElement.elements().size());
860+
861+
Element selectElement = rootElement.element("select");
862+
assertEquals("select", selectElement.getName());
863+
assertEquals("name", selectElement.attribute("name").getValue());
864+
assertEquals("multiple", selectElement.attribute("multiple").getValue());
865+
866+
List children = selectElement.elements();
867+
assertEquals("Incorrect number of children", 4, children.size());
868+
869+
Element inputElement = rootElement.element("input");
870+
assertNotNull(inputElement);
871+
}
872+
873+
public void testMultipleWithBooleanFalse() throws Exception {
874+
this.tag.setPath("name");
875+
this.tag.setItems(Country.getCountries());
876+
this.tag.setItemValue("isoCode");
877+
this.tag.setMultiple(false);
878+
int result = this.tag.doStartTag();
879+
assertEquals(Tag.SKIP_BODY, result);
880+
881+
String output = getOutput();
882+
output = "<doc>" + output + "</doc>";
883+
884+
SAXReader reader = new SAXReader();
885+
Document document = reader.read(new StringReader(output));
886+
Element rootElement = document.getRootElement();
887+
assertEquals(1, rootElement.elements().size());
888+
889+
Element selectElement = rootElement.element("select");
890+
assertEquals("select", selectElement.getName());
891+
assertEquals("name", selectElement.attribute("name").getValue());
892+
assertNull(selectElement.attribute("multiple"));
893+
894+
List children = selectElement.elements();
895+
assertEquals("Incorrect number of children", 4, children.size());
896+
}
897+
791898

792899
private void assertStringArray() throws JspException, DocumentException {
793900
int result = this.tag.doStartTag();

0 commit comments

Comments
 (0)