如何在Spring 3中的控制器内生成URI

时间:2012-01-06 17:05:18

标签: spring spring-mvc spring-3

我使用的是Spring 3.0,我有一个非常简单的问题,但在互联网上找不到任何答案。我想生成一个路径(URI),就像在我的JSP中一样:

<spring:url value="/my/url" />

但在控制器内部。使用的相关服务是什么? 谢谢!

编辑:可能与此相关:http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/resources.html#resources-resourceloader? 对此没有更好的解决方案吗?

3 个答案:

答案 0 :(得分:35)

罗森的建议是黄金。

还有来自3.1的ServletUriComponentsBuilder类,它以静态方式从当前请求构建URL。例如:

ServletUriComponentsBuilder.fromCurrentContextPath().path("/my/additional/path").build().toUriString();

它与servlet中<spring:url>最接近。

答案 1 :(得分:20)

在Spring MVC 3.1中,您可以使用UriComponentsBuilder及其ServletUriComponentsBuilder子类。有一个例子here。您还可以在reference docs

中阅读有关UriComponentsBuilder的信息

答案 2 :(得分:2)

我会说

request.getRequestURL() + "/my/url"

完成这项工作。没有这样的内置功能,spring:url调用UrlTag.class,它具有以下生成URL的方法,您可以将其用作代码的内容:

private String createUrl() throws JspException {
    HttpServletRequest request = (HttpServletRequest) pageContext.getRequest();
    HttpServletResponse response = (HttpServletResponse) pageContext.getResponse();
    StringBuilder url = new StringBuilder();
    if (this.type == UrlType.CONTEXT_RELATIVE) {
        // add application context to url
        if (this.context == null) {
            url.append(request.getContextPath());
        }
        else {
            url.append(this.context);
        }
    }
    if (this.type != UrlType.RELATIVE && this.type != UrlType.ABSOLUTE && !this.value.startsWith("/")) {
        url.append("/");
    }
    url.append(replaceUriTemplateParams(this.value, this.params, this.templateParams));
    url.append(createQueryString(this.params, this.templateParams, (url.indexOf("?") == -1)));

    String urlStr = url.toString();
    if (this.type != UrlType.ABSOLUTE) {
        // Add the session identifier if needed
        // (Do not embed the session identifier in a remote link!)
        urlStr = response.encodeURL(urlStr);
    }

    // HTML and/or JavaScript escape, if demanded.
    urlStr = isHtmlEscape() ? HtmlUtils.htmlEscape(urlStr) : urlStr;
    urlStr = this.javaScriptEscape ? JavaScriptUtils.javaScriptEscape(urlStr) : urlStr;

    return urlStr;
}