SpringMVC - dispatcher servler 的 url 模式样式

Posted

技术标签:

【中文标题】SpringMVC - dispatcher servler 的 url 模式样式【英文标题】:SpringMVC - dispatcher servler's url pattern style 【发布时间】:2015-06-29 19:44:21 【问题描述】:

我正在尝试使用 springMVC 构建一个宁静风格的 API。

在为 springMVC 的DispatcherServlet 配置 url-pattern 时,似乎有 2 个选择,我需要一些建议。

选择 A: 配置模式为:<url-pattern>*.action</url-pattern> 和动作使用路径如@RequestMapping("/role/add.action")

选择 B: 配置模式为:<url-pattern>/api/*</url-pattern> 和动作使用路径如@RequestMapping("/api/role/add")

我更喜欢使用没有后缀的样式,但在这种情况下,我需要添加子路径。

但我不确定哪个更适合在作为后端以提供 RESTful API 的项目中使用,并以浏览器/ios/android 作为其客户端。


可能有一个选项 C,但我不确定:

配置模式为:<url-pattern>/*</url-pattern> 和动作使用路径如@RequestMapping("/role/add")

在这种情况下,内置的 servlet 将被覆盖,例如 jsp 将无法正常工作。 但是我没有jsp,而且像html / js / css / image / document / music / video这样的静态资源都放在nginx服务的另一个端口或服务器上,对tomcat的请求只通过json数据提供ajax服务。 那么在这种情况下使用选项 C 是否合适,或者它有一些不好的副作用?

【问题讨论】:

我推荐使用 Spring Boot,这样就不需要任何此类规范。 @chrylis 你能帮忙解释一下spring boot如何解决这个问题吗?因为根据servlet规范,我找不到既没有后缀也没有子路径的模式,同时可以避免覆盖内置的servlet。 Spring Boot 为您管理整个容器,因此您根本不必指定任何路径。 【参考方案1】:

如果您的目标是 restful api,我的选择是第二个,因为您在 url 中识别资源;说你必须管理一个角色资源,你应该有一些像这样的映射:

@RequestMapping("/api/role" method = RequestMethod.POST)

插入一个新角色(可能是api不允许这样做)

@RequestMapping("/api/role/roleId" method = RequestMethod.PUT)

更新现有角色

@RequestMapping("/api/role/roleId" method = RequestMethod.DELETE)

删除角色

@RequestMapping("/api/role" method = RequestMethod.GET)

检索角色(您可以通过查询字符串实现一些过滤器)

这同样适用于其他资源(用户等),命名架构相同。

我会避免使用选项 C,因为我认为如果您的应用还发布了不使用 api 的 Web 界面,最好为 api 提供专用映射

【讨论】:

【参考方案2】:

对于 RESTful 服务,我将选择 选择 B,考虑使用 REST 执行 CRUD 操作。您可以将url-pattern 映射为,

config pattern as: <url-pattern>/api/*</url-pattern>

所以要执行 add ,您只需确保从页面发布 JSON 对象并具有类似 /api/add 的 url

在删除的情况下,您可以简单地遵循相同的操作。考虑您将使用其 id 从列表中删除 object 。你可以简单地理解为,

/api/delete/$id

并像处理它,

@RequestMapping(value="/id", method=RequestMethod.GET)

【讨论】:

好建议,但是很多api有多个参数,所以我还是需要把参数放在?之后或者http正文中,我猜。 是的,它也取决于 API。为什么不将对象用于多个参数。 我有时会使用对象,但这也仅适用于部分 API,例如,搜索服务可能具有来自多个模型的更多参数。

以上是关于SpringMVC - dispatcher servler 的 url 模式样式的主要内容,如果未能解决你的问题,请参考以下文章

SpringMVC源码-执行流程

SpringMVC编程步骤

Spring MVC 无法正确配置 Dispatcher Servlet

applicationContext.xml和dispatcher-servlet.xml的区别

iOS-多线程dispatch_semaphore_t dispatch_queue_t dispatch_group_t常见用法场景

SpringMVC 框架系列之组件概述与配置详解