一塊兒寫框架-MVC框架-基礎功能-實現forward和redirect的跳轉(四)

 

實現功能

當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

相關文章
相關標籤/搜索