背景:原系統是由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值越小,優先級越高,不知道為啥不行呢?