Web开发简介
首先介绍Spring Boot 提供的Web组件spring-boot-starter-web,然后介绍@Controller和@RestController注解,以及控制数据返回的@ResponseBody注解,最后介绍Web配置,以便让读者对使用Spring Boot开发Web系统有初步的了解。
1.Web入门
Spring Boot将传统Web开发的mvc、json、validation、tomcat等框架整合,提供了spring-boot-starter-web组件,简化了Web应用配置、开发的难度,将初学者从繁杂的配置项中解放出来,专注于业务逻辑的实现。
1.1 spring-boot-starter-web介绍
Spring Boot自带的spring-boot-starter-web组件为Web应用开发提供支持,它内嵌的Tomcat以及Spring MVC的依赖使用起来非常方便。
Spring Boot创建Web应用非常简单,先创建一个普通的Spring Boot项目,然后修改pom.xml文件将spring-boot-starter-web组件加入项目就可以创建Web应用。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
我们使用IDEA编辑器打开新创建的Web项目。打开Maven中的Dependencies,查看spring-boot-starter-web启动器(Starters)会引入哪些依赖JAR包,如图所示。
spring-boot-starter-web启动器主要包括web、webmvc、json、tomcat等基础依赖组件,作用是提供Web开发场景所需的所有底层依赖。其中webmvc为Web开发的基础框架,json为JSON数据解析组件,tomcat为自带的容器依赖。所以,只需引入spring-boot-starter-web启动器即可实现Web应用开发,而无须额外引入Tomcat以及其他Web依赖文件。
另外,开发Web应用可能还会用到模板引擎,Spring Boot提供了大量的模板引擎,包括FreeMarker、Groovy、Thymeleaf、Velocity和Mustache等。Spring Boot官方推荐使用Thymeleaf。
1.2 Web项目结构
Spring Boot的Web应用与其他的Spring Boot应用基本没有区别,只是resources目录中多了static静态资源目录以及templates页面模板目录。
1.3 实现简单的Web请求
Spring Boot不像传统的MVC框架那样必须继承某个基础类才能处理HTTP请求,只需要在类上声明@Controller注解,标注这是一个控制器,然后使用@RequestMapping注解把HTTP请求映射到对应的方法即可。具体使用如下:
@RestController
public class HelloController {
@RequestMapping("/hello")
public String hello() {
return "hello word";
}
}
上面的示例中,@RequestMapping注解用于定义请求的路由地址,既可以作用在方法上,又可以作用在类上。
启动项目,在浏览器中访问http://localhost:8080/hello地址,就可以看到页面返回“hello world”。这说明一个简单的Web项目创建成功了。
2.@Controller和@RestController
Spring Boot提供了@Controller和@RestController两种注解来标识此类负责接收和处理HTTP请求。如果请求的是页面和数据,使用@Controller注解即可;如果只是请求数据,则可以使用@RestController注解。
2.1 @Controller的用法
Spring Boot提供的@Controller注解主要用于页面和数据的返回。下面创建HelloController响应前台页面请求,示例代码如下:
@Controller
@RequestMapping("user")
public class UserController {
@RequestMapping("/index")
public String index() {
map.addAttribute("name", "thymeleaf-index");
return "thymeleaf/index";
}
}
上面的示例用于请求/user/index地址,返回具体的index页面和name=thymeleaf-index的数据。在前端页面中可以通过${name}参数获取后台返回的数据并显示到页面中。
在@Controller类中,如果只返回数据到前台页面,需要使用@ResponseBody注解,否则会报错。示例代码如下:
@Controller
public class HelloController {
@RequestMapping("/hello")
@ResponseBody
public String hello() {
return "hello word";
}
}
2.2 @RestController的用法
Spring Boot提供的@RestController注解用于实现数据请求的处理。默认情况下,@RestController注解会将返回的对象数据转换为JSON格式。示例代码如下:
@RestController
@RequestMapping("/user")
public class UserController {
@RequestMapping("/getUser")
public User getUser() {
User u =new User();
u.setName("lxml.123");
u.setAge(25);
u.setPassword("lxml.123");
return u;
}
}
在上面的示例中,定义/user/getUser接口返回JSON格式的User数据。同时,@RequestMapping注解可以通过method参数指定请求的方式。如果请求方式不对,则会报错。
近几年前端框架越来越强大,前后端分离的RESTful架构成为主流。Spring Boot对RESTful也做了非常完善的支持,使用也特别简单,使用@RestController注解自动返回JSON格式的数据,同时使用@GetMapping、PostMapping等注解实现映射RESTful接口。
2.3 @RestController和@Controller的区别
@Controller和@RestController注解都是标识该类是否可以处理HTTP请求,可以说@RestController是@Controller和@ResponseBody的结合体,是这两个注解合并使用的效果。虽然二者的用法基本类似,但还是有一些区别,具体如下:
1)@Controller标识当前类是Spring MVC Controller处理器,而@RestController则只负责数据返回。
2)如果使用@RestController注解,则Controller中的方法无法返回Web页面,配置的视图解析器InternalResourceViewResolver不起作用,返回的内容就是Return中的数据。
3)如果需要返回指定页面,则使用@Controller注解,并配合视图解析器返回页面和数据。如果需要返回JSON、XML或自定义内容到页面,则需要在对应的方法上加上@ResponseBody注解。
4)使用@Controller注解时,在对应的方法上,视图解析器可以解析返回的JSP、HTML页面,并且跳转到相应页面。若返回JSON等内容到页面,则需要添加@ResponseBody注解。
5)@RestController注解相当于@Controller和@ResponseBody两个注解的结合,能直接将返回的数据转换成JSON数据格式,无须在方法前添加@ResponseBody注解,但是使用@RestController注解时不能返回JSP、HTML页面,因为视图解析器无法解析JSP、HTML页面。
总之,在Web系统中使用@Controller较多,而在Web API中基本使用@RestController注解。
3.@RequestMapping
@RequestMapping注解主要负责URL的路由映射。它可以添加在Controller类或者具体的方法上,如果添加在Controller类上,则这个Controller中的所有路由映射都将会加上此映射规则,如果添加在方法上,则只对当前方法生效。@RequestMapping注解包含很多属性参数来定义HTTP的请求映射规则。常用的属性参数如下:
- value:请求URL的路径,支持URL模板、正则表达式。
- method:HTTP请求的方法。
- consumes:允许的媒体类型,如consumes="application/json"为HTTP的Content-Type。
- produces:相应的媒体类型,如consumes="application/json"为HTTP的Accept字段。
- params:请求参数。
- headers:请求头的值。
以上属性基本涵盖了一个HTTP请求的所有参数信息。其中,value和method属性比较常用。
4 @ResponseBody
@ResponseBody注解主要用于定义数据的返回格式,作用在方法上,默认使用Jackson序列化成JSON字符串后返回给客户端,如果是字符串,则直接返回。
在Controller中有时需要返回JSON格式的数据,如果想直接返回数据体而不是视图名,则需要在方法上使用@ResponseBody。使用方式如下:
@Controller
@RequestMapping("/user")
public class UserController {
@RequestMapping("/getUser")
@ResponseBody
public User getUser() {
User u =new User();
u.setName("lxml.123");
u.setAge(25);
u.setPassword("lxml.123");
return u;
}
}
在上面的示例中,请求/user/getUser时,返回JSON格式的User数据。这与@RestController的作用类似。
需要注意的是,使用@ResponseBody注解时需要注意请求的类型和地址,如果期望返回JSON,但是请求URL以html结尾的页面,就会导致Spring Boot认为请求的是HTML类型的资源,而返回JSON类型的资源,与期望类型不一致,因此报出如下错误:
根据RESTful规范的建议,在Spring Boot应用中,如果期望返回JSON类型的资源,URL请求资源后缀就使用json;如果期望返回视图,URL请求资源后缀就使用html。