diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/tags/UrlTag.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/tags/UrlTag.java index 30b15bf6cf..45fb84102a 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/tags/UrlTag.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/tags/UrlTag.java @@ -295,6 +295,18 @@ public class UrlTag extends HtmlEscapingAwareTag implements ParamAware { throw new JspException(ex); } } + else { + template = URL_TEMPLATE_DELIMITER_PREFIX + "/" + param.getName() + URL_TEMPLATE_DELIMITER_SUFFIX; + if (uri.contains(template)) { + usedParams.add(param.getName()); + try { + uri = uri.replace(template, UriUtils.encodePathSegment(param.getValue(), encoding)); + } + catch (UnsupportedEncodingException ex) { + throw new JspException(ex); + } + } + } } return uri; } diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/tags/UrlTagTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/tags/UrlTagTests.java index a9d33ebd98..db5ee2cf29 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/tags/UrlTagTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/tags/UrlTagTests.java @@ -431,6 +431,42 @@ public class UrlTagTests extends AbstractTagTests { assertTrue(usedParams.contains("name")); } + // SPR-11401 + + public void testReplaceUriTemplateParamsTemplateWithPathSegment() + throws JspException { + List params = new LinkedList(); + Set usedParams = new HashSet(); + + Param param = new Param(); + param.setName("name"); + param.setValue("my/Id"); + params.add(param); + + String uri = tag.replaceUriTemplateParams("url/{/name}", params, usedParams); + + assertEquals("url/my%2FId", uri); + assertEquals(1, usedParams.size()); + assertTrue(usedParams.contains("name")); + } + + public void testReplaceUriTemplateParamsTemplateWithPath() + throws JspException { + List params = new LinkedList(); + Set usedParams = new HashSet(); + + Param param = new Param(); + param.setName("name"); + param.setValue("my/Id"); + params.add(param); + + String uri = tag.replaceUriTemplateParams("url/{name}", params, usedParams); + + assertEquals("url/my/Id", uri); + assertEquals(1, usedParams.size()); + assertTrue(usedParams.contains("name")); + } + public void testCreateUrlRemoteServer() throws JspException { tag.setValue("http://www.springframework.org/");