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值越小,優先級越高,不知道為啥不行呢?


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM