SpringMVC视图解析器
SpringMVC中的视图解析器的主要作用就是将逻辑视图转换成用户可以看到的物理视图。
当用户对SpringMVC应用程序发起请求时,这些请求都会被SpringMVC的DispatcherServlet处理,通过处理器找到最为合适的HandlerMapping定义的请求映射中最为合适的映射,然后通过HandlerMapping找到相对应的Handler,然后再通过相对应的HandlerAdapter处理该Handler。返回结果是一个ModelAndView对象,当该ModelAndView对象中不包含真正的视图,而是一个逻辑视图路径的时候,ViewResolver就会把该逻辑视图路径解析为真正的View视图对象,然后通过View的渲染,将最终结果返回给用户。
SpringMVC中处理视图最终要的两个接口就是ViewResolver和View,ViewResolver的作用是将逻辑视图解析成物理视图,View的主要作用是调用其render()方法将物理视图进行渲染。
一般来说,对于SpringMVC控制器中的方法,无论是返回String、View或者是ModelAndView,SpringMVC在内部都会将返回结果封装成ModelAndView对象,然后返回给用户。
视图解析器需要配置在SpringMVC的配置文件中,如下:
<!-- 对转向页面的路径解析。prefix:前缀, suffix:后缀 -->
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/page"></property>
<property name="suffix" value=".jsp"></property>
</bean>
SpringMVC视图解析器解析流程:
1、将SpringMVC控制器中的返回结果封装成一个ModelAndView对象。
2、通过SpringMVC中的视图解析器,使用ViewResolver对控制器返回的ModelAndView对象进行解析,将逻辑视图转换成物理视图。
3、调用View中的render()方法对物理视图进行渲染。
使用mvc:view-controller不经控制器直接跳转到页面
若希望直接响应通过SpringMVC渲染的页面,可以使用mvc:view-controller标签实现:
<!-- 配置直接转发的页面 -->
<!-- 可以直接相应转发的页面, 而无需再经过 Handler 的方法. -->
<mvc:view-controller path="/success" view-name="success"/>
- 那么现在可以直接在某一页面中通过请求路径”success”访问到/WEB-INF/views/success.jsp页面(因为我们上面配置了视图解析器将逻辑视图解析为前缀为/WEB-INF/views/,后缀为.jsp的物理视图)。但是,这种情况下通过控制器就无法映射到请求了,需要再进行如下配置:
- <!-- 在实际开发中通常都需配置 mvc:annotation-driven 标签, 之前的页面才不会因为配置了直接转发页面而受到影响 -->
<mvc:annotation-driven></mvc:annotation-driven>
关于重定向
一般情况下,控制器方法返回字符串类型的值会被当成逻辑视图名处理,但如果返回的字符串中带forward:或redirect:前缀时,SpringMVC会对它们进行特殊处理:将forward: 和redirect: 当成指示符,其后的字符串作为URL 来处理。示例如下:
index.jsp:
<a href="${pageContext.request.contextPath }/springmvc/testRedirect">Test Redirect</a>
controller:
@Controller
@RequestMapping("/springmvc")
public class SpringMVCTest {
@RequestMapping("/testRedirect")
public String testRedirect() {
System.out.println("testRedirect");
return "redirect:/index.jsp";
}
}
即可重定向到index.jsp。也可在redirect:/后添加控制器方法的映射路径,重定向到该目标方法。