springmvc view解析
既然配置springboot涉及了这里,就来看看springmvc试图解析器。
springMVC.xml中:
<!--配置视图解析器--> <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/jsp/"></property> <property name="suffix" value=".jsp"></property> </bean>
HiController:
@Controller public class HiController { @RequestMapping("/hi") public ModelAndView getHi() { System.out.println("execute hi controller"); ModelAndView mav = new ModelAndView("me"); //view name : me return mav; } }
jsp 位置:
debug:
DispatcherServlet.doDispatch()里:
就是这里了:
这里有个缓存的概念,
isCache返回的是true, 所以默认是开启缓存的:
AbstractCachingViewResolver 中: public static final int DEFAULT_CACHE_LIMIT = 1024; private volatile int cacheLimit = DEFAULT_CACHE_LIMIT; // 这里使用volatile是为什么,为什么这里要同步,什么原因导致它需要线程之间的可见
所以为了不进缓存,重启项目第一次进Controller debug:
第一次进没有缓存, view是空的 ( 第二次进就不是空的):
(
看上面两个判断,以前写过这种,待会看看这种是怎么处理mark01:
)
在这里获取地址的,view主要就看到这里了。
(完)
补充:
1. 前面缓存的问题:
试验了一下关闭缓存果然有效:
<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/jsp/"></property> <property name="suffix" value=".jsp"></property> <property name="cache" value="false"></property> </bean>
再试试修改缓存大小也果然生效:
<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/jsp/"></property> <property name="suffix" value=".jsp"></property> <property name="cache" value="true"></property> <property name="cacheLimit" value="2"></property> </bean>
2. 试一下mark01中提到的,forward: & redirect:
HiController:
@Controller public class HiController { @RequestMapping("/yes") public String forwardYes() { return "forward: patch"; } @RequestMapping("/no") public String RedirectNo() { return "redirect: patch"; } @ResponseBody @RequestMapping("/patch") public String redirectNo() { return "from forward or redirect request"; } }
访问: http://localhost:8080/mvc/yes , 图示说明 return "forward:patch" 走的是 request的请求转发, 请求转发到 /patch
访问: http://localhost:8080/mvc/no, 图示说明实际走的是request的重定向 重定向到 /patch
先关了缓存再debug:
<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/jsp/"></property> <property name="suffix" value=".jsp"></property> <property name="cache" value="false"></property> </bean>
这里直接subString所以这里不要在forward:patch中间多空格,会找不到的。
粘贴太多了累死了,中间就跳过不看直接粘关键代码:
果然是重定向到/patch
redirect:
既然看到这里,这里是怎么设计的再看看。