當Controller的執行方法返回的視圖映射字符串是java
「forward:/index.jsp」或者"/index.jsp":使用forward跳轉到對應的頁面web
「redirect:/index.jsp」:使用redirect重定向到對應的頁面mvc
我將這部分的邏輯統一寫在一個視圖解釋器裏面。這樣作的目的是,爲了之後能夠擴展兼容多種視圖(如:Freemarker,Velocity等)。而不是僅僅是JSP。app
1. 定義一個視圖解釋器接口jsp
1 package ioc.webmvc.views; 2 3 import java.io.IOException; 4 5 import javax.servlet.ServletException; 6 import javax.servlet.http.HttpServletRequest; 7 import javax.servlet.http.HttpServletResponse; 8 9 /** 10 * 聲明一個視圖解釋器接口,用於方便之後擴展支持多種視圖,如:Freemarker,Velocity等 默認支持JSP 11 * 12 * @author ranger 13 * 14 */ 15 public interface ViewRelover { 16 /** 17 * 定義一個跳轉到視圖的方法 18 * 19 * @param result 20 * @param request 21 * @param response 22 * @throws IOException 23 * @throws ServletException 24 */ 25 void toView(String result, HttpServletRequest request, HttpServletResponse response) 26 throws IOException, ServletException; 27 }
2.實現JSP跳轉的視圖解釋器ide
1 package ioc.webmvc.views; 2 3 import java.io.IOException; 4 5 import javax.servlet.ServletException; 6 import javax.servlet.http.HttpServletRequest; 7 import javax.servlet.http.HttpServletResponse; 8 9 public class JspViewRelover implements ViewRelover { 10 11 @Override 12 public void toView(String result,HttpServletRequest request,HttpServletResponse response) throws IOException, ServletException{ 13 if (result != null) { 14 StringBuilder sb = new StringBuilder(result); 15 String substring = sb.substring(0, sb.indexOf(":") + 1); 16 System.out.println("-返回類型:-" + substring); 17 if (substring != null) { 18 String dispacherStr = sb.substring(sb.indexOf(":") + 1, sb.length()); 19 if (substring.equals("redirect:")) { 20 response.sendRedirect(request.getContextPath()+"/"+dispacherStr); 21 } else if (substring.equals("forward:")) { 22 request.getRequestDispatcher(dispacherStr).forward(request, response); 23 } else { 24 throw new RuntimeException("返回的映射路徑格式錯誤!"); 25 } 26 27 } else { 28 request.getRequestDispatcher(result).forward(request, response); 29 } 30 31 } 32 } 33 34 }
3.DispacherServlet調用視圖解釋器(暫時寫死僅僅支持JSP的視圖,之後擴展支持其餘視圖再實現經過反射的方式支持註解在配置類配置)測試
1 @Override 2 protected void service(HttpServletRequest request, HttpServletResponse response) 3 throws ServletException, IOException { 4 System.out.println("-測試成功--"); 5 6 ControllerRelolver rs = new ControllerRelolver(); 7 try { 8 //1.根據路徑執行Controller對應的映射方法 9 String result = rs.execute(request, response, contextApplication.getContext()); 10 //2.執行視圖解釋器,返回視圖 11 JspViewRelover viewRelover=new JspViewRelover(); 12 viewRelover.toView(result, request, response); 13 14 } catch (IllegalAccessException e) { 15 // TODO Auto-generated catch block 16 e.printStackTrace(); 17 } catch (IllegalArgumentException e) { 18 // TODO Auto-generated catch block 19 e.printStackTrace(); 20 } catch (InvocationTargetException e) { 21 // TODO Auto-generated catch block 22 e.printStackTrace(); 23 } 24 25 }
1.測試Web項目目錄ui
2.修改UserController的執行方法spa
1 package org.webmvc.controller; 2 3 import javax.servlet.http.HttpServletRequest; 4 import javax.servlet.http.HttpServletResponse; 5 6 import ioc.core.annotation.stereotype.Controller; 7 import ioc.webmvc.annotation.RequestMapping; 8 9 @Controller 10 public class UserController { 11 12 /** 13 * 路徑規則: 14 * 1.必須包括有/開頭 15 * 2.後綴必須忽略不寫 16 * 如:http://localhost:8080/webmvc-demo-test-01/test.do 17 * 對應的映射路徑爲:/test 18 * 19 */ 20 @RequestMapping(value = "/login") 21 public String login(HttpServletRequest request,HttpServletResponse response){ 22 System.out.println("-登陸Controller-"); 23 return "redirect:/login.jsp"; 24 25 } 26 27 } 28
3.測試結果code