10
<servlet-mapping>
    <servlet-name>testServlet</servlet-name>
    <url-pattern>/test/*</url-pattern>
</servlet-mapping>

如果我点击/test/page以上将起作用。但是,点击/test/test/将不起作用。我使用的是Spring MVC,我的请求映射如下:

@RequestMapping(value = {"","/"})

编辑:

我正在使用独立项目进行验证,但这似乎是 Spring 的 UrlPathHelper 的错误。当同时存在上下文和 servlet 路径时,以下方法返回不正确的路径,并且您在没有尾部斜杠的情况下点击了 servlet。

public String getPathWithinApplication(HttpServletRequest request) {
    String contextPath = getContextPath(request);
    String requestUri = getRequestUri(request);
    if (StringUtils.startsWithIgnoreCase(requestUri, contextPath)) {
        // Normal case: URI contains context path.
        String path = requestUri.substring(contextPath.length());
        return (StringUtils.hasText(path) ? path : "/");
    }
    else {
        // Special case: rather unusual.
        return requestUri;
    }
}

举个例子,假设我有一个“admin”的上下文和以下 servlet 映射:

<servlet-mapping>
    <servlet-name>usersServlet</servlet-name>
    <url-pattern>/users/*</url-pattern>
</servlet-mapping>

现在我在我的一个控制器中有一个请求映射,如下所示:

@RequestMapping(value = {"","/"})

如果我点击/admin/users它将不起作用。但是,如果我点击/admin/users/它将起作用。现在,如果我将请求映射更改为以下内容,那么它们都可以工作:

@RequestMapping(value = {"/users","/"})

但是,现在 URL /admin/users/users也可以工作(这不是我想要的)。

4

5 回答 5

5

Yevgeniy是正确的,但是如果您的 DispatcherServlet 正在接管默认 servlet,您必须将其添加到您的 web.xml:

<welcome-file-list>
    <welcome-file>/</welcome-file>
</welcome-file-list>
于 2014-05-13T22:02:25.950 回答
3

我的设置通常如下所示:

<servlet-mapping>
    <servlet-name>testServlet</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

控制器,我假设您想要处理/test并且/test/同样:

@Controller
public class MyController {

    @RequestMapping("/test")
    public String test() {
        return "redirect:/welcome";
    }

    @RequestMapping("/test/")
    public String test() {
        return "redirect:/welcome";
    }

    @RequestMapping("/welcome")
    public void test(ModelMap model) {
        // do your stuff
    }
}

像这样的设置会导致DispatcherServlet处理文件的请求*.css*.js这在大多数情况下是不需要的。我认为这是 Bhavik 描述的问题。对于这些资源,您可以像这样使用 ResourceController:

<mvc:resources mapping="/css/**" location="/resources/css/" />
<mvc:resources mapping="/js/**" location="/resources/js/" />

文件来自/resources/css并将/resources/js被提供,而不会强迫您编写额外的控制器。

于 2012-11-15T21:06:10.710 回答
2

首先,将 dispatcher servlet 映射到“/”和“/*”之间的区别。它们是有区别的!

当映射到“/*”时,所有 URL 请求(包括类似“/WEB-INF/jsp/.../index.jsp”)都映射到调度程序 servlet。

其次,当使用 Spring + Tiles 并在您的 tile 定义中返回一些 JSP 时,它被视为内部转发请求,并由与原始请求相同的 servlet 处理。在我的示例中,我调用根 URL“/”,它被 home() 方法正确捕获,然后由 Tiles 转发到“index.jsp”,再次由 Dispatcher Servlet 处理。显然,调度程序 servlet 无法处理“index.jsp”,因为它没有控制器。

是的,它很丑陋,但看起来这就是它的工作方式。

所以,到目前为止我找到的唯一解决方案:将 web.xml 中的“/*”改回“/”。我猜想,Tomcat 的 jsp servlet 会正确呈现 JSP,而不是调度程序 servlet。不幸的是,这个修复会破坏 Spring 的 ROOT URL 调度,所以你需要暂时放弃使用 ROOT URL + Tiles 的想法。

请注意,在使用“/*”时,在 web.xml 中添加显式 servlet 映射“ .jsp -> Tomcat jsp”没有帮助,而且很糟糕。

问题仍然没有解决。

这也是 Spring MVC 3.0 中的问题

于 2012-11-15T20:59:02.703 回答
0

一种不接触 web.xml 文件的方法是将地图设置为默认的欢迎文件路径。

@RequestMapping("/index.html")
于 2014-11-17T22:38:47.767 回答
0

就我而言,除了根 "/" url 之外,每个 url 都在工作。
问题是我没有删除index.htm我项目的 webapp 根文件夹中的文件。

于 2016-02-10T23:41:37.657 回答