Spring 的基于注释的 MVC 框架简化了创建 RESTful Web 服务的过程。传统 Spring MVC 控制器和 RESTful Web 服务控制器之间的主要区别在于 HTTP 响应主体的创建方式。传统的 MVC 控制器依赖于 View 技术,而 RESTful Web 服务控制器只是简单地返回对象,对象数据以 JSON/XML 的形式直接写入 HTTP 响应。有关使用 Spring 框架创建 RESTful Web 服务的详细说明,请单击 here。
以下步骤描述了一个典型的 Spring MVC REST 工作流:
请求被 DispatcherServlet 拦截,该 DispatcherServlet 查找 Handler Mappings 及其类型。
应用程序上下文文件中定义的 Handler Mappings 部分告诉 DispatcherServlet 根据传入请求使用哪种策略来查找控制器。
Spring MVC 支持三种不同类型的映射请求 URI 到控制器:注释、名称约定和显式映射。
请求由控制器处理,响应返回给 DispatcherServlet,然后调度到视图。
在图 1 中,请注意在传统工作流中,ModelAndView 对象从控制器转发到客户端。 Spring 允许您直接从控制器返回数据,而无需查找视图,使用方法上的 @ResponseBody 注释。从版本 4.0 开始,通过引入 @RestController 注释进一步简化了此过程。下面解释每种方法。
当您在方法上使用 @ResponseBody 注解时,Spring 会自动转换返回值并将其写入 HTTP 响应。 Controller 类中的每个方法都必须使用@ResponseBody 进行注解。
Spring 有一个在后台注册的 HttpMessageConverters 列表。 HTTPMessageConverter 的职责是将请求正文转换为特定的类,然后再次转换回响应正文,具体取决于预定义的 mime 类型。每次发出的请求到达@ResponseBody 时,Spring 都会遍历所有已注册的 HTTPMessageConverters,寻找第一个符合给定 mime 类型和类的请求,然后将其用于实际转换。
让我们用一个简单的例子来看看@ResponseBody。
package com.example.spring.model;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name = "Employee")
public class Employee {
String name;
String email;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Employee() {
}
}
然后,创建以下 @Controller 类:
package com.example.spring.rest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import com.example.spring.model.Employee;
@Controller
@RequestMapping("employees")
public class EmployeeController {
Employee employee = new Employee();
@RequestMapping(value = "/{name}", method = RequestMethod.GET, produces = "application/json")
public @ResponseBody Employee getEmployeeInJSON(@PathVariable String name) {
employee.setName(name);
employee.setEmail("employee1@genuitec.com");
return employee;
}
@RequestMapping(value = "/{name}.xml", method = RequestMethod.GET, produces = "application/xml")
public @ResponseBody Employee getEmployeeInXML(@PathVariable String name) {
employee.setName(name);
employee.setEmail("employee1@genuitec.com");
return employee;
}
}
将 <context:component-scan>
和 <mvc:annotation-driven />
标签添加到 Spring 配置文件中。
<context:component-scan>
激活注释并扫描包以在应用程序上下文中查找和注册 bean。
如果 Jackson/JAXB 库位于类路径中,则 <mvc:annotation-driven/>
添加对读取和写入 JSON/XML 的支持。
对于 JSON 格式,将 jackson-databind jar 包括在内,对于 XML,将 jaxb-api-osgi jar 包括到项目类路径中。
在任何服务器(例如 Tomcat)上部署和运行应用程序。如果您使用的是 MyEclipse,则可以在 embedded Tomcat server 上运行该项目。
JSON - 使用 URL:http://localhost:8080/SpringRestControllerExample/rest/employees/Bob
并显示以下输出:
XML — 使用
URL:http://localhost:8080/SpringRestControllerExample/rest/employees/Bob.xml
并显示以下输出:
Spring 4.0 引入了@RestController,这是控制器的一个特殊版本,它是一个方便的注解,只不过添加了@Controller 和@ResponseBody 注解。通过使用@RestController 注解对控制器类进行注解,您不再需要将@ResponseBody 添加到所有请求映射方法中。 @ResponseBody 注解默认是激活的。点击 here 了解详情。
要在我们的示例中使用@RestController,我们需要做的就是将@Controller 修改为@RestController 并从每个方法中删除@ResponseBody。结果类应如下所示:
package com.example.spring.rest;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import com.example.spring.model.Employee;
@RestController
@RequestMapping("employees")
public class EmployeeController {
Employee employee = new Employee();
@RequestMapping(value = "/{name}", method = RequestMethod.GET, produces = "application/json")
public Employee getEmployeeInJSON(@PathVariable String name) {
employee.setName(name);
employee.setEmail("employee1@genuitec.com");
return employee;
}
@RequestMapping(value = "/{name}.xml", method = RequestMethod.GET, produces = "application/xml")
public Employee getEmployeeInXML(@PathVariable String name) {
employee.setName(name);
employee.setEmail("employee1@genuitec.com");
return employee;
}
}
请注意,我们不再需要将 @ResponseBody 添加到请求映射方法中。进行更改后,再次在服务器上运行应用程序会产生与以前相同的输出。
如您所见,使用 @RestController 非常简单,并且是从 Spring v4.0 开始创建 MVC RESTful Web 服务的首选方法。本文来自DZone
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://www.dailycodebuffer.com/spring-framework-restcontroller-vs-controller/
内容来源于网络,如有侵权,请联系作者删除!