springmvc动态切换views目录实现多套jsp页面的国际化

mvc重要配置一般情况都会这样控制jsp页面的前缀和后缀,但是不包含cache属性

    <bean
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!-- 默认springmvc会把modelandview的jsp位置缓存,必须设置禁用缓存否则无法动态切换目录 -->
       <property name="cache" value="false"></property>
        <property name="prefix" value="/WEB-INF/views/" />
        <property name="suffix" value=".jsp" />
    </bean>

拦截器类
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import org.springframework.web.servlet.view.InternalResourceViewResolver;

public class JspDirFilter extends HandlerInterceptorAdapter {
    @Autowired
    private InternalResourceViewResolver internalResourceViewResolver;
    
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        String language = request.getParameter("language");
        if(!StringUtils.isEmpty(language)) {
            //默认springmvc会把modelandview的jsp位置缓存,必须设置禁用缓存否则无法动态切换目录,已经通过配置文件设置
            //internalResourceViewResolver.setCache(false);
            internalResourceViewResolver.setPrefix("/WEB-INF/views/"+language+"/");
            Cookie cookie = new Cookie("language", language);
            response.addCookie(cookie);
        }else {//如果没有传参则根据cookie设置语言
            Cookie[] cookies = request.getCookies();
            for (Cookie c : cookies) {
                if(c.getName().equals("language")) {
                    internalResourceViewResolver.setPrefix("/WEB-INF/views/"+c.getValue()+"/");
                }
            }
        }
        return super.preHandle(request, response, handler);
    }
}

配置拦截器

    <mvc:interceptors>
        <bean class="net.appdd.web.filter.JspDirFilter"></bean>
    </mvc:interceptors>

整个功能就配置这三个地方就可以了

开始做动态切换的时候并没有加 <property name="cache" value="false"></property>这行,导致无论如何setPrefix之后都不生效,debug源代码发现是cache导致的,spmvc默认是开启了modelandview缓存的,多次请求同一个requestMapping会从缓存中获取modelandview,而不是重新根据prefix生成

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值