zhaoyu@home:~$

springboot-WebApplication

web应用通过引入spring-boot-starter-web可以快速创建和启动web应用。如果想创建交互式的web应用,通过引入 spring-boot-starter-webflux模块。

SpringMVC

SpringMVC自动配置

springboot提供了Spring MVC的自动配置,默认引入如下特性。

  • 包括ContentNegotiatingViewResolver 和BeanNameViewResolver 。
  • 支持静态资源服务,包括WebJars。
  • Converter,GenericConverter,Formatter 自动注册。
  • 支持HttpMessageConverters 。
  • MessageCodesResolver自动注册。
  • 静态index.html支持。
  • 自定义的Favicon 支持。
  • 自动使用一个ConfigurableWebBindingInitializer bean。

HttpMessageConverters

Spring MVC 使用 HttpMessageConverters接口转换Http请求和响应,如,对象可以自动转换为json或者xml。字符串默认使用utf-8编码。 自定义转换器如下:

@Configuration
public class MyConfiguration {
	@Bean
	public HttpMessageConverters customConverters() {
		HttpMessageConverter<?> additional = ...
		HttpMessageConverter<?> another = ...
		return new HttpMessageConverters(additional, another);
	}
}

HttpMessageConverter会被放入转换器列表。使用这种方法可以覆盖默认的转换器。

自定义json转换

如果使用jackson序列化json对象,那么可以自定义对象的序列化和反序列化。需要实现JsonSerializer 和JsonDeserializer 接口,然后 添加@JsonComponent注解。

public class User {
    private Color favoriteColor;
    // standard getters/constructors
}

@JsonComponent
public class UserCombinedSerializer {
    public static class Serializer extends JsonSerializer<User> {
        @Override
        public void serialize(User user, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) 
            throws IOException, JsonProcessingException {
            jsonGenerator.writeStartObject();
            jsonGenerator.writeStringField(
              "favoriteColor", getColorAsWebColor(user.getFavoriteColor()));
            jsonGenerator.writeEndObject();
        }
 
        private static String getColorAsWebColor(Color color) {
            int r = (int) Math.round(color.getRed() * 255.0);
            int g = (int) Math.round(color.getGreen() * 255.0);
            int b = (int) Math.round(color.getBlue() * 255.0);
            return String.format("#%02x%02x%02x", r, g, b);
        }
    }
 
    public static class UserJsonDeserializer extends JsonDeserializer<User> {
        @Override
        public User deserialize(JsonParser jsonParser, 
          DeserializationContext deserializationContext)
          throws IOException, JsonProcessingException {
            TreeNode treeNode = jsonParser.getCodec().readTree(jsonParser);
            TextNode favoriteColor = (TextNode) treeNode.get(
              "favoriteColor");
            return new User(Color.web(favoriteColor.asText()));
        }
    }
}

在ApplicationContext 中的@JsonComponent自动使用jackson。SpringBoot也提供了JsonObjectSerializer和JsonObjectDeserializer 基类,他们分别实现了JsonSerializer和JsonDeserializer接口,扩展了jackson框架提供的基础功能。

CORS支持

协议,ip,端口相同称为同源。浏览器都有同源机制,即源A设置的数据,源B不能打开,但是也有了一些限制:

  • Cookie、LocalStorage 和 IndexDB 无法读取。
  • DOM 无法获得。
  • AJAX 请求不能发送。 Cross-origin resource sharing 是多数浏览器支持的W3C标准,较其他两种IFRAME和JSONP更加安全和强大。 Spring 配置跨源,使用@CrossOrigin注解定义一个WebMvcConfigurer,如下:
    @Configuration
    public class MyConfiguration {
      @Bean
      public WebMvcConfigurer corsConfigurer() {
          return new WebMvcConfigurer() {
              @Override
              public void addCorsMappings(CorsRegistry registry) {
                  registry.addMapping("/api/**");
              }
          };
      }
    }
    

Servlets, Filters, 和 listeners

当使用内嵌servlet容器时,我们可以注册servlet,filter,listener。
任何Servlet,filter,*Listener实例都是被容器注册的Spring Bean。可以很方便地从application.properties引用一个值。 SpringBoot加载了很多自动配置的filter,每个filter有对应的排序。如:OrderedCharacterEncodingFilter,WebMvcMetricsFilter, ErrorPageFilter等。

当使用内嵌的容器时,通过@WebServlet, @WebFilter, 和 @WebListener注册的类可以使用注解@ServletComponentScan启用。