【Spring Boot】Web开发 — Web开发简介

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应用。

java 复制代码
<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请求映射到对应的方法即可。具体使用如下:

java 复制代码
@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响应前台页面请求,示例代码如下:

java 复制代码
@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注解,否则会报错。示例代码如下:

java 复制代码
@Controller
public class HelloController {
    @RequestMapping("/hello")
    @ResponseBody
    public String hello() {
        return "hello word";
    }
}

2.2 @RestController的用法

Spring Boot提供的@RestController注解用于实现数据请求的处理。默认情况下,@RestController注解会将返回的对象数据转换为JSON格式。示例代码如下:

java 复制代码
@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。使用方式如下:

java 复制代码
@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。

相关推荐
滴水可藏海几秒前
Chrome离线安装包下载
前端·chrome
m512711 分钟前
LinuxC语言
java·服务器·前端
瓜牛_gn16 分钟前
依赖注入注解
java·后端·spring
Estar.Lee33 分钟前
时间操作[取当前北京时间]免费API接口教程
android·网络·后端·网络协议·tcp/ip
喜欢猪猪35 分钟前
Django:从入门到精通
后端·python·django
一个小坑货35 分钟前
Cargo Rust 的包管理器
开发语言·后端·rust
bluebonnet2739 分钟前
【Rust练习】22.HashMap
开发语言·后端·rust
uhakadotcom1 小时前
如何实现一个基于CLI终端的AI 聊天机器人?
后端
Myli_ing1 小时前
HTML的自动定义倒计时,这个配色存一下
前端·javascript·html
dr李四维1 小时前
iOS构建版本以及Hbuilder打iOS的ipa包全流程
前端·笔记·ios·产品运营·产品经理·xcode