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生成