1. 程式人生 > >SpringMVC 重定向/轉發操作

SpringMVC 重定向/轉發操作

一般情況下(沒有標註@ResponseBody),控制器方法返回字串型別的值會被當成邏輯檢視名來處理。

如果返回的字串中帶有forward:或redirect:字首時,SpringMVC會對他們進行特殊處理:將forward和redirect當成指示符,其後的

字串作為URL來處理。

重定向

請求重定向以redirect:開頭

@Controller
public class Test {
    @RequestMapping("/test")
    public String test()  {
        System.out.println("test");
        return 
"redirect:/index.jsp"; } }
當我們請求http://localhost:8080/test/test時,會執行重定向操作:



同時,位址列顯示的是重定向後的URL。

轉發

請求轉發以forward:開頭

@Controller
public class Test {
    @RequestMapping("/test")
    public String test()  {
        System.out.println("test");
        return "forward:/WEB-INF/views/success.jsp";
}
}
轉發操作在SpringMVC內部進行,隸屬同一個請求,所以位址列URL是沒有發生變化的。

我們看看內部是如何處理的:

@Override
protected View createView(String viewName, Locale locale) throws Exception {
   // If this resolver is not supposed to handle the given view,
   // return null to pass on to the next resolver in the chain.
if (!canHandle(viewName, locale)) {
      return null;
}
   // Check for special "redirect:" prefix.
if (viewName.startsWith(REDIRECT_URL_PREFIX)) { String redirectUrl = viewName.substring(REDIRECT_URL_PREFIX.length()); RedirectView view = new RedirectView(redirectUrl, isRedirectContextRelative(), isRedirectHttp10Compatible()); view.setHosts(getRedirectHosts()); return applyLifecycleMethods(viewName, view); } // Check for special "forward:" prefix. if (viewName.startsWith(FORWARD_URL_PREFIX)) { String forwardUrl = viewName.substring(FORWARD_URL_PREFIX.length()); return new InternalResourceView(forwardUrl); } // Else fall back to superclass implementation: calling loadView. return super.createView(viewName, locale); }

debug:

重定向與轉發也可以在

<mvc:view-controller> 

標籤下使用。

<mvc:view-controller path="/hello" view-name="forward:/WEB-INF/views/success.jsp"/>
當我們訪問http://localhost:8080/test/hello
會轉發到/WEB-INF/views/success.jsp。這就實現了不通過controller實現頁面轉發與重定向的操作。