传统springmvc同时使用jsp和freemarker出现的无法访问页面的问题

项目介绍

项目不是前后端分离,使用的springmvc架构。

其中配置类如下,我们同时配置jsp和freeMarker两种静态页面

@Configuration
@EnableWebMvc
public class AppConfig implements WebMvcConfigurer {

    @Bean
    public FreeMarkerConfigurer freeMarkerConfigurer() {
        FreeMarkerConfigurer freeMarkerConfigurer = new FreeMarkerConfigurer();
        freeMarkerConfigurer.setTemplateLoaderPath("classpath:/ftl/");
        freeMarkerConfigurer.setDefaultEncoding("UTF-8");
        freeMarkerConfigurer.setConfigLocation(applicationContext.getResource("classpath:ftl/ftl.properties"));
        return freeMarkerConfigurer;
    }

    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
        registry.enableContentNegotiation(new MappingJackson2JsonView());
        //在代码顺序上,jsp设置得比freeMarker早。
        registry.jsp("/jsp/", ".jsp");
        registry.freeMarker();
    }
}

对应的资源页面如下
在这里插入图片描述
控制层如下

@Controller
@RequestMapping("/user")
public class UserController {

    @RequestMapping("/ok")
    public String ok() {
        return "ok";
    }

    @RequestMapping("/user")
    public String user() {
        return "user";
    }
}

问题场景

访问http://localhost:8080/user/ok,页面跳转正常
访问http://localhost:8080/user/user,页面跳转报错
在这里插入图片描述发现居然要跳转到/jsp/user.jsp

问题分析

在具体分析之前,先提前说明几点。
通过registry.enableContentNegotiation(new MappingJackson2JsonView());启用了ContentNegotiatingViewResolver类。
此外,jsp页面对应的InternalResourceResolver类不会对"页面是否存在"做校验;而freeMarker对应的FreeMarkerViewResolver会对"页面是否存在"做校验。

  • 访问jsp页面

当访问http://localhost:8080/user/ok时,进入ContentNegotiatingViewResolver类的如下方法

在这里插入图片描述

此时candidateViews中获取的只有jsp对应的InternalResourceView对象(另外一个是mvc默认加的不用管), FreeMarkerViewResolver对象会判断页面不存在,所以不会返回FreeMarkerView
而经过getBestView方法筛选后,bestView也是InternalResourceView,所以访问没问题。

  • 访问freemarker页面

当访问http://localhost:8080/user/user时,进入ContentNegotiatingViewResolver
在这里插入图片描述

此时candidateViews中有freeMarker对应的FreeMarkerView对象,
由于InternalResourceResolver类不会对"页面是否存在"做校验,所以还会返回InternalResourceView对象。
而经过getBestView方法筛选后,bestView中是InternalResourceView对象了,而此时根本没有/jsp/user.jsp页面,所以报错。

问题解决

调换jsp和freeMarker设置的顺序

@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
    registry.enableContentNegotiation(new MappingJackson2JsonView());
    registry.freeMarker();
    registry.jsp("/jsp/", ".jsp");

}

这样的话,当访问http://localhost:8080/user/user时,bestView中就是FreeMarkerView对象了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值