1、问题描述
springboot下,基本全标签化了,spring标签很多,有时候会混淆,简单记录下,以免有时候会迷糊。
2、解决方案
2.1 @Controller/@Service/@Repository/@Component
简单说明:
@Controller用于标注控制层组件; @Service用于标注业务层组件; @Repository用于标注数据访问组件,即DAO组件; @Component泛指组件,组件不好分类的的时候,使用该标签;
(1)2.5以前这几个标签作用是一样的,都是用于将POJO加载到spring容器中,不同是的业务层面,不同的标签名字让人一目了然类的作用,但实际作用一样;
(2)spring5开始,@Controller有点不一样了,简单来说就是只有被标注为@Controller的类,Spring才会自动的去扫描该类里面的@RequestMapping,假如类被标记为其他标签,里面的@RequestMapping是不会被识别的,通过页面访问,会报找不到该资源;
2.2 @RequestMapping
非常重要的一个标签,用于映射请求,也就是通过它来指定控制器可以处理哪些URL请求,简单来说用户页面通过IP:端口/该地址,后台就能捕获/接收到该请求;
相当于Servlet中在web.xml中配置的映射作用一致
<servlet>
<servlet-name>servletName</servlet-name>
<servlet-class>ServletClass</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>servletName</servlet-name>
<url-pattern>url</url-pattern>
</servlet-mapping>
@RequestMapping类:
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Mapping
public @interface RequestMapping {
String name() default "";
@AliasFor("path")
String[] value() default {};
@AliasFor("value")
String[] path() default {};
RequestMethod[] method() default {};
String[] params() default {};
String[] headers() default {};
String[] consumes() default {};
String[] produces() default {};
}
(1)@Target({ElementType.TYPE, ElementType.METHOD}),表明@RequestMapping()既可以标注类上面,也可以标注再方法上,同时标注的话,浏览器访问需要拼接起来,例如:IP:端口号/项目名称/类上的标注value/方法value
(2)可以看到注解中的属性除了 name() 返回的字符串,其它的方法均返回数组,也就是可以定义多个属性值,例如 value() 和 path() 都可以同时定义多个字符串值来接收多个URL请求;
@RestController
@RequestMapping("/hello")
public class Hello {
@RequestMapping(value = {
"/test",
"/aa"
})
public String test() {
return "老王是帅哥";
}
}
当浏览器录入:
http://localhost:6060/hello/aa
或者
http://localhost:6060/hello/test
(3)其他还有很多设置,比如@GetMapping(“/test”),@PostMapping(“/test”),其实就是设置了method,还有参数占位等就不多说,比较散,用的时候自己查一下吧。
2.3 RequestBody与ResponseBody
@RequestBody 注解则是将 HTTP 请求正文插入方法中,使用适合的 HttpMessageConverter 将请求体写入某个对象。 作用:
-
该注解用于读取Request请求的body部分数据,使用系统默认配置的HttpMessageConverter进行解析,然后把相应的数据绑定到要返回的对象上; -
再把HttpMessageConverter返回的对象数据绑定到 controller中方法的参数上。
@ResponseBody注解的作用是将controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据。
示例:
@RequestMapping(value = "user/login")
@ResponseBody
public User login(@RequestBody User user) {
// 这样就不会再被解析为跳转路径,而是直接将user对象写入 HTTP 响应正文中
return user;
}
2.4 @Controller和@RestController
@RestController相当于@Controller+@ResponseBody合在一起使用的效果,返回json数据格式。
2.5 springboot约定访问(static与templates)
前端资源,有两个约定的目录,resources\static和resources\templates,现在前后端分离,这两个目录用的比较少,但是也是需要知道这两个目录干嘛用的,有时候后端测试的时候可以用一下,static用户放置资源,一般是图片、js等静态资源;templates用于放置动态页面;
(1)静态资源,约定放到resources\static下面就可以直接访问;
直接访问:
(2)动态页面,约定放置到resources\templates下面
默认放置到templates目录下面的动态html页面(1.html)不能直接访问的,springboot默认的前端开发是thymeleaf,需要添加该pom依赖;
(1)添加pom依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
(2)cotroller跳转,不能使用@RestController,要使用@Controller
@Controller
public class test {
@GetMapping("/test")
public String test() {
return "1";
}
}
效果:
更多信息请关注公众号:「软件老王」,关注不迷路,软件老王和他的IT朋友们,分享一些他们的技术见解和生活故事。
|