开发Web应用程序
Spring Boot非常适合Web应用程序开发。您可以使用嵌入式Tomcat,Jetty,Undertow或Netty创建自包含的HTTP服务器。大多数Web应用程序使用该spring-boot-starter-web
模块快速启动和运行。您还可以选择使用该spring-boot-starter-webflux
模块构建响应式Web应用程序 。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
Spring Web MVC框架
Spring Web MVC是一个丰富的“模型视图控制器” Web框架。简称Spring MVC且允许您绑定特殊的@Controller或@RestControllerbean注解来处理传入的HTTP请求。控制器中的方法通过使用@RequestMapping注解映射到HTTP 。
以下代码显示了@RestController注解为JSON数据提供服务的典型代码:
@RestController
@RequestMapping(value="/users")
public class MyRestController {
@RequestMapping(value="/{user}", method=RequestMethod.GET)
public User getUser(@PathVariable Long user) {
// ...
}
@RequestMapping(value="/{user}/customers", method=RequestMethod.GET)
List<Customer> getUserCustomers(@PathVariable Long user) {
// ...
}
@RequestMapping(value="/{user}", method=RequestMethod.DELETE)
public User deleteUser(@PathVariable Long user) {
// ...
}
}
Spring MVC自动配置
自动配置在Spring的默认值之上添加很多功能,例如:
- 静态index.html支持
- 自定义Favicon支持
- 支持提供静态资源
静态内容
默认情况下,Spring Boot从资源根目录或类根目录或src/main/resources/static目录中提供静态内容.
欢迎页面
Spring Boot支持静态和模板化欢迎页面。在src/main/resources/static目录下查找index文件或模板。如果找到任何一个,它将自动用作应用程序的欢迎页面
自定义Favicon
Spring Boot 在配置的静态内容位置和类路径的根(按此顺序)中查找favicon.ico 。如果存在这样的文件,它将自动用作应用程序的展示图标。
跨源资源共享
在Spring Boot应用程序中使用带有@CrossOrigin
注解的控制器方法且不需要任何其他特定配置就可以实现跨域
其他方式
- HttpMessageConverters
- 自定义JSON序列化程序和反序列化程序
- MessageCodesResolver
- 路径匹配和内容协商
- ConfigurableWebBindingInitializer
- 模板引擎
- 错误处理
- 映射Spring MVC之外的错误页面
- Spring HATEOAS
- Spring WebFlux框架
- Spring WebFlux自动配置
- 带有HttpMessageReaders和HttpMessageWriters的HTTP编解码器
- 嵌入式Servlet容器支持
- 程序化定制
- 嵌入式Reactive Server支持
- Reactive Server资源配置
下面的内容出自Spring Web MVC
带注解的控制器
Spring MVC提供基于注解的编程模型,其中@Controller和 @RestController组件使用注释来表达请求映射,请求输入,异常处理等。带注解的控制器具有灵活的方法签名,不必扩展基类,也不必实现特定的接口。以下示例显示了由注释定义的控制器:
get http://localhost:8080/hello?par=test
@Controller
public class HelloController {
@GetMapping("/hello")
public String handle(HttpServletRequest request, String par) {
// others
return "index";
}
}
文件上传下载:最简化
@RestController
public class FileUploadController {
@Value("${file.base.path}")
String filePath;
@PostMapping("/fileUp")
public String getName(String fileName, MultipartFile fileUpload){
String uid = UUID.randomUUID().toString().replace('-','x');
if ( fileUpload.isEmpty() == false) {
try {
Path basePath = Paths.get(filePath+"file/");
if(Files.notExists(basePath)) Files.createDirectory(basePath);
fileUpload.transferTo(new File(filePath+"file/"+uid+fileName));
} catch (IllegalStateException | IOException e) {
e.printStackTrace();
}
}else{
return "null";
}
return "filePath/"+uid+fileName;
}
@GetMapping("/fileLoad")
public void handleFormUpload(HttpServletResponse response) {
try{
OutputStream outputStream = response.getOutputStream();
response.setContentType("application/x-download");
response.addHeader("Content-Disposition","attachment;filename=name.txt");
Files.copy(Paths.get(filePath+"file/name.txt"),outputStream );
outputStream.flush();
outputStream.close();
}catch (Exception e) {
e.printStackTrace();
}
}
}
transferTo(File):转存文件
List<MultipartFile>
:接收多个文件上传
中文乱码:new String(name.getBytes("UTF-8"),"iso-8859-1");
application/x-download
:设置内容类型为下载类型
Content-Disposition,attachment;filename=name
:设置文件下载提示和文件名
重定向
redirect:原请求数据丢失
@Controller
public class HelloController {
@GetMapping("/red")
public String toRedict(HttpServletResponse response) {
return "redirect:/boss.html";
}
}
转发
forward:原数据还在
@Controller
public class HelloController {
@GetMapping("/for")
public String toForwerd(HttpServletResponse response) {
return "forward:/client.html";
}
}
重定向和转发的页面都是在资源下的static静态目录下的html页面,斜杠开头代表根目录开始
请求映射
你可以使用 @RequestMapping注解将请求映射到控制器方法上。它具有各种属性,可通过URL,HTTP方法,请求参数,标头和媒体类型进行匹配。您可以在类级别使用它来表示共享映射,或者在方法级别使用它来缩小到特定的端点映射。
还有HTTP方法特定的快捷方式变体@RequestMapping(默认情况下,它与所有HTTP方法匹配):
@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping
您可以使用以下全局模式和通配符映射请求:
-
?
匹配一个字符 -
*
匹配路径段中的零个或多个字符 -
**
匹配零个或多个路径段
控制器常用方法参数
控制器方法请求参数 | 描述 |
---|---|
javax.servlet.ServletRequest, javax.servlet.ServletResponse | 选择任何特定的请求或响应类型-例如ServletRequest,HttpServletRequest或Spring的MultipartRequest,MultipartHttpServletRequest。 |
javax.servlet.http.HttpSession | 强制进行会话。因此,这种论点永远不会null。请注意,会话访问不是线程安全的。如果允许多个请求同时访问会话,请考虑将RequestMappingHandlerAdapter实例的synchronizeOnSession标志设置为 true。 |
HttpMethod | 请求的HTTP方法 |
@PathVariable | 用于访问URI模板变量 |
@RequestParam |
用于访问Servlet请求参数,包括多部分文件。参数值将转换为声明的方法参数类型。请注意,@RequestParam对于简单参数值,使用是可选的
|
@RequestHeader |
用于访问请求标头。标头值将转换为声明的方法参数类型。 |
@CookieValue |
用于访问cookie。Cookie值将转换为声明的方法参数类型。 |
@RequestBody |
用于访问HTTP请求正文。通过使用HttpMessageConverter 实现将正文内容转换为声明的方法参数类型。 |
HttpEntity<B> | 用于访问请求标头和正文。身体转换为HttpMessageConverter 。 |
@SessionAttribute |
用于访问任何会话属性,与由于类级@SessionAttributes 声明而存储在会话中的模型属性相反。 |
@RequestAttribute |
用于访问请求属性。 |
控制器常用方法返回值
控制器常用方法返回值 | 描述 |
---|---|
@ResponseBody |
返回值通过HttpMessageConverter 实现转换并写入响应。 |
HttpEntity<B> , ResponseEntity<B>
|
指定完整响应(包括HTTP标头和正文)的返回值将通过HttpMessageConverter 实现进行转换并写入响应。 |
HttpHeaders |
用于返回带标题且没有正文的响应。 |
String |
要使用ViewResolver 实现解析的视图名称,并与隐式模型一起使用 - 通过命令对象和@ModelAttribute 方法确定。处理程序方法还可以通过声明Model 参数以编程方式丰富模型 |
View |
甲View 实例以使用用于与所述隐式模型一起渲染-通过命令对象和确定@ModelAttribute 方法。处理程序方法还可以通过声明Model 参数以编程方式丰富模型 |
java.util.Map , org.springframework.ui.Model
|
要添加到隐式模型的属性,通过RequestToViewNameTranslator 隐式确定视图名称。 |
@ModelAttribute |
要添加到模型的属性,通过a隐式确定视图名称RequestToViewNameTranslator 。请注意,这@ModelAttribute 是可选的。请参见本表末尾的“任何其他返回值”。 |
ModelAndView |
要使用的视图和模型属性,以及(可选)响应状态。 |
void |
具有void 返回类型(或null 返回值)的方法被认为已完全处理响应(如果它还具有a ServletResponse ,OutputStream 参数或@ResponseStatus 注释)。如果控制器已进行正检查ETag 或lastModified 时间戳检查,也是如此,如果以上都不是,则void 返回类型还可以指示REST控制器的“无响应主体”或HTML控制器的默认视图名称选择。 |
URI变量
您可以在类和方法级别声明URI变量,如以下示例所示:
@Controller
@RequestMapping("/owners/{ownerId}")
public class OwnerController {
@GetMapping("/pets/{petId}")
public Pet findPet(@PathVariable Long ownerId, @PathVariable Long petId) {
// ...
}
}
URI变量会自动转换为适当的类型,或者TypeMismatchException 被引发。简单类型(int,long,Date,等)默认支持,你可以注册任何其它数据类型的支持。
您可以显式命名URI变量(例如,@PathVariable("customId"))
语法{varName:regex}声明一个URI变量,其正则表达式的语法为{varName:regex}。例如,给定URL "/spring-web-3.0.5 .jar",以下方法提取名称,版本和文件扩展名:
@GetMapping("/{name:[a-z-]+}-{version:\\d\\.\\d\\.\\d}{ext:\\.[a-z]+}")
public void handle(@PathVariable String name, @PathVariable String version, @PathVariable String ext) {
// ...
}
URI路径模式还可以具有嵌入式${…}占位符,这些占位符在启动时通过使用PropertyPlaceHolderConfigurer针对本地,系统,环境和其他属性源来解析。例如,您可以使用此参数来基于某些外部配置参数化基本URL。
使用consumes属性通过内容类型缩小映射范围
@PostMapping(path = "/pets", consumes = "application/json")
public void addPet(@RequestBody Pet pet) {
// ...
}
该consumes属性还支持否定表达式 - 例如,!text/plain表示除了以外的任何内容类型text/plain
对应关系
@GetMapping对应@RequestMapping(method=HttpMethod.GET)
@PostMapping,@PutMapping,@DeleteMapping,和@PatchMapping等都有此对应
@RequestParam,@RequestHeader,@PathVariable,@MatrixVariable,和@CookieValue)可以要求类型转换如果参数被声明为比其它的东西String。
对于此类情况,将根据配置的转换器自动应用类型转换
@GetMapping("/demo")
public void handle(@CookieValue("JSESSIONID") String cookie) {
//...
}