之前兩篇博客springMVC源碼分析--HandlerMethodReturnValueHandler返回值解析器(1)和 springMVC源碼分析--HandlerMethodReturnValueHandlerComposite返回值解析器集合(2)我們分別介紹了返回值處理器相干的東西,接下來我們選取1個簡單的實(shí)現(xiàn)類ViewNameMethodReturnValueHandler來簡單介紹1下返回值處理操作。
1、返回值為jsp頁面地址
@RequestMapping(value = "input") public String inputProduct() { logger.info("inputProduct called"); return "jsp/ProductForm"; //對應(yīng)jsp頁面名稱 }
實(shí)現(xiàn)代碼以下:
@Override public void handleReturnValue(Object returnValue, MethodParameter returnType, ModelAndViewContainer mavContainer, NativeWebRequest webRequest) throws Exception { //判斷是不是是String類型 if (returnValue instanceof CharSequence) { //如果是將其設(shè)置為視圖名稱 String viewName = returnValue.toString(); mavContainer.setViewName(viewName); if (isRedirectViewName(viewName)) { mavContainer.setRedirectModelScenario(true); } } else if (returnValue != null){ // should not happen throw new UnsupportedOperationException("Unexpected return type: " + returnType.getParameterType().getName() + " in method: " + returnType.getMethod()); } }
ViewNameMethodReturnValueHandler完全源碼以下,處理機(jī)制還是比較簡單的。
//HandlerMethodReturnValueHandler的子類,主要就是Controller履行后返回的視圖名稱 public class ViewNameMethodReturnValueHandler implements HandlerMethodReturnValueHandler { private String[] redirectPatterns; //設(shè)置跳轉(zhuǎn)鏈接的匹配方式 public void setRedirectPatterns(String... redirectPatterns) { this.redirectPatterns = redirectPatterns; } /** * The configured redirect patterns, if any. */ public String[] getRedirectPatterns() { return this.redirectPatterns; } @Override public boolean supportsReturnType(MethodParameter returnType) { Class<?> paramType = returnType.getParameterType(); return (void.class == paramType || CharSequence.class.isAssignableFrom(paramType)); } //實(shí)現(xiàn)邏輯還是比較簡單的,就是設(shè)置ModelAndViewContainer的viewName視圖名稱 @Override public void handleReturnValue(Object returnValue, MethodParameter returnType, ModelAndViewContainer mavContainer, NativeWebRequest webRequest) throws Exception { if (returnValue instanceof CharSequence) { String viewName = returnValue.toString(); mavContainer.setViewName(viewName); if (isRedirectViewName(viewName)) { mavContainer.setRedirectModelScenario(true); } } else if (returnValue != null){ // should not happen throw new UnsupportedOperationException("Unexpected return type: " + returnType.getParameterType().getName() + " in method: " + returnType.getMethod()); } } //判斷返回值是不是是跳轉(zhuǎn)鏈接,以redirect:開頭 protected boolean isRedirectViewName(String viewName) { return (PatternMatchUtils.simpleMatch(this.redirectPatterns, viewName) || viewName.startsWith("redirect:")); } }
上一篇 Android程序員學(xué)PHP開發(fā)(3)-循環(huán)變量真假非空-PhpStorm
下一篇 網(wǎng)絡(luò)編程(57)—— Windows下使用CAsyncSocket搭建回聲服務(wù)端和客戶端