2

SpringMVC配置javaConfig及StringHttpMessageConverter

配置Spring的转换器,在xml中配置如下

<mvc:annotation-driven>  
    <mvc:message-converters>  
        <bean class="org.springframework.http.converter.StringHttpMessageConverter">  
            <property name="supportedMediaTypes">  
                <list>  
                    <value>text/plain;charset=UTF-8</value>  
                    <value>text/html;charset=UTF-8</value>  
                </list>  
            </property>  
        </bean>
    </mvc:message-converters>  
</mvc:annotation-driven>

在javaConfig中的配置如下

web.xml 3.0后可以直接使用,在Servlet 3.0环境
中, 容器会在类路径中查找实现
javax.servlet.ServletContainerInitializer接口的类,
如果能发现的话, 就会用它来配置Servlet容器。Spring提供了这个接口的实现, 名
SpringServletContainerInitializer, 这个类反过来又会
查找实现WebApplicationInitializer的类并将配置的任务交给
它们来完成。我们的SpittrWebAppInitializer扩展了
AbstractAnnotationConfig DispatcherServletInitializer(同时也就实现了
WebApplicationInitializer) , 因此当部署到Servlet 3.0容器
中的时候, 容器会自动发现它, 并用它来配置Servlet上下文。
public class SplittrWebAppInitianlizer extends AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected Class<?>[] getRootConfigClasses() {
        // 如果只是简单的一个web程序,可忽略
        return new Class<?>[] { RootConfig.class };
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        // 配置WebConfig,主要是初始化bean等,相当于加载applicationContext.xml文件
        return new Class<?>[] { WebConfig.class };
    }

    @Override
    protected String[] getServletMappings() {
        // 处理请求的路径
        return new String[] { "/" };
    }

}

WebConfig.java

@Configuration
@EnableWebMvc // 启用SpringMVC
@ComponentScan("com.spring02") // 启动组件扫描
public class WebConfig extends WebMvcConfigurerAdapter {

    // 配置视图解析器
    @Bean
    public ViewResolver viewResolver() {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/WEB-INF/views/");
        resolver.setSuffix(".jsp");
        resolver.setExposeContextBeansAsAttributes(true);
        return resolver;
    }

    // 配置处理静态资源
    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }

    // 设置MessageConverter
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        // 添加一个String处理起
        converters.add(stringHttpMessageConverter());
    }

    // 设置默认编码为UTF-8
    private Charset default_charset = Charset.forName("UTF-8");

    @Bean
    public StringHttpMessageConverter stringHttpMessageConverter() {
        StringHttpMessageConverter converter = new StringHttpMessageConverter(default_charset);
        List<MediaType> list = buildDefaultMediaTypes();
        converter.setSupportedMediaTypes(list);
        return converter;
    }

    // 设置响应头信息
    private static List<MediaType> buildDefaultMediaTypes() {
        List<MediaType> list = new ArrayList<>();
        list.add(MediaType.TEXT_HTML); // 这个必须设置在第一位
        list.add(MediaType.APPLICATION_JSON_UTF8);
        return list;
    }
}

说明:

  1. @EnableWebMvc就想当于<mvc:annotation-driven />
  2. 需要重写WebMvcConfigurerAdapter中的configureMessageConverters方法,在该方法中会传递converters,通过converters去添加处理器converters.add(处理器转换方法)

这个骑士不炸街
22 声望3 粉丝