@Controller是什么
@Controller表示在tomcat启动的时候,把这个类作为一个控制器加载到Spring的Bean工厂,如果不加,就是一个普通的类,和Spring没有半毛钱关系。
<!-- 开启mvc 的注解 -->
<context:annotation-config></context:annotation-config>
<mvc:annotation-driven></mvc:annotation-driven>
<!-- 就是在核心的配置文件 中 指明 那个 普通的类 为 局部 控制器 -->
<context:component-scan base-package="com.cyl.controller"></context:component-scan>
其中,base-package表示会扫描com.cyl.controller目录下所有的包,一旦发现有个类上面加了类似于@Controller的注解,在容器启动的时候系统就会把它加载到Spring的Bean工厂,并且对其实例化。
这也是为什么,我们只是写了Controller,但是从来没有在一个地方new这个Controller的原因,因为在Web容器启动的时候,这个Controller已经被Spring加载到自己的Bean工厂里面去了。
这也就是所谓的Spring扫包机制。@Controller就是一个注解,当tomcat启动,我们会看到一些JAVA类挥舞着印有@Controller的旗子大喊:" Hey,SpringMVC,I'm here,please take me to your bean factory!"
@Controller返回的应该是页面或者是请求,具体视当前业务而定。
@Controller修饰的类会将return的字符串配合视图解析器InternalResourceViewResolver添加上前缀和后缀。跳转到对应的html页面。
@Controller和@ResponseBody配合作用和@RestController一样
@RestController是什么
@RestController修饰的类会将 return后面的内容字符串的形式返回到@Requestmapping的页面
@RestController 这个注解,返回的是data,就不能返回 jsp,html 页面,视图解析器(InternalResourceViewResolver)无法解析 jsp,html 页面。
@RequestMapping是什么
RequestMapping就是一个映射路径。你也可以理解为是存在电脑上文件的文件路径。可以放在类上也可以放在类的具体方法上。
如果我在同一个Controller里面设置两个相同的RequestMapping,编译不报错,但是在启动之后请求会报错。
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping#0': Invocation of init method failed; nested exception is java.lang.IllegalStateException: Ambiguous mapping found. Cannot map 'blogController' bean method
一个B/S架构的web项目,就是一个类似于命令行一样的应用程序,我们唯有通过url,也就是路径去获得我们想要的资源和服务。
@ResponseBody是什么
@ResponseBody这个注解,它的意思很简单,就是说明这个方法返回的东西会通过IO流的方式写入到浏览器。
@RequestMapping("/testResponseBody")
@ResponseBody
public String testResponseBody(HttpServletRequest request){
return "<h1 style='color:lightGreen'>Hello Web!</h1>";
}
@Autowired是什么
@Autowired为Spring提供的注解,需要导入包org.springframework.beans.factory.annotation.Autowired;
public class TestServiceImpl {
// 下面两种@Autowired只要使用一种即可
@Autowired
private UserDao userDao; // 用于字段上
@Autowired
public void setUserDao(UserDao userDao) { // 用于属性的方法上
this.userDao = userDao;
}
}
在容器的启动过程中,会初始化很多bean,这也是spring的核心之一(IOC)。但是在注入的过程中,扫描到公共方法中要注入的bean,并未找到,强行注入就会注入失败。我们又不能单独的去除改方法,所以我们采取的思想就是有bean就注入,没有就不注入。解决办法就是@Autowired(required=false)。@Autowired是spring的注解,是spring2.5版本引入的,Autowired默认是type进行注入。如果涉及到type无法辨别注入对象时,那需要依赖@Qualifier或@Primary注解一起来修饰。
public class TestServiceImpl {
@Autowired
@Qualifier("userDao")
private UserDao userDao;
}
@Resource是什么
@Resource是Java自己的注解,是javax.annotation.Resource,需要导入,但是Spring支持该注解的注入。@Resource有两个属性是比较重要的,分是name和type;Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略。
public class TestServiceImpl {
// 下面两种@Resource只要使用一种即可
@Resource(name="userDao")
private UserDao userDao; // 用于字段上
@Resource(name="userDao")
public void setUserDao(UserDao userDao) { // 用于属性的setter方法上
this.userDao = userDao;
}
}
@PostMapping@GetMapping@PutMapping@DeleteMapping是什么
Spring MVC新特性提供了对Restful风格的支持
@GetMapping,处理get请求
@PostMapping,处理post请求
@PutMapping,处理put请求
@DeleteMapping,处理delete请求
@PostMapping("/updateApp") 等价于 @RequestMapping(value = "/updateApp",method = RequestMethod.POST)
@RequestParam是什么
@RequestParam放在问号后面,无论GET还是POST都能取到值;当POST放在body里格式为form-data也能取到值,其他(raw等)取不到,而为GET放到body都取不到值
@GetMapping("/get")
Response getNews(@RequestParam("id") Integer id) {
try {
NewsClass newsClass = newsService.show(id);
return Response.ok(newsClass);
} catch (Exception e) {
return Response.error(e.getMessage());
}
}
@RequestBody是什么
对于@RequestBody无论是POST还是GET请求参数只能放在请求体里面,当请求方式为GET(@RequestBody)时,请求参数放在请求体里,服务端也能拿到参数
@PostMapping("/delete")
Response delete(@RequestBody Integer[] ids) {
try {
newsService.delete(ids);
return Response.ok();
} catch (Exception e) {
return Response.error(e.getMessage());
}
}
原文链接
https://www.cnblogs.com/skyblue-li/p/6861036.html
https://blog.csdn.net/lbh_paopao/article/details/113877754