• SpringBoot 之jsp


    Boot 内嵌的tomcat 是不支持jsp 的, jetty 也是。

    虽然boot也是有默认配置一个InternalResourceViewResolver ,但是它并不像我们在springmvc 中熟悉的那样, 它没有解析 jsp 的功能。  其实InternalResourceViewResolver 的含义只是 内部资源的 视图解析器, 更准确的说, 它是直接把 资源试图的解析交给了 j2ee 容器。 在传统的 springmvc + tomcat 项目中, 很明显就是 tomcat, 具体的工作是我们熟悉的org.apache.jasper.servlet.JspServlet 完成的。但是在内嵌的tomcat环境中, 并没有提供一个默认的jsp 解析器。因为, JspServlet 是 jasper. jar 的 内容。 如果我们想在boot 中使用jsp 的话, 我们需要引入类似的这么一个jar: tomcat-embed-jasper-xxx.jar , 对应的maven 是:

            <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>jstl</artifactId>
                <version>1.2</version>
            </dependency>
            <dependency>
                <groupId>taglibs</groupId>
                <artifactId>standard</artifactId>
                <version>1.1.2</version>
            </dependency>
            <dependency>
                <groupId>org.apache.tomcat.embed</groupId>
                <artifactId>tomcat-embed-jasper</artifactId>
            </dependency>

    这里,我们同时引入了 jstl,standard 两个jar ,因为他们常常是一起使用的。

    boot提供了两个mvc配置, 跟jsp 解析也有直接关系,他们默认是:

    spring.mvc.view.prefix=
    spring.mvc.view.suffix=

     WebMvcAutoConfiguration 的配置是这样的:

            @Bean
            @ConditionalOnMissingBean
            public InternalResourceViewResolver defaultViewResolver() {
                InternalResourceViewResolver resolver = new InternalResourceViewResolver();
                resolver.setPrefix(this.mvcProperties.getView().getPrefix());
                resolver.setSuffix(this.mvcProperties.getView().getSuffix());
                return resolver;
            }

    可见,很坑爹, 两个都是空。 就是说,默认我们根本访问不到 jsp !

    因此, 我们至少需要把suffix 改一下吧:

     spring.mvc.view.suffix=.jsp

    But !这样做, 我还是不能访问到 jsp, public,static, resources各个目录都放了相同文件,但都访问不到。, 真是郁闷了。后面我发现这是boot 的一个坑, 貌似只有把 jsp 页面 放到META-INF.resources 目录下, 才能访问。 也就是说,boot 只会 去META-INF.resources 目录下查找jsp。 不知道为什么, 有谁知道了, 请告诉我。 除了META-INF.resources目录, 传统的 src/main/webapp/WEB-INF目录 也是可以的。但不知道为什么一定要在WEB-INF 目录下。

    除了 修改application.properties 的mvc 配置项, 我们还可以手动的注册一个InternalResourceViewResolver :

        @Bean
        public InternalResourceViewResolver internalResourceViewResolver() {
            System.out.println("InternalResourceViewResolver  222.");
            InternalResourceViewResolver resourceViewResolver = new InternalResourceViewResolver();
            resourceViewResolver.setSuffix(".jsp");
    //        resourceViewResolver.setPrefix("/");
            resourceViewResolver.setViewClass(JstlView.class);
            return resourceViewResolver;
        }

    效果是一样的。 不同的是, 我们可以设置 viewclass :resourceViewResolver.setViewClass(JstlView.class);  默认它是空。



  • 相关阅读:
    新年放大招:Github 私库免费了!
    阿里启动新项目:Nacos,比 Eureka 更强!
    运行 Spring Boot 应用的 3 种方式
    过了所有技术面,却倒在 HR 一个问题上。。
    hdu 5428 The Factor(数学)
    poj 2385 Apple Catching(dp)
    poj 2229 Sumsets(dp 或 数学)
    poj 1759 Garland (二分搜索之其他)
    poj 3662 Telephone Lines(好题!!!二分搜索+dijkstra)
    poj 3669 Meteor Shower(bfs)
  • 原文地址:https://www.cnblogs.com/FlyAway2013/p/7968619.html
Copyright © 2020-2023  润新知