springboot同时支持访问html5和jsp时,导致后台ResponseBody返回中文乱码

背景:原系统是由springboot jsp,所有访问都是jsp

现在需要做HTML5定位,要同时支持访问HTML5和JSP

在application.yml的spring标签下配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
mvc:
  #view:
    # 页面默认前缀目录
    prefix: /WEB-INF/jsp/
    # 响应页面默认后缀
    suffix: .jsp
    # # 配置JSP视图名
    view-names: '*'
     
thymeleaf:
  cache: false
  prefix: /WEB-INF/html/
  suffix: .html
  mode: HTML5
  encoding: UTF-8
  view-names: html/* 

  

发现访问jsp正常,html总是报500

看来还是没配置对

改成添加 配置文件,在配置文件中配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
@Configuration
public class ViewResolverConfiguration {
    @Configuration//用来定义 DispatcherServlet 应用上下文中的 bean
    @EnableWebMvc
    @ComponentScan("com.*.**")
    public class WebConfig implements WebMvcConfigurer {
        @Bean
        public ViewResolver viewResolver() {
            InternalResourceViewResolver resolver = new InternalResourceViewResolver();
            resolver.setPrefix("/WEB-INF/jsp/");
            resolver.setSuffix(".jsp");
            resolver.setViewNames("*");
            resolver.setOrder(2);
            return resolver;
        }
 
        @Bean
        public ITemplateResolver templateResolver() {
            SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver();
            templateResolver.setTemplateMode("HTML5");
            templateResolver.setPrefix("/WEB-INF/");
            templateResolver.setSuffix(".html");
            templateResolver.setCharacterEncoding("utf-8");
            templateResolver.setCacheable(false);
            return templateResolver;
        }
 
        @Bean
        public SpringTemplateEngine templateEngine() {
            SpringTemplateEngine templateEngine = new SpringTemplateEngine();
            templateEngine.setTemplateResolver(templateResolver());
            return templateEngine;
        }
 
        @Bean
        public ThymeleafViewResolver viewResolverThymeLeaf() {
            ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
            viewResolver.setTemplateEngine(templateEngine());
            viewResolver.setCharacterEncoding("utf-8");
            viewResolver.setOrder(1);
            viewResolver.setViewNames(new String[]{"html/*"});
            return viewResolver;
        }
 
        @Override
        public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
            configurer.enable();
        }
    }
}

 

pom.xml中添加依赖:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

 

大部分中都是访问jsp的

在jsp页面访问后台controller里返回页面

return "/a/b/c";  这种绝对地址开头;

 

在html页面访问后台controll里返回页面

return "html/location";    不以"/"开头;

 

jsp和html路径

WEB-INF/jsp/***

WEB-INF/html/***

 

到此:两种访问都没问题

 

但引发一个问题:对于jsp对应的Controller当返回json内容里,方法有注解@ResponseBody,返回到前台中文会乱码成????

 

解决方案:

  在上面类ViewResolverConfiguration 中类WebConfig 中添加

复制代码
     @Bean
        public HttpMessageConverter<String> responseBodyStringConverter() {
            StringHttpMessageConverter converter = new StringHttpMessageConverter(StandardCharsets.UTF_8);
            return converter;
        }
        
        @Bean
        public MappingJackson2HttpMessageConverter getMappingJackson2HttpMessageConverter() {
            MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();
            ObjectMapper objectMapper = new ObjectMapper();
            mappingJackson2HttpMessageConverter.setObjectMapper(objectMapper);
            //设置中文编码格式
            List<MediaType> list = new ArrayList<MediaType>();
            list.add(MediaType.APPLICATION_JSON_UTF8);
            mappingJackson2HttpMessageConverter.setSupportedMediaTypes(list);
            return mappingJackson2HttpMessageConverter;
        }
        
        @Override
        public void configureMessageConverters(List<HttpMessageConverter<?>> converters){
            //解决中文乱码
            converters.add(responseBodyStringConverter());
            //解决 添加解决中文乱码后 上述配置之后,返回json数据直接报错 500:no convertter for return value of type
            converters.add(getMappingJackson2HttpMessageConverter());
        }
复制代码

 

这样,两种访问都可以

注意:这里顺序

jsp    resolver.setOrder(2);

html  viewResolver.setOrder(1);

如果换成1,2,则html不能访问

order值越小,优先级越高,不知道为啥不行呢?

posted @   点点积累  阅读(1060)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示