Spring MVC与JAX-RS的比较

介绍

在过去的几年中,REST已成为影响Web框架,Web协议和应用程序设计的重要概念。 如果你还没有接触过它,看到这个简短的介绍许多人,你可以找到。

考虑到公司需要公开应该尽可能简单并且植根于Web体系结构中的Web API,REST的重要性日益增长就不足为奇了。 通过Ajax进行通信的富浏览器客户端也寻求相同的条件。 而且没有任何理由为什么任何Web应用程序都不能从帮助扩展万维网的体系结构原理中受益。

JAX-RS (JSR 311)是用于RESTful Web服务的Java API。 JAX-RS是在Roy Fielding (他的论文中定义REST)的参与下创建的。 它为寻求构建RESTful Web服务的用户提供了JAX-WS(JSR-224)的替代产品。 当前有4种JAX-RS实现可用,所有这些实现都支持使用Spring。 Jersey是参考实现,是本文中使用的参考实现。

如果您是使用Spring的开发人员,您可能想知道(或者可能已经有人问过)Spring MVC与JAX-RS相比如何? 此外,如果您已有使用控制器类层次结构(SimpleFormController和朋友)的现有Spring MVC应用程序,则可能不知道Spring MVC中现在提供了全面的REST支持。

本文将带您逐步了解Spring 3中提供的REST功能,并将它们与JAX-RS相关联。 希望该练习将帮助您理解两种编程模型之间的相似之处和不同之处。

在开始之前,指出JAX-RS是针对Web服务(而不是HTML Web应用程序)的开发可能会有所帮助,而Spring MVC则源于Web应用程序开发。 Spring 3为Web应用程序和Web服务添加了全面的REST支持。 但是,本文将重点介绍与Web服务开发有关的功能。 我相信这种方法将使在JAX-RS上下文中讨论Spring MVC更容易。

需要说明的第二点是,我们将要讨论的REST功能是Spring框架的一部分,并且是现有Spring MVC编程模型的延续。 因此,不存在您可能会想说的“ Spring REST框架”。 这只是Spring和Spring MVC。 实际上,这意味着,如果您有现有的Spring应用程序,则可以期望能够使用Spring MVC来创建HTML Web层和RESTful Web服务层。

关于代码片段

贯穿本文显示的代码段采用一个简单的域模型,该模型具有两个JPA注释的实体,分别称为AccountPortfolio ,其中一个Account有许多Portfolio。 持久层是用Spring配置的,并且包含一个JPA存储库实现,用于检索和持久化实体实例。 泽西岛和Spring MVC将用于构建Web服务层,以通过调用底层的Spring托管应用程序来满足客户请求。

引导和连线Web层

我们将假定在Spring MVC和JAX-RS场景中都使用Spring进行依赖项注入。 Spring MVC DispatcherServlet和Jersey SpringServlet将请求委托给Spring管理的REST层组件(控制器或资源),这些组件又将与业务或持久性组件进行连接,如下所示:

Jersey和Spring MVC都将依靠Spring的ContextLoaderListener来加载业务和持久性组件,例如JpaAccountRepository:

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
        classpath:META-INF/spring/module-config.xml
    </param-value>
</context-param>

<listener>
    <listener-class>
        org.springframework.web.context.ContextLoaderListener
    </listener-class>
</listener>

ContextLoaderListener可以在任何Web或REST框架的上下文中使用。

在Jersey中设置Spring-Managed JAX-RS资源

Jersey提供了在REST层中使用Spring的支持。 可以通过两个简单步骤启用它(如果您包括在Maven工件com.sun.jersey.contribs:jersey-spring上添加构建依赖项,则实际上是三个步骤)。

第一步:将以下内容添加到您的web.xml中,以确保可以使用Spring创建JAX-RS根资源:

<servlet>
    <servlet-name>Jersey Web Application</servlet-name>
    <servlet-class>
        com.sun.jersey.spi.spring.container.servlet.SpringServlet
    </servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>Jersey Web Application</servlet-name>
    <url-pattern>/resources/*</url-pattern>
</servlet-mapping>

第二步:使用一些Spring和一些JAX-RS注释声明根JAX-RS资源类:

@Path("/accounts/")
@Component
@Scope("prototype")
public class AccountResource {

    @Context
    UriInfo uriInfo;

    @Autowired
    private 
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值