10年 Java程序员,硬核人生!勇往直前,永不退缩!

欢迎围观我的git:https://github.com/R1310328554/spring_security_learn 寻找志同道合的有志于研究技术的朋友,关注本人微信公众号: 觉醒的码农,或Q群 165874185

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

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);  默认它是空。

 



 

posted on 2017-12-08 21:15  CanntBelieve  阅读(1293)  评论(0编辑  收藏  举报