Spring基础系列-Web开发
原创作品,可以转载,但是请标注出处地址:https://www.cnblogs.com/V1haoge/p/9996902.html
SpringBoot基础系列-web开发
概述
web开发就是集成Spring MVC进行开发,非REST开发。
整合Spring MVC
Spring MVC自动配置
当我们在POM中添加spring-boot-starter-web之后,SpringBoot就会自动进行SpringMVC整合配置,这些配置内容包括:
- 自动创建ContentNegotiatingViewResolver和BeanNameViewResolver的实例Bean
- 提供对持静态资源,包括WebJar的支持
- 自动创建Converter、GenericConverter和Formatter的实例Bean
- 提供对HttpMessageConverters的支持
- 自动创建MessageCodesResolver实例Bean
- 提供对静态欢迎页面index.html的支持
- 定制Favicon的支持
- 自动使用ConfigurableWebBindingInitializer实例Bean
定制Spring MVC
定制方式一
保留默认的自动配置,然后在其基础上新增一些配置:
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
// 添加针对swagger的处理,避免swagger404
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("swagger-ui.html")
.addResourceLocations("classpath:/META-INF/resources/");
}
//...自定义实现WebMvcConfigurer中的若干默认方法
}
定制方式二
完全控制Spring MVC,手动定制其各种功能:
@EnableWebMvc
@Configuration
public class WebMvcConfig {
//...自定义实现WebMvcConfigurer中的若干默认方法
}
定制方式三
定制RequestMappingHandlerMapping、RequestMappingHandlerAdapter或ExceptionHandlerExceptionResolver实例:
通过声明一个WebMvcRegistrationsAdapter实例来提供这些组件。
HttpMessageConverters
即Http消息转换器,主要用于转换Http请求和响应,比如Objects会被自动转换成为JSON格式或者XML格式。编码类型默认为UTF-8。
可以定制该转换器,方式为:
@Configuration
public class MyConfiguration {
// 定制HttpMessageConverters
@Bean
public HttpMessageConverters customConverters() {
HttpMessageConverter<?> additional = ...
HttpMessageConverter<?> another = ...
return new HttpMessageConverters(additional, another);
}
}
定制JSON序列化与反序列化
SpringBoot默认使用Jackson进行Json操作。
可以定制序列化与反序列化操作,方式为:
@JsonComponent
public class Example {
public static class Serializer extends JsonSerializer<SomeObject> {
// 定制json序列化逻辑...
}
public static class Deserializer extends JsonDeserializer<SomeObject> {
// 定制json反序列化逻辑...
}
}
或者
@JsonComponent
public static class Serializer extends JsonSerializer<SomeObject> {
// 定制json序列化逻辑...
}
关于注解@JsonComponent
看看源码:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface JsonComponent {
@AliasFor(annotation = Component.class)
String value() default "";
}
可以看到该注解是一个@Component,那么他的作用就类似与@Component,主要用于注册Bean。
MessageCodesResolver
即消息编码解析器,是Spring MVC内部用来生成错误编码来表示错误信息的。
静态内容
[待补充]
欢迎页面
SpringBoot首先会查找index.html静态欢迎页面,如果找不到再查找index.ftl之类的模板欢迎页面。
定制应用图标
SpringBoot会在配置的静态资源路径和类路径中(先后顺序)查找favicon.ico图标,将其用作应用图标。
ConfigurableWebBindingInitializer
SpringMVC通过一个WebBindingInitializer来为特定的请求提供一个WebDataBinder。如果自定义了ConfigurableWebBindingInitializer,那么SpringBoot将自动配置使SpringMVC使用它。
模板引擎
SpringBoot提供对以下模板引擎的自动支持:
- Freemarker
- Groovy
- Thymeleaf
- Mustache
错误处理
默认情况下,Spring Boot提供了一个/error映射,以合理的方式处理所有错误,并在servlet容器中注册为“全局”错误页面。
即在SpringBoot内部提供了这么一个控制器类BasicErrorController,接收/error请求,然后针对浏览器请求和客户端请求两种情况作了映射,分别返回不同的内容。浏览器请求返回一个公共的错误页面,而客户端请求则返回一个ResponseEntity实例。
定制错误处理功能
方式一:定制错误页面
定制错误页面就是针对不同的code定义页面
在resources目录下的static目录(或者templates目录)下定义error目录,在error目录中定义401.html,404.html,500.html等错误页面,一旦SpringBoot应用发生了401、404、500错误就会跳转到自定义的错误页面中,而对于未自定义编码的错误还会跳转到公共错误页面
/static/error/404.html
/static/error/500.html
/templates/error/404.ftl
/templates/error/500.ftl
注意:必须定义到上面所说的目录中,而且名称必须为:错误编码.html格式,如果不按照以上规则,则定制不成功,其实如果想要自定义错误页面地址和名称也是可以的,只不过需要多加一个步骤:
添加EmbeddedServletContainerCustomizer的Bean实例用于手动设置错误页面的映射关系:
假如将500.html错误页面创建到resources目录下,也就是类路径根目录下,那么就需要使用如下自定义的ErrorViewResolver来处理了:
/500.html
内容为:<p>根目录的500错误文件</p>
MyErrorVivwResolver.java
@Component
public class MyErrorVivwResolver implements ErrorViewResolver,ApplicationContextAware {
@Override
public ModelAndView resolveErrorView(HttpServletRequest request, HttpStatus status, Map<String, Object> model) {
Resource resource = this.applicationContext.getResource("classpath:/");
try {
resource = resource.createRelative(status.value() + ".html");
} catch (IOException e) {
e.printStackTrace();
}
ModelAndView modelAndView = new ModelAndView(new HtmlResourceView(resource), model);
return modelAndView;
}
ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
private static class HtmlResourceView implements View {
private Resource resource;
HtmlResourceView(Resource resource) {
this.resource = resource;
}
@Override
public String getContentType() {
return MediaType.TEXT_HTML_VALUE;
}
@Override
public void render(Map<String, ?> model, HttpServletRequest request,
HttpServletResponse response) throws Exception {
response.setContentType(getContentType());
FileCopyUtils.copy(this.resource.getInputStream(),
response.getOutputStream());
}
}
}
代码中不少内容是抄自SpringBoot内置的DefaultErrorViewResolver。
页面请求:
http://localhost:8080/error
页面跳转到500错误页面,页面显示:
根目录的500错误文件
方式二:无SpringMVC的错误页面映射(一般不涉及)
在不使用SpringMVC的情况下进行错误页面映射,需要使用ErrorPageRegistrar(错误页面注册器)来直接注册ErrorPages(错误页面)。
这个注册器直接与底层嵌入式servlet容器一起工作,即使没有Spring MVC的DispatcherServlet也可以工作。
跨域请求
跨源资源共享(Cross-origin resource sharing, CORS)是由大多数浏览器实现的W3C规范,它允许您以灵活的方式指定哪种跨域请求被授权,而不是使用一些不太安全、功能不太强大的方法,比如IFRAME或JSONP。
有两种配置方式:
全局配置
全局配置针对的是应用的所有控制器接口
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
// 跨域请求全局配置
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/book/**");
}
//...自定义实现WebMvcConfigurer中的若干默认方法
}
细粒度配置
细粒度指的是针对单个控制器中的方法,甚至是单个方法进行配置,使用@CrossOrigin注解
@RestController
@RequestMapping("/book")
@Api(description = "书籍接口")
@Log4j2
@CrossOrigin(maxAge = 3600)
public class BookApi {
@Autowired
private BookService bookService;
@CrossOrigin("http://localhost:8081")
@RequestMapping(value = "/getBook", method = RequestMethod.GET)
@ApiOperation(value = "获取一本书籍", notes = "根据ID获取书籍", httpMethod = "GET")
public ResponseEntity<Book> getBook(final int bookId){
return bookService.getBook(bookId);
}
}
Spring基础系列-Web开发的更多相关文章
- Spring基础系列-Spring事务不生效的问题与循环依赖问题
原创作品,可以转载,但是请标注出处地址:https://www.cnblogs.com/V1haoge/p/9476550.html 一.提出问题 不知道你是否遇到过这样的情况,在ssm框架中开发we ...
- C#基础系列:开发自己的窗体设计器(PropertyGrid显示中文属性名)
既然是一个窗体设计器,那就应该能够设置控件的属性,设置属性最好的当然是PropertyGrid了,我们仅仅需要使用一个PropertyGrid.SelectedObject = Control就可以搞 ...
- Spring基础系列--AOP织入逻辑跟踪
原创作品,可以转载,但是请标注出处地址:https://www.cnblogs.com/V1haoge/p/9619910.html 其实在之前的源码解读里面,关于织入的部分并没有说清楚,那些前置.后 ...
- Spring基础系列-AOP源码分析
原创作品,可以转载,但是请标注出处地址:https://www.cnblogs.com/V1haoge/p/9560803.html 一.概述 Spring的两大特性:IOC和AOP. AOP是面向切 ...
- Spring基础系列-容器启动流程(1)
原创作品,可以转载,但是请标注出处地址:https://www.cnblogs.com/V1haoge/p/9870339.html 概述 我说的容器启动流程涉及两种情况,SSM开发模式和Spri ...
- SpringBoot起飞系列-Web开发(四)
一.前言 从今天你开始我们就开始进行我们的web开发,之前的一篇用SpringBoot起飞系列-使用idea搭建环境(二)已经说明了我们如何进行开发,当然这是搭建起步,接下来我们就开始进行详细的开发, ...
- Spring Boot的web开发
web开发的自动配置类:org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration 自动配置的ViewResolver 视图的 ...
- 跟我学Spring Boot(三)Spring Boot 的web开发
1.Web开发中至关重要的一部分,Web开发的核心内容主要包括内嵌Servlet容器和SpringMVC spring boot 提供了spring-boot-starter-web 为web开发提 ...
- Spring Boot的web开发&静态资源配置方式
Web开发的自动配置类:org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration 1.1. 自动配置的ViewResolve ...
随机推荐
- BZOJ_1834_[ZJOI2010]network 网络扩容_费用流
BZOJ_1834_[ZJOI2010]network 网络扩容_费用流 题意: 给定一张有向图,每条边都有一个容量C和一个扩容费用W.这里扩容费用是指将容量扩大1所需的费用. 求: 1.在不扩容的 ...
- BZOJ_1040_[ZJOI2008]骑士_树形DP
BZOJ_1040_[ZJOI2008]骑士_树形DP 题意: Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各 界的赞扬.最近发生了一件可怕的事情,邪 ...
- RocketMQ源码 — 十一、 RocketMQ事务消息
分布式事务是一个复杂的问题,rmq实现了事务的最终一致性,rmq保证本地事务成功消息一定会发送成功并被成功消费,如果本地事务失败了,消息不会被发送. rmq事务消息的实现过程为: producer发送 ...
- OsharpNS轻量级.net core快速开发框架简明入门教程-代码生成器的使用
OsharpNS轻量级.net core快速开发框架简明入门教程 教程目录 从零开始启动Osharp 1.1. 使用OsharpNS项目模板创建项目 1.2. 配置数据库连接串并启动项目 1.3. O ...
- nodeJs的nodemailer发邮件报错hostname/IP doesn't match certificate's altnames怎么解决?
今天在开发过程中碰到一个问题,即使用node发送邮件时报错hostname/IP doesn't match certificate's altnames,在网上查了解决办法有两个, 加rejectU ...
- [小技巧]EF Core中如何获取上下文中操作过的实体
原文地址:https://www.cnblogs.com/lwqlun/p/10576443.html 作者:Lamond Lu 源代码:https://github.com/lamondlu/EFC ...
- Google 的 QUIC 华丽转身成为下一代网络协议: HTTP/3.0
HTTP/2.0 还没有普及,HTTP/3.0 标准就要被制定了. 据 IETF 透露,HTTP-over-QUIC 实验协议将被重命名为 HTTP/3,并成为 HTTP 协议的第三个正式版本. IE ...
- 服务部署到Swarm Cluster中
对于已存在的镜像,将其部署到服务器中并开始对外服务,便是它的职责,而我们要做的便是帮助它完成职责,前两个应用环节都已产生了相应的镜像,在这一环节,将完成服务部署到容器集群的工作,对于这一过程,实际执行 ...
- 目标检测之YOLO V2 V3
YOLO V2 YOLO V2是在YOLO的基础上,融合了其他一些网络结构的特性(比如:Faster R-CNN的Anchor,GooLeNet的\(1\times1\)卷积核等),进行的升级.其目的 ...
- 关于数据库管理系统DBMS--关系型数据库(MySQL/MariaDB)
数据库的结构(3种):层次,网状,关系型(用的最多): DBMS的三层模型: 视图层:面向最终用户: 逻辑层:面向程序员或DBA: 物理层:面向系统管理员: 关系型数据库管理系统——RDBMS: 主要 ...