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


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

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

    在application.yml的spring标签下配置

      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

    看来还是没配置对

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

    @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值越小,优先级越高,不知道为啥不行呢?

  • 相关阅读:
    2021个人年终总结
    Swagger笔记—Swagger3配置
    Vue3学习(十三)之 Modal 对话框、表单的使用
    寻找写代码感觉(十三)之 编辑功能的开发
    利用正则快速把经纬度字符串分割成数组。
    消除高流量导致的PostgreSQL瓶颈
    Percona XtraBackup基于时间点恢复单个数据库
    使用mysqlbinlog远程备份binlog
    MySQL 8随机密码生成器
    MySQL备份最佳实践
  • 原文地址:https://www.cnblogs.com/ngy0217/p/11497907.html
Copyright © 2020-2023  润新知