【干货】Spring MVC与JAX-RS比较与分析

本文对比分析了Spring MVC和JAX-RS在处理RESTful请求时的差异,包括请求映射、资源创建、请求数据处理等方面。Spring MVC使用@Controller和@RequestMapping,而JAX-RS使用@Path。Spring MVC的控制器是单例,JAX-RS的资源类可以按请求创建。两框架都能处理请求参数、头信息和请求体,但JAX-RS对查询参数和表单参数的处理方式不同。JAX-RS通过MessageBodyReader/Writer处理请求体,Spring MVC使用HttpMessageConverter。
摘要由CSDN通过智能技术生成

}

访问路径“/accounts/{username}”(其中的username是路径参数,可以是某个账户的用户名)的请求将由getAccount()方法处理。

根资源由JAX-RS运行时(在本示例中是Spring)实例化,子资源则由应用本身实例化。比如说,对于“/accounts /{username}/portfolios/{portfolioName}”这样的请求,AccountResource(由路径的第一部分“ /accounts”标识)会创建一个子资源实例,请求会被代理给该实例:

@Path(“/accounts/”)

@Component

@Scope(“prototype”)

public class AccountResource {

@Path(“{username}/portfolios/”)

public PortfolioResource getPortfolioResource(@PathParam(“username”) String username) {

return new PortfolioResource(accountRepository, username, uriInfo);

}

}

PortfolioResource本身的声明并没有使用注解,因此其所有的依赖都是由父资源传递过来的:

public class PortfolioResource {

private AccountRepository accountRepository;

private String username;

private UriInfo uriInfo;

public PortfolioResource(AccountRepository accountRepository, String username, UriInfo uriInfo) {

this.accountRepository = accountRepository;

this.username = username;

this.uriInfo = uriInfo;

}

}

JAX-RS中的根与子资源创建了一个处理链,它会调用多个资源:

请记住,资源类是Web Services层组件,应当关注于Web Services相关的处理,比如输入转换、准备响应、设定响应代码等等。此外,将Web Services逻辑与业务逻辑分隔开来的实践需要将业务逻辑包装到单独的方法中以作为事务边界。

创建Spring MVC @Controller类

对于Spring MVC来说,我们需要创建DispatcherServlet,同时将contextConfigLocation参数指定为Spring MVC配置:

Spring MVC Dispatcher Servlet

org.springframework.web.servlet.DispatcherServlet

contextConfigLocation

/WEB-INF/spring/*.xml

要想在Spring MVC(@MVC)中使用基于注解的编程模型还需要少量的配置。下面的component-scan元素会告诉Spring去哪里寻找@Controller注解类。

<context:component-scan base-package=“org.springframework.samples.stocks” />

接下来,我们声明了AccountController,如下代码所示:

@Controller

@RequestMapping(“/accounts”)

public class AccountController {

@Autowired

private AccountRepository accountRepository;

}

@RequestMapping注解会将该控制器映射到所有以“/accounts”开头的请求上。AccountController中的方法如getAccount()只需声明针对“/accounts”的相对地址即可。

@RequestMapping(value = “/{username}”, method = GET)

public Account getAccount(@PathVariable String username) {

}

Spring MVC则没有根资源与子资源的概念,这样每个控制器都是由Spring而非应用来管理的:

@Controller

@RequestM

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值