}
访问路径“/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