Java 在SpringMVC中的servlet映射中,如何映射url模式目录的根?
编辑: 我正在用一个独立的项目进行验证,但这似乎是Spring的UrlPathHelper的一个bug。当同时存在上下文和servlet路径时,下面的方法返回一个错误的路径,并且您在不使用斜杠的情况下命中servletJava 在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) {
@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路径的根。然而,这并不意味着似乎不是这样。问题是关于根控制器的,有关更多参考,请阅读我下面的回答谢谢您对服务资源的评论。