SpringMVC 重定向/轉發操作
阿新 • • 發佈:2019-02-15
一般情況下(沒有標註@ResponseBody),控制器方法返回字串型別的值會被當成邏輯檢視名來處理。
如果返回的字串中帶有forward:或redirect:字首時,SpringMVC會對他們進行特殊處理:將forward和redirect當成指示符,其後的
字串作為URL來處理。
重定向
請求重定向以redirect:開頭
@Controller public class Test { @RequestMapping("/test") public String test() { System.out.println("test"); return當我們請求http://localhost:8080/test/test時,會執行重定向操作:"redirect:/index.jsp"; } }
同時,位址列顯示的是重定向後的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實現頁面轉發與重定向的操作。