Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在SpringMVC中的servlet映射中,如何映射url模式目录的根?_Java_Spring_Servlets_Spring Mvc - Fatal编程技术网

Java 在SpringMVC中的servlet映射中,如何映射url模式目录的根?

Java 在SpringMVC中的servlet映射中,如何映射url模式目录的根?,java,spring,servlets,spring-mvc,Java,Spring,Servlets,Spring Mvc,编辑: 我正在用一个独立的项目进行验证,但这似乎是Spring的UrlPathHelper的一个bug。当同时存在上下文和servlet路径时,下面的方法返回一个错误的路径,并且您在不使用斜杠的情况下命中servlet @RequestMapping(value = {"","/"}) 举个例子,假设我有一个“admin”上下文和以下servlet映射: public String getPathWithinApplication(HttpServletRequest request) {

编辑:

我正在用一个独立的项目进行验证,但这似乎是Spring的UrlPathHelper的一个bug。当同时存在上下文和servlet路径时,下面的方法返回一个错误的路径,并且您在不使用斜杠的情况下命中servlet

@RequestMapping(value = {"","/"})
举个例子,假设我有一个“admin”上下文和以下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/users,它将无法工作。但是,如果我点击/admin/users/,它就会工作。现在,如果我将请求映射更改为以下内容,那么它们都可以工作:

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

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

首先,将dispatcher servlet映射到“/”和“/*”之间的区别。 这是不同的

当映射到“/*”时,所有URL请求(包括类似于“/WEB-INF/jsp/../index.jsp”的内容)都映射到dispatcher servlet

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

是的,很难看,但看起来就是这样

因此,到目前为止,我找到的唯一解决方案是:将web.xml中的“/*”改回“/”。我想,通过这种方式,jsp是由Tomcat的jsp servlet正确呈现的,而不是由dispatcher servlet。 不幸的是,此修复程序将破坏Spring发送的根URL,因此您需要暂时放弃使用根URL+分幅的想法

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

问题仍然没有解决


这也是Spring MVC 3.0中的问题。我的设置通常如下所示:

<servlet-mapping>
    <servlet-name>usersServlet</servlet-name>
    <url-pattern>/users/*</url-pattern>
</servlet-mapping>
@RequestMapping(value = {"/users","/"})
@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:

<servlet-mapping>
    <servlet-name>usersServlet</servlet-name>
    <url-pattern>/users/*</url-pattern>
</servlet-mapping>
@RequestMapping(value = {"/users","/"})
@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
    }
}

来自
/resources/css
/resources/js
的文件将在不强制您编写额外控制器的情况下提供。

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

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

/

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

<welcome-file-list>
    <welcome-file>/</welcome-file>
</welcome-file-list>

在我的例子中,除了根“/”url之外,每个url都在工作

问题是我没有删除我项目的webapp根文件夹中的
index.htm
文件。

问题不在于使用根路径。如果我使用根路径,那么我总是使用
/
@RequestMapping(值={“”“/”})
。我从来没有遇到过这方面的问题,我使用的是Tiles 2和Spring MVC 3。问题在于首先指定servlet路径。无论何时指定servlet路径信息,Spring的请求映射都是之后的事情。因此,从技术上讲,相同的请求映射应该可以工作,因为它是servlet路径的根。然而,这并不意味着似乎不是这样。问题是关于根控制器的,有关更多参考,请阅读我下面的回答谢谢您对服务资源的评论。