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视图

  • 相关阅读:
    数据分析2 numpy(ndarray数组,属性,创建,索引切片,运算,函数,随机数), Pandas(Series[创建,series数据对齐(相加),缺失值处理,特性,索引[整数索引loc和iloc]],DataFrame[索引与切片, 常用属性,数据对齐(相加),缺失值处理,常用方法],时间对象,时间序列), dateutil时间处理
    数据分析1 ipython, jupyter notebook(快捷键), anaconda软件
    CMDB4 总结CMDB,数据展示前后端不分离(xadmin第二种安装方法),前后端分离(vue-element-admin,iview-admin), 画图工具(highcharts,echarts,antv)
    CMDB3 完善采集端代码(ssh方案的多线程采集), 异常处理, 服务端目录结构的设计(django的app), API数据分析比对入库
    CMDB2 采集客户端目录架构设计, 高级配置文件, 可插拔式的采集
    CentOS, CMDB1 Linux命令补充(netstat,ps,kill,service,systemctl,top,wget,Irzsz,vim,磁盘使用情况,cpu情况,tree,history),linux常见的面试题, CMDB
    CentOS centos7的目录结构, 文件系统常用命令(pwd,cd,mkdir,touch,ls,cat,echo,cp,mv,rm), vim编辑器
    CentOS VMware安装CentOS7,配置网卡文件,Xshell5连接,快照,克隆,修改主机名
    flask框架4 表单验证, 表单查询wtforms,flask-migrate
    flask框架3 local对象补充,偏函数,请求上下文,g对象,flask-session组件,flask的信号,自定义信号(了解),用命令启动flask项目(flask-script)
  • 原文地址:https://www.cnblogs.com/onlymate/p/9563374.html
Copyright © 2011-2022 走看看