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