在spring-boot+spring mvc 的项目中,有些时候我们需要自己配置一些项目的设置,就会涉及到这三个,那么,他们之间有什么关系呢? 首先,@EnableWebMvc=WebMvcConfigurationSupport,使用了@EnableWebMvc注解等于扩展了WebMvcConfigurationSupport但是没有重写任何方法。
所以有以下几种使用方式:
具体哪种方法适合,看个人对于项目的需求和要把控的程度
在WebMvcConfigurationSupport(@EnableWebMvc)和@EnableAutoConfiguration这两种方式都有一些默认的设定 而WebMvcConfigurationAdapter则是一个abstract class
具体如何类内如何进行个性化的设置,可以参考以下文章:
Spring Boot:定制HTTP消息转换器 EnableWebMvc官方文档
/** * Web MVC 配置适配器 * @ClassName: WebAppConfigurer * @Description: * @author OnlyMate * @Date 2018年8月28日 下午2:39:31 * * WebAppConfigurer extends WebMvcConfigurerAdapter 在Spring Boot2.0版本已过时了,用官网说的新的类替换 * */ @Configuration public class WebAppConfigurer implements WebMvcConfigurer { /** * springmvc视图解析 * @Title: viewResolver * @Description: TODO * @Date 2018年8月28日 下午4:46:07 * @author OnlyMate * @return */ @Bean public InternalResourceViewResolver viewResolver(){ InternalResourceViewResolver viewResolver = new InternalResourceViewResolver(); viewResolver.setPrefix("/WEB-INF/views/"); viewResolver.setSuffix(".jsp"); // viewResolver.setViewClass(JstlView.class); // 这个属性通常并不需要手动配置,高版本的Spring会自动检测 return viewResolver; } /** * SpringBoot设置首页 */ @Override public void addViewControllers(ViewControllerRegistry registry) { WebMvcConfigurer.super.addViewControllers(registry); registry.addViewController("/").setViewName("index"); registry.setOrder(Ordered.HIGHEST_PRECEDENCE); } } 复制代码
视图
## 视图 spring.mvc.view.prefix=/WEB-INF/views/ spring.mvc.view.suffix=.jsp 复制代码
或
spring: http: encoding: charset: UTF-8 enabled: true force: true messages: encoding: UTF-8 profiles: active: dev mvc: view: prefix: /WEB-INF/views/ suffix: .jsp 复制代码
Spring boot 在springmvc的视图解析器方面就默认集成了ContentNegotiatingViewResolver和BeanNameViewResolver,在视图引擎上就已经集成自动配置的模版引擎,如下:
JSP技术spring boot 官方是不推荐的,原因有三:
而其他的模版引擎spring boot 都支持,并默认会到classpath的templates里面查找模版引擎,这里假如我们使用freemarker模版引擎
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-freemarker</artifactId> </dependency> 复制代码
3. 在controller上返回视图路径
@Controller public class HelloWorldController { private Logger logger = LoggerFactory.getLogger(HelloWorldController.class); @Value("${question}") private String question; @Value("${answer}") private String answer; @Value("${content}") private String content; @ResponseBody @RequestMapping("/hello") public String index() { return "hello world"; } @ResponseBody @RequestMapping(value="/hello1") public String index1() { return question + answer; } @ResponseBody @RequestMapping(value="/hello2") public String index2() { return content; } @RequestMapping(value="/hello3") public String index3(Model model) { try { model.addAttribute("question", question); model.addAttribute("answer", answer); } catch (Exception e) { logger.info("HelloWorldController ==> index3 method: error", e); } return "/hello"; } } 复制代码
如果使用@RestController,默认就会在每个方法上加上@Responsebody,方法返回值会直接被httpmessageconverter转化,如果想直接返回视图,需要直接指定modelAndView。
public class HelloWorldController{ private Logger logger = LoggerFactory.getLogger(HelloWorldController.class); @Value("${question}") private String question; @Value("${answer}") private String answer; @Value("${content}") private String content; @RequestMapping("/hello3") public ModelAndView hello3() { try { model.addAttribute("question", question); model.addAttribute("answer", answer); } catch (Exception e) { logger.info("HelloWorldController ==> index3 method: error", e); } return new ModelAndView("hello"); } } 复制代码
/** * Web MVC 配置适配器 * @ClassName: WebAppConfigurer * @Description: * @author OnlyMate * @Date 2018年8月28日 下午2:39:31 * * WebAppConfigurer extends WebMvcConfigurerAdapter 在Spring Boot2.0版本已过时了,用官网说的新的类替换 * */ @Configuration public class WebAppConfigurer implements WebMvcConfigurer {/** * SpringBoot设置首页 */ @Override public void addViewControllers(ViewControllerRegistry registry) { WebMvcConfigurer.super.addViewControllers(registry); registry.addViewController("/").setViewName("index"); registry.setOrder(Ordered.HIGHEST_PRECEDENCE); } } 复制代码
2. 配置jsp的前缀和后缀 参考头部 ‘注解说明’ 3. 在controller中返回视图 同freemaker的第三步
配置首页 同freemaker的第四步
访问 http://localhost:8088/springboot
如果出现freemarker模版引擎和jsp技术同时存在的话,springmvc会根据解析器的优先级来返回具体的视图,默认,FreeMarkerViewResolver的优先级大于InternalResourceViewResolver的优先级,所以同时存在的话,会返回freemarker视图