Spring MVC 中,我們在返回邏輯視圖時,框架會通過 viewResolver 來解析得到具體的 View,然後向瀏覽器渲染。假設邏輯視圖名爲 hello,通過配置,我們配置某個 ViewResolver 如下:
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<description>
假如邏輯試圖名爲 "hello",因此 viewResolver 將解析成 /WEB-INF/jsp/hello.jsp
</description>
<property name="order" value="10" />
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
實際上,框架還是通過 forward 的方式轉發到了 /WEB-INF/jsp/hello.jsp。如果邏輯視圖名是 /hello,實際還是轉發到了 /WEB-INF/jsp/hello.jsp,即 /WEB-INF/jsp//hello.jsp 等同於 /WEB-INF/jsp/hello.jsp。
現在有個問題,如果 /hello 就是某個 controller 的映射,我想轉發到這個 controller,怎麼辦?我們可以通過forward 前綴來達到轉發到其它資源的目的:
public String handle() {
// return "forward:/hello"->轉發到能夠匹配 /hello 的 controller 上
// return "hello"-> 實際上還是轉發,只不過是框架會找到該邏輯視圖名對應的 View 並渲染
// return "/hello" -> 同 return "hello"
return "forward:/hello";
}
同理,如果我們想重定向到某個資源,我們可以通過 redirect 前綴來達到重定向到其它資源的目的:
public String handle() {
// 重定向到 /hello 資源
return "redirect:/hello";
}