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:

 

 

 

 

 

 

既然看到这里,这里是怎么设计的再看看。

 

posted @ 2020-10-18 13:04  圣金巫灵  阅读(315)  评论(0编辑  收藏  举报