spring注解:@RestController、@Controller、@Respons。
。。
@responseBody
@responseBody注解的作⽤是将controller的⽅法返回的对象通过适当的转换器转换为指定的格式之后,写⼊到response对象的body区,通常⽤来返回JSON数据或者是XML数据。需要注意的呢,在使⽤此注解之后不会再⾛试图处理器,⽽是直接将数据写⼊到输⼊流中,他的效果等同于通过response对象输出指定格式的数据。
@ResponseBody这个注解通常使⽤在控制层(controller)的⽅法上,其作⽤是将⽅法的返回值以特定的格式写⼊到response的body区域,进⽽将数据返回给客户端。当⽅法上⾯没有写ResponseBody,底层会将⽅法的返回值封装为ModelAndView对象。
假如是字符串则直接将字符串写到客户端;假如是⼀个对象,此时会将对象转化为json串然后写到客户端。这⾥需要注意的是,如果返回对象,按utf-8编码。如果返回String,默认按iso8859-1编码,页⾯可能出现乱码。因此在注解中我们可以⼿动修改编码格式,例如
@RequestMapping(value="/cat/query",produces="text/html;charset=utf-8"),前⾯是请求的路径,后⾯
是编码格式。
那么,控制层⽅法的返回值是如何转化为json格式的字符串的呢?其实是通过HttpMessageConverter中的⽅法实现的,因为它是⼀个接⼝,因此由其实现类完成转换。如果是bean对象,会调⽤对象的getXXX()⽅法获取属性值并且以键值对的形式进⾏封装,进⽽转化为json串。如果是map集合,采⽤get(key)⽅式获取value值,然后进⾏封装。
@Controller
以前在编写Controller⽅法的时候,需要开发者⾃定义⼀个Controller类实现Controller接⼝,实现handleRequest⽅法返回ModelAndView。并且需要在Spring配置⽂件中配置Handle,将某个接⼝与⾃定义Controller类做映射。
这么做有个复杂的地⽅在于,⼀个⾃定义的Controller类智能处理⼀个单⼀请求。⽽在采⽤@Contoller注解的⽅式,可以使接⼝的定义更加简单,将@Controller标记在某个类上,配合@RequestMapping注解,可以在⼀个类中定义多个接⼝,这样使⽤起来更加灵活。
被@Controller标记的类实际上就是个SpringMVC Controller对象,它是⼀个控制器类,⽽@Contoller注解在
org.springframework.stereotype包下。其中被@RequestMapping标记的⽅法会被分发处理器扫描识别,将不同的请求分发到对应的接⼝上。
Spring如何通过注解注⼊?
不过⼤家仔细想⼀下,为什么打上注解了就能实现接⼝功能了呢?换句话说,Spring怎么样到开发者⾃定义的Controller把对应的请求分发到对应的⽅法上呢?
⾸先,要在Spring配置⽂件的头⽂件中引⼊spring-context。
其次,使⽤<context:component-scan>元素启动“包扫描”功能。
例如<context:component-scan base-package="ller"/>
base-package是值是包的路径。意思就是,启动了报扫描功能,将ller这个包下以及⼦包下的所有类扫描⼀遍,将标记有@Controller、@Service、@repository、@Component等注解的类注⼊到IOC容器中,作为Spring的Bean来管理。
这样,Spring就能到Controller类,通过@RequestMapping注解处理对应的请求。
@RestController与@Controller
Spring的基于注释的MVC框架简化了创建RESTful Web服务的过程。传统的Spring MVC控制器和RESTful Web服务控制器之间的关键区别在于: 创建HTTP响应主体的⽅式。
虽然传统的MVC控制器依赖于View技术,但RESTful Web服务控制器只返回对象,对象数据作为JSON / XML直接写⼊HTTP响应。
以下步骤描述了典型的Spring MVC REST⼯作流:
1. 客户端以URI形式向Web服务发送请求。
2. 该请求被DispatcherServlet拦截,该服务器查Handler Mappings及其类型:A、 应⽤程序上下⽂⽂件中定义的Handler
Mappings部分告诉DispatcherServlet使⽤哪种策略根据传⼊请求查控制器。B、 Spring MVC⽀持三种不同类型的映射请求URI 到控制器:注释,名称约定和显式映射。
请求由Controller处理,响应返回到DispatcherServlet,然后DispatcherServlet将调度到视图。
使⽤@Controller时需要⽤@ResponseBody注释
Spring 3.x 或使⽤@Controller情况下,在⽅法上使⽤@ResponseBody注释时,Spring会转换返回值并⾃动将其写⼊HTTP 响应。Controller类中的每个⽅法都必须使⽤@ResponseBody进⾏注释。
Spring有⼀个在后台注册的HttpMessageConverters列表。HTTPMessageConverter的职责是将请求主体转换为特定类并再次返回响应主体,具体取决于预定义的mime类型。每次发出请求命中@ResponseBody时,Spring都会遍历所有已注册的HTTPMessageConverters,寻符合给定mime类型和类的第⼀个,然后将其⽤于实际转换。
@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");
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");
return employee;
}
}
@RestController
Spring 4.0引⼊了@RestController,这是⼀个控制器的专⽤版本,它是⼀个⽅便的注释,除了⾃动添加@Controller和
@ResponseBody注释之外没有其他新魔法。
通过使⽤@RestController批注对控制器类进⾏注释,您不再需要将@ResponseBody添加到所有请求映射⽅法中。@ResponseBody注释默认处于活动状态。
要在我们的⽰例中使⽤@RestController,我们需要做的就是将@Controller修改为@RestController并从每个⽅法中删除
@ResponseBody。结果类应如下所⽰:
public class EmployeeController {
Employee employee = new Employee();
@GetMapping("/employees/{name}")
public Employee getEmployeeInJSON(@PathVariable("name") String name) {
employee.setName(name);
employee.setEmail("employee1@genuitec");
return employee;
}
}
我们不再需要将@ResponseBody添加到请求映射⽅法中。进⾏更改后,再次在服务器上运⾏应⽤程序会产⽣与以前相同的输出。使⽤
@RestController⾮常简单,这是从Spring v4.0开始创建MVC RESTful Web服务或基于SpringBoot 2的⾸选⽅法。
总结
@RestController = @ResponseBody + @Controller 合在⼀起的作⽤。
1) 如果只是使⽤@RestController注解Controller,则Controller中的⽅法⽆法返回jsp页⾯,或者html,
配置的视图解析器InternalResourceViewResolver不起作⽤,返回的内容就是Return ⾥的内容。
2) 如果需要返回到指定页⾯,则需要⽤ @Controller配合视图解析器InternalResourceViewResolver才⾏。
如果需要返回JSON,XML或⾃定义mediaType内容到页⾯,则需要在对应的⽅法上加上@ResponseBody注解。
例如:
1.使⽤@Controller 注解,在对应的⽅法上,视图解析器可以解析return 的jsp,html页⾯,并且跳转到相应页⾯;若返回json等内容到页⾯,则需要加@ResponseBody注解。
@CrossOrigin
@Controller
public class FileUploadController {
// 跳转到上传⽂件的页⾯
@RequestMapping(value = "/gouploadimg", method = RequestMethod.GET)
public String goUploadImg() {
// 跳转到 templates ⽬录下的 uploadimg.html
return "uploadimg";
}
// 处理⽂件上传
@RequestMapping(value = "/testuploadimg", method = RequestMethod.POST)
public @ResponseBody String uploadImg(@RequestParam("file") MultipartFile file, HttpServletRequest request) {
System.out.println("调⽤⽂件上传⽅法");
String contentType = ContentType();
String fileName = OriginalFilename();
}
}
2.@RestController注解,相当于@Controller+@ResponseBody两个注解的结合,返回json数据不需要在⽅法前⾯加
@ResponseBody注解了,但使⽤@RestController这个注解,就不能返回jsp,html页⾯,视图解析器⽆法解析jsp,html页⾯。
@RestController /* @Controller + @ResponseBody*/
resource和autowired注解的区别public class HospitalController {
//注⼊Service服务对象
@Autowired
private HospitalService hospitalService;
/**
* 查询所有医院信息(未分页)
*/
@RequestMapping(value = "findAllHospital",method = RequestMethod.GET)
public List<Hospital> findAllHospital(){
List<Hospital> hospitalList= hospitalService.findAllHospital();
return hospitalList;
}
其他
@Configuration把⼀个类作为⼀个IoC容器,它的某个⽅法头上如果注册了@Bean,就会作为这个Spring容器中的Bean。@Scope注解 作⽤域
@Lazy(true) 表⽰延迟初始化
@Service⽤于标注业务层组件、
@Controller⽤于标注控制层组件(如struts中的action)
@Repository⽤于标注数据访问组件,即DAO组件。
@Component泛指组件,当组件不好归类的时候,我们可以使⽤这个注解进⾏标注。
@Scope⽤于指定scope作⽤域的(⽤在类上)
@PostConstruct⽤于指定初始化⽅法(⽤在⽅法上)
@PreDestory⽤于指定销毁⽅法(⽤在⽅法上)
@DependsOn:定义Bean初始化及销毁时的顺序
@Primary:⾃动装配时当出现多个Bean候选者时,被注解为@Primary的Bean将作为⾸选者,否则将抛出异常
@Autowired 默认按类型装配,如果我们想使⽤按名称装配,可以结合@Qualifier注解⼀起使⽤。如下:
@Autowired @Qualifier("personDaoBean") 存在多个实例配合使⽤
@Resource默认按名称装配,当不到与名称匹配的bean才会按类型装配。
@PostConstruct 初始化注解
@PreDestroy 摧毁注解 默认 单例 启动就加载
@Async异步⽅法调⽤
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论