前端浏览器发起请求,会携带HTTP请求数据,HTTP服务器(Tomcat)负责对请求数据进行解析,然后将解析好的数据封装到HttpServletRequest对象中。此后,应用程序对该对象中的数据进行处理。最后,Tomcat服务器需要根据响应数据的规定格式,通过HttpServletResponse对象设置相应数据,然后产生响应信息返回给浏览器。spring boot框架提供了DispatcherServlet前端控制器,让业务逻辑程序开发者可以专注于开发Controller部分的代码。
综上所述:
- 请求:获取请求数据。
- 响应:设置响应数据。
首先关注如何从请求数据中获取各种参数。
-
简单参数,Java提供的简单类型。controller中定义的函数的参数是前面提到的。通过最原始的方式获取请求参数,需要通过HttpServletRequest对象(函数的参数)手段获取,由于所有参赛都是字符串类型,所以还需要进行解析和类型转换,比较麻烦。spring框架提供了更方便的方法,只要定义controller方法的形参的参数遍历名与请求参数的参数名一致,就可以自动接收到对应的参数,而且会自动进行类型转换。如果名字不一致,获取到的参数就会是
null
值,如果没办法修改名字,可以通过@RequestParam
来手动映射名字。该注解还有另一个参数required
,表示该参数必须传递(不传递将报错),该参数可选,且默认值为true
。 -
实体参数,Java简单实体对象POJO。类似地,定义请求参数名与对象定义的属性名一致,就可以自动接收参数并封装成对应的对象。
-
数组集合参数,Java数组或Java集合类型的参数。对于数组,请求参数名与数组名一致就行;对于Java集合,不仅需要名字一致,还需要在函数形参前面使用
@RequestParam
注解来绑定参数关系。 -
日期时间参数,比如Java的
LocalDateTime
类型。需要通过@DateTimeFormat
注解指定字符串表示时间的pattern。 -
json参数。注意json参数必须设置为post请求,因为json参数是通过请求体传递的,而get请求没有请求体。json参数的接收一般通过定义的实体对象,保证json的key名与形参的类对象的属性名相同,此外还需要在形参前面加上
@RequestBody
注解。 -
路径参数,参数是请求url的一部分。在定义mapping的url的时候使用
{...}
类标识该参数,内部写明名字,然后在方法的形参前面使用@PathVariable
注解表明该参数从url中获取。当然,形参名要与请求参数名一致。注意,可以从url中获取多个路径参数。
下面讲响应数据。
controller方法返回的数据可以直接是字符串,也可以是对象或集合,并不是前面所讲的HttpServletResponse,原因在于在类或方法上使用了@RestController
注解,该注解是@Controller
和@ResponseBody
两个注解,后者的作用是将方法返回值直接响应给前端,当返回值类型是实体对象类型或Java集合,就会转换成json格式再响应。
可以发现响应数据的形式很多样,可能是字符串、对象、集合等等,实践中可以定义一个统一的响应结果类,controller方法可以返回响应结果对象供前端解析。
public class Result {private Integer code; // 响应码private String msg; // 响应信息private Object data; // 响应数据
}