码迷,mamicode.com
首页 > Web开发 > 详细

一起写框架-MVC框架-基础功能-实现forward和redirect的跳转(四)

时间:2017-11-12 00:26:38      阅读:276      评论:0      收藏:0      [点我收藏+]

标签:rect   ice   index.jsp   dem   style   exception   重定向   nts   格式   

 

实现功能

当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的跳转(四)

标签:rect   ice   index.jsp   dem   style   exception   重定向   nts   格式   

原文地址:http://www.cnblogs.com/zhuyuejiu/p/7820366.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!