JSP 中的 Spring MVC 请求 URL

发布于 2024-11-28 04:22:26 字数 532 浏览 2 评论 0原文

我正在使用 Spring MVC 编写一个 Web 应用程序。我正在为控制器等使用注释。一切都工作正常,除了应用程序中的实际链接(表单操作、 标签等)。当前,我有这个(显然是缩写):

//In the controller
@RequestMapping(value="/admin/listPeople", method=RequestMethod.GET)

//In the JSP
<a href="/admin/listPeople">Go to People List</a>

当我直接输入“http://localhost:8080/MyApp/admin/listPeople”这样的URL时,页面会正确加载。但是,上面的链接不起作用。它丢失了应用程序名称“MyApp”。

有谁知道是否有一种方法可以配置 Spring 以在其中添加应用程序名称?

如果您需要查看我的 Spring 配置,请告诉我。我正在使用带有视图解析器等的标准调度程序 servlet。

I am writing a web application using Spring MVC. I am using annotations for the controllers, etc. Everything is working fine, except when it comes to actual links in the application (form actions, <a> tags, etc.) Current, I have this (obviously abbreviated):

//In the controller
@RequestMapping(value="/admin/listPeople", method=RequestMethod.GET)

//In the JSP
<a href="/admin/listPeople">Go to People List</a>

When I directly enter the URL like "http://localhost:8080/MyApp/admin/listPeople", the page loads correctly. However, the link above does not work. It looses the application name "MyApp".

Does anyone know if there is a way to configure Spring to throw on the application name on there?

Let me know if you need to see any of my Spring configuration. I am using the standard dispatcher servlet with a view resolver, etc.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(7

北凤男飞 2024-12-05 04:22:26

您需要在链接前面添加上下文路径。

// somewhere on the top of your JSP
<c:set var="contextPath" value="${pageContext.request.contextPath}"/>

...
<a href="${contextPath}/admin/listPeople">Go to People List</a>

You need to prepend context path to your links.

// somewhere on the top of your JSP
<c:set var="contextPath" value="${pageContext.request.contextPath}"/>

...
<a href="${contextPath}/admin/listPeople">Go to People List</a>
原来是傀儡 2024-12-05 04:22:26

c:url 标记会将上下文路径附加到您的 URL。例如:

<c:url value="/admin/listPeople"/>

或者,我也更喜欢在 Spring MVC 应用程序中尽可能使用相对 URL。因此,如果页面位于 /MyApp/index,则链接 会将我带到 listPeople页面。

如果您位于 URL 层次结构的较深处,这也适用。您可以使用 .. 向上遍历一个级别。所以在/MyApp/admin/people/aPerson页面上,使用就会回到列表页面

The c:url tag will append the context path to your URL. For example:

<c:url value="/admin/listPeople"/>

Alternately, I prefer to use relative URLs as much as possible in my Spring MVC apps as well. So if the page is at /MyApp/index, the link <a href="admin/listPeople"> will take me to the listPeople page.

This also works if you are deeper in the URL hierarchy. You can use the .. to traverse back up a level. So on the page at/MyApp/admin/people/aPerson, using <a href="../listPeople"> will like back to the list page

小镇女孩 2024-12-05 04:22:26

我更喜欢使用 BASE 标签:

<base href="${pageContext.request.scheme}://${pageContext.request.serverName}:${pageContext.request.serverPort}${pageContext.request.contextPath}/" />

然后,您的所有链接都可以是这样的:

<a href="admin/listPeople">Go to People List</a>

I prefer to use BASE tag:

<base href="${pageContext.request.scheme}://${pageContext.request.serverName}:${pageContext.request.serverPort}${pageContext.request.contextPath}/" />

Then, all your links can be like:

<a href="admin/listPeople">Go to People List</a>
顾铮苏瑾 2024-12-05 04:22:26

因为我刚刚试图找到这个问题的答案,这是第一个谷歌结果。

现在可以使用 MvcUriComponentsBuilder 来完成

这是 Spring MVC 4.0 版本的一部分

http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/servlet/mvc/method/annotation/MvcUriComponentsBuilder.html

需要的方法是 fromMappingName

来自文档:

根据 Spring MVC 控制器方法的请求映射的名称创建 URL。
配置的 HandlerMethodMappingNamingStrategy 确定启动时控制器方法请求映射的名称。默认情况下,所有映射都会根据类名的大写字母分配一个名称,后跟“#”作为分隔符,然后是方法名称。例如,“PC#getPerson”代表具有 getPerson 方法的名为 PersonController 的类。如果命名约定不能产生唯一的结果,可以通过 @RequestMapping 注释的 name 属性分配显式名称。

这主要用于视图渲染技术和 EL 表达式。 Spring URL标签库将此方法注册为名为“mvcUrl”的函数。

例如,给定这个控制器:

@RequestMapping("/people")
 class PersonController {

   @RequestMapping("/{id}")
   public HttpEntity getPerson(@PathVariable String id) { ... }

 }

JSP 可以按如下方式准备控制器方法的 URL:

<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>

 <a href="${s:mvcUrl('PC#getPerson').arg(0,"123").build()}">Get Person</a>

As i have just been trying to find the answer to this question and this is the first google result.

This can be done now using the MvcUriComponentsBuilder

This is part of the 4.0 version of Spring MVC

http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/servlet/mvc/method/annotation/MvcUriComponentsBuilder.html

The method needed is fromMappingName

From the documentation :

Create a URL from the name of a Spring MVC controller method's request mapping.
The configured HandlerMethodMappingNamingStrategy determines the names of controller method request mappings at startup. By default all mappings are assigned a name based on the capital letters of the class name, followed by "#" as separator, and then the method name. For example "PC#getPerson" for a class named PersonController with method getPerson. In case the naming convention does not produce unique results, an explicit name may be assigned through the name attribute of the @RequestMapping annotation.

This is aimed primarily for use in view rendering technologies and EL expressions. The Spring URL tag library registers this method as a function called "mvcUrl".

For example, given this controller:

@RequestMapping("/people")
 class PersonController {

   @RequestMapping("/{id}")
   public HttpEntity getPerson(@PathVariable String id) { ... }

 }

A JSP can prepare a URL to the controller method as follows:

<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>

 <a href="${s:mvcUrl('PC#getPerson').arg(0,"123").build()}">Get Person</a>
夏了南城 2024-12-05 04:22:26

我通常将tomcat配置为使用上下文根“/”或将war部署为ROOT.war。无论哪种方式,战争名称都不会成为 URL 的一部分。

I usually configure tomcat to use context root of "/" or deploy the war as ROOT.war. Either way the war name does not become part of the URL.

单调的奢华 2024-12-05 04:22:26

您可以使用 servletRelativeAction。我不确定有哪些版本可用(我目前使用的是 4.0.x),而且我还没有看到太多这方面的文档,但是如果您查看支持 spring 表单的代码,您可能会猜到。只需确保您传递的路径以“/”开头。

示例:

<form:form class="form-horizontal" name="form" servletRelativeAction="/j_spring_security_check"  method="POST">

参见 org.springframework.web.servlet.tags.form.FormTag:

protected String resolveAction() throws JspException {
    String action = getAction();
    String servletRelativeAction = getServletRelativeAction();
    if (StringUtils.hasText(action)) {
        action = getDisplayString(evaluate(ACTION_ATTRIBUTE, action));
        return processAction(action);
    }
    else if (StringUtils.hasText(servletRelativeAction)) {
        String pathToServlet = getRequestContext().getPathToServlet();
        if (servletRelativeAction.startsWith("/") && !servletRelativeAction.startsWith(getRequestContext().getContextPath())) {
            servletRelativeAction = pathToServlet + servletRelativeAction;
        }
        servletRelativeAction = getDisplayString(evaluate(ACTION_ATTRIBUTE, servletRelativeAction));
        return processAction(servletRelativeAction);
    }
    else {
        String requestUri = getRequestContext().getRequestUri();
        ServletResponse response = this.pageContext.getResponse();
        if (response instanceof HttpServletResponse) {
            requestUri = ((HttpServletResponse) response).encodeURL(requestUri);
            String queryString = getRequestContext().getQueryString();
            if (StringUtils.hasText(queryString)) {
                requestUri += "?" + HtmlUtils.htmlEscape(queryString);
            }
        }
        if (StringUtils.hasText(requestUri)) {
            return processAction(requestUri);
        }
        else {
            throw new IllegalArgumentException("Attribute 'action' is required. " +
                    "Attempted to resolve against current request URI but request URI was null.");
        }
    }
}

You could use a servletRelativeAction. I'm not sure what versions this is available in (I'm using 4.0.x currently) and I haven't seen much documentation on this, but if you look at the code backing the spring form you can probably guess. Just make sure the path you pass it starts with a "/".

Example:

<form:form class="form-horizontal" name="form" servletRelativeAction="/j_spring_security_check"  method="POST">

See org.springframework.web.servlet.tags.form.FormTag:

protected String resolveAction() throws JspException {
    String action = getAction();
    String servletRelativeAction = getServletRelativeAction();
    if (StringUtils.hasText(action)) {
        action = getDisplayString(evaluate(ACTION_ATTRIBUTE, action));
        return processAction(action);
    }
    else if (StringUtils.hasText(servletRelativeAction)) {
        String pathToServlet = getRequestContext().getPathToServlet();
        if (servletRelativeAction.startsWith("/") && !servletRelativeAction.startsWith(getRequestContext().getContextPath())) {
            servletRelativeAction = pathToServlet + servletRelativeAction;
        }
        servletRelativeAction = getDisplayString(evaluate(ACTION_ATTRIBUTE, servletRelativeAction));
        return processAction(servletRelativeAction);
    }
    else {
        String requestUri = getRequestContext().getRequestUri();
        ServletResponse response = this.pageContext.getResponse();
        if (response instanceof HttpServletResponse) {
            requestUri = ((HttpServletResponse) response).encodeURL(requestUri);
            String queryString = getRequestContext().getQueryString();
            if (StringUtils.hasText(queryString)) {
                requestUri += "?" + HtmlUtils.htmlEscape(queryString);
            }
        }
        if (StringUtils.hasText(requestUri)) {
            return processAction(requestUri);
        }
        else {
            throw new IllegalArgumentException("Attribute 'action' is required. " +
                    "Attempted to resolve against current request URI but request URI was null.");
        }
    }
}
日久见人心 2024-12-05 04:22:26

因为已经好几年了,我想我应该为其他寻找这个的人提供资金。例如,如果您正在使用注释并具有如下所示的控制器操作:

@RequestMapping("/new")   //<--- relative url
public ModelAndView newConsultant() {
    ModelAndView mv = new ModelAndView("new_consultant");
    try {
        List<Consultant> list = ConsultantDAO.getConsultants();
        mv.addObject("consultants", list);
    } catch (Exception e) {
        e.printStackTrace();
    }
    return mv;
}

在您的 .jsp(视图)中添加此指令

<%@taglib uri="http://www.springframework.org/tags" prefix="spring"%>

并简单地使用

<spring:url value="/new" var="url" htmlEscape="true"/>
<a href="${url}">New consultant</a>

位置

value 的值应与 @RequestMapping 匹配的 code> 控制器操作中的参数和

var's 值是您用于 href 的变量名称

HIH

Since it's been some years I thought I'd chip in for others looking for this. If you are using annotations and have a controller action like this for instance:

@RequestMapping("/new")   //<--- relative url
public ModelAndView newConsultant() {
    ModelAndView mv = new ModelAndView("new_consultant");
    try {
        List<Consultant> list = ConsultantDAO.getConsultants();
        mv.addObject("consultants", list);
    } catch (Exception e) {
        e.printStackTrace();
    }
    return mv;
}

in your .jsp (view) you add this directive

<%@taglib uri="http://www.springframework.org/tags" prefix="spring"%>

and simply use

<spring:url value="/new" var="url" htmlEscape="true"/>
<a href="${url}">New consultant</a>

where

value's value should match @RequestMapping's argument in the controller action and

var's value is the name of the variable you use for href

HIH

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文