当前位置: 首页 > 知识库问答 >
问题:

spring MVC Servlet映射,“/xxx”和“/xxx/*”之间的差异

杨曜瑞
2023-03-14

我对spring MVC的URL模式映射是如何工作的感到困惑。

当“get servletmappings”返回“/”时,我可以用“http://localhost:8080/hello”获得正确的响应。

但如果我将其更改为“/app”并将url更改为“http://localhost:8080/app/hello”,它将返回404错误。

我是不是误会了什么,我也发现“/app/*”可以工作(这个我可以理解),但是为什么“/app”就不行呢?

请检查我的代码:

public class AppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
    @Override
    protected String[] getServletMappings() {
        // works with http://localhost:8080/hello
        return new String[] {
                "/"
        };
        // NOT working with http://localhost:8080/app/hello
        // return new String[] {
        //      "/app"
        //};
    }
}



@RestController
public class HTTPMethodsController {
   @RequestMapping("/hello")
   public String hello() {
       return "Hello SpringMVC.";
   }
}

共有1个答案

鲜于渊
2023-03-14

根据Servlet规范第12.2章,Servlet的映射必须使用以下语法:

  • 以“/”字符开头、以“/*”后缀结尾的字符串用于路径映射。
  • 以'*.'前缀开头的字符串用作扩展映射。
  • 空字符串(“”)是一种特殊的URL模式,它精确地映射到应用程序的上下文根,即应用程序的上下文根表单的请求,即http://host:port//表单的请求。在本例中,路径信息为“/”,servlet路径和上下文路径为空字符串(“”)。
  • 只包含'/'字符的字符串表示应用程序的“默认”servlet。在本例中,servlet路径是请求URI减去上下文路径,路径信息为空。
  • 所有其他字符串仅用于精确匹配。

因此,将DispatcherServlet与URL“/app”进行映射,会使servlet容器仅在完全匹配时才将请求路由到它,这意味着仅当您将URL更改为“http://localhost:8080/app”时。这就没有为目标特定的spring控制器添加额外路径的余地(更准确地说:如果您用@requestmapping(“/app”)映射hello()控制器方法,那么您实际上可以点击它,因为DispatcherServlet会返回到使用整个url进行搜索,但实际上这不是您想要的)。

所以映射“/app/*”是正确的,或者您也可以像您注意到的那样,用“/”将其映射为默认servlet。

 类似资料:
  • 问题内容: 我很惊讶地发现 和 对全球成员产生了不同的影响。我想确认我的实验是正确的行为。 在第一个示例中,更改foo模块中的成员将反映在所有导入foo的代码中。但是,在以后的情况下更改该成员似乎仅影响导入该成员的文件。换句话说,使用后一种方法将为每个导入文件提供其自己的foo成员副本。 我想要的行为是可以从所有文件访问foo.x,可以从所有文件更改它,并在所有文件中反映该更改(如果愿意,则为真正

  • 问题内容: 很快就有两个相等运算符:double equals( )和Triple equals( ),两者之间有什么区别? 问题答案: 简而言之: 操作员检查其实例值是否相等, 操作员检查引用是否指向同一实例, 长答案: 类是引用类型,可能有多个常量和变量在幕后引用类的同一单个实例。类引用保留在运行时堆栈(RTS)中,其实例保留在内存的堆区域中。当您控制平等时, 这意味着它们的实例是否彼此相等。

  • 问题内容: 关于这个问题已经有其他问题了,但是没有一个是真正有用的。我是Symfony的新手,因此很难直面它。 我在文件Client \ IntranetBundle \ LDAP \ LDAPAuthenticationProvider.php中,此代码导致错误: 我确实添加了它的命名空间: LDAPUser实现UserInterface 我得到的错误是 那应该是什么意思?根据我的阅读,它与映射

  • 我在Spring Boot JPA应用程序中有以下设置: 可嵌入 原因:org.hibernate.AnnotationException:mappedBy引用了未知的目标实体属性:com.foobar.entity.logSearchHistoryAttr.logSearchHistoryAttrs中的com.foobar.entity.logSearchHistoryAttr.logSearc

  • 问题内容: 我知道这是递归问题,但找不到解决方案。 在构建之后,我在 JENKINS中 运行 SONAR 分析。当Soanar到达它时显示:。 扫描是一个 Maven的 项目,声纳保持displayin此消息引发许多其他类使用 Maven的 依赖关系 。 该 声纳 的分析是使用 SONAR亚军 。 我在许多帖子中看到,可以通过添加来解决此问题,但是使用 Maven ,依赖关系不会归类到一个文件夹中

  • 它一直在跟我说这个网络是没有定义的。错误:Service使用了未定义的网络但是,我看到docker network ls存在这样的网络。我错过了什么:(我需要你的帮助。我在谷歌上读了很多关于它的文章,但是找不到正确的解决方法。