zoukankan      html  css  js  c++  java
  • Spring Boot实践——SpringMVC视图解析

    一、注解说明

      在spring-boot+spring mvc 的项目中,有些时候我们需要自己配置一些项目的设置,就会涉及到这三个,那么,他们之间有什么关系呢? 
    首先,@EnableWebMvc=WebMvcConfigurationSupport,使用了@EnableWebMvc注解等于扩展了WebMvcConfigurationSupport但是没有重写任何方法。

    所以有以下几种使用方式:

    1. @EnableWebMvc+extends WebMvcConfigurationAdapter,在扩展的类中重写父类的方法即可,这种方式会屏蔽springboot的@EnableAutoConfiguration中的设置

    2. extends WebMvcConfigurationSupport,在扩展的类中重写父类的方法即可,这种方式会屏蔽springboot的@EnableAutoConfiguration中的设置

    3. extends WebMvcConfigurationAdapter,在扩展的类中重写父类的方法即可,这种方式依旧使用springboot的@EnableAutoConfiguration中的设置

    具体哪种方法适合,看个人对于项目的需求和要把控的程度

    在WebMvcConfigurationSupport(@EnableWebMvc)和@EnableAutoConfiguration这两种方式都有一些默认的设定 
    而WebMvcConfigurationAdapter则是一个abstract class

    具体如何类内如何进行个性化的设置,可以参考以下文章:

    Spring Boot:定制HTTP消息转换器 
    EnableWebMvc官方文档

    • 使用 @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);
        }
        
    }
    • 使用 @EnableAutoConfiguration 注解,会读取 application.properties 或 application.yml 文件中的配置
    ## 视图
    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,在视图引擎上就已经集成自动配置的模版引擎,如下: 
    1. FreeMarker 
    2. Groovy 
    3. Thymeleaf 
    4. Velocity (deprecated in 1.4) 
    6. Mustache

    JSP技术spring boot 官方是不推荐的,原因有三: 
    1. 在tomcat上,jsp不能在嵌套的tomcat容器解析即不能在打包成可执行的jar的情况下解析 
    2. Jetty 嵌套的容器不支持jsp 
    3. Undertow

    而其他的模版引擎spring boot 都支持,并默认会到classpath的templates里面查找模版引擎,这里假如我们使用freemarker模版引擎

    1.现在pom.xml启动freemarker模版引擎视图

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-freemarker</artifactId>
    </dependency>

    2.定义一个模版后缀是ftp,注意是在classpath的templates目录下

    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");
        }
    }

    4.配置首页

    /**
     * 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);
        }
        
    }

    5.访问 http://localhost:8088/springboot


    虽然,jsp技术,spring boot 官方不推荐,但考虑到是常用的技术,这里也来集成下jsp技术

     1.首先,需要在你项目上加上webapp标准的web项目文件夹

     

    2.配置jsp的前缀和后缀

    参考头部 ‘注解说明

    3.在controller中返回视图

    同freemaker的第三步

    4.配置首页

    同freemaker的第四步

    5.访问 http://localhost:8088/springboot


    注意

      如果出现freemarker模版引擎和jsp技术同时存在的话,springmvc会根据解析器的优先级来返回具体的视图,默认,FreeMarkerViewResolver的优先级大于InternalResourceViewResolver的优先级,所以同时存在的话,会返回freemarker视图

  • 相关阅读:
    Go语言学习资源
    优秀编程学习网站
    我对架构的理解
    【转】TCP协议中的三次握手和四次挥手(图解)
    【转】asp.net c# 网上搜集面试题目大全(附答案)
    spring framework 4 源码阅读
    浮点类型
    把二元查找树转变成排序的双向链表
    用模板写快速排序-链表
    用模板写快速排序-数组
  • 原文地址:https://www.cnblogs.com/onlymate/p/9563374.html
Copyright © 2011-2022 走看看