Support path segment URI var expansion in UrlTag

Before this change UrlTag expanded URI vars and encoded them using
UriUtils.encodePath.

This change makes it possible to expand using
UriUtils.encodePathSegment, which means a "/" is encoded as "%2F".

To expand with path segment semantics, prefix the URI var name "/":

<spring:url value="/url/path/{/var}">
    <spring:param name="var" value="my/Id" />
</spring:url>

Issue: SPR-11401
master
Rossen Stoyanchev 11 years ago
parent 9d479feadd
commit 426b77b834
  1. 12
      spring-webmvc/src/main/java/org/springframework/web/servlet/tags/UrlTag.java
  2. 36
      spring-webmvc/src/test/java/org/springframework/web/servlet/tags/UrlTagTests.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;
}

@ -431,6 +431,42 @@ public class UrlTagTests extends AbstractTagTests {
assertTrue(usedParams.contains("name"));
}
// SPR-11401
public void testReplaceUriTemplateParamsTemplateWithPathSegment()
throws JspException {
List<Param> params = new LinkedList<Param>();
Set<String> usedParams = new HashSet<String>();
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<Param> params = new LinkedList<Param>();
Set<String> usedParams = new HashSet<String>();
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/");

Loading…
Cancel
Save