分类
/*
* View作用:处理模型数据,实现页面的跳转(转发和重定向)
* View类型:
* InternalResourceView:转发视图
* JstlView:转发视图
* RedirectView:重定向视图
*/
@RequestMapping(value = "/param",method = RequestMethod.POST)
public String param()
{
// return "redirect:index.jsp";
return "success";
}
原码分析
InternalResourceView
来到熟悉的这里
进入resolveViewName(解析视图名称)
遍历视图解析器,我们可以写多个视图解析器,
这里我们只写了一个视图解析器
进入viewResolver.resolveViewName(viewName, locale);
判断缓存中有没有,没有就请求子类能不创建,调用的是
// Ask the subclass to create the View object.
view = createView(viewName, locale);
进入createView
判断视图名称是不是以redirect:或者forward:开头,然后创建不同的视图
这里我们都不是,所以进入最后一个
// Else fall back to superclass implementation: calling loadView.
子类无法创建View,调用父类的loadView
进入super.createView(viewName, locale);
这里就是我们熟悉的配置了,这里将视图的Url进行了设置
Url设置成我们视图的配置的getPrefix() + viewName + getSuffix()
这里还设置了视图的文本类型
view.setContentType(contentType);
默认的是:text/html;charset=ISO-8859-1
RedirectView
代码这样return "redirect:index.jsp";
直接来到这里
REDIRECT_URL_PREFIX
是常量,值是redirect:
先是截取视图名称,将redirect:去掉了
然后返回到AbstractCachingViewResolver类的resolveViewName
创建出一个RedirectView
返回到DispatcherServlet类的render方法
进入render
然后进入renderMergedOutputModel
这里targetUrl是路径,而且是重定向进行转发
配置文件路径设置
<!-- The front controller of this Spring Web application, responsible for handling all application requests -->
<servlet>
<servlet-name>springMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--
设置springMVC配置文件的位置和名称
web项目有两个路径,一个是资源文件路径,一个是WebContent路径
配置资源文件路径只需要在路径前面加classpath:就行
-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springMVC.xml</param-value>
</init-param>
<!--
这个是设置servlet的加载时间
默认第一次访问的时候加载,如果设置了这个标签,就会将servlet的加载时间提前到项目启动时
这个标签可以写整数,写负数和0是和没有配置的效果是一样的
只有是正整数才会将servlet的加载时间提前到项目启动时
而且不同的servlet不能设置同样的值,不然不知道加载那个先
-->
<load-on-startup>1</load-on-startup>
</servlet>
<!-- Map all requests to the DispatcherServlet for handling -->
<servlet-mapping>
<servlet-name>springMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
编码过滤器
<!-- 编码过滤器必须设置在所有过滤器的最前面的监听器
因为有缓存,不然编码过滤器无效了
-->
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>