1. 程式人生 > >一起寫框架-MVC框架-基礎功能-實現forward和redirect的跳轉(四)

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

實現 java path subst velocity javax logs 兼容 lar

實現功能

當Controller的執行方法返回的視圖映射字符串是

“forward:/index.jsp”或者"/index.jsp":使用forward跳轉到對應的頁面

“redirect:/index.jsp”:使用redirect重定向到對應的頁面

實現思路

我將這部分的邏輯統一寫在一個視圖解釋器裏面。這樣做的目的是,為了以後可以擴展兼容多種視圖(如:Freemarker,Velocity等)。而不是僅僅是JSP。

實現步驟

1. 定義一個視圖解釋器接口

 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跳轉的視圖解釋器

 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項目目錄

技術分享

2.修改UserController的執行方法

 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.測試結果

技術分享

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