zoukankan      html  css  js  c++  java
  • 一起写框架-MVC框架-基础功能-实现forward和redirect的跳转(四)

     

    实现功能

    当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.测试结果

  • 相关阅读:
    使用canvas技术在网页上绘制鲜花
    java连接Access数据库
    L2-009. 抢红包
    L2-008. 最长对称子串
    L1-032. Left-pad
    L1-016. 查验身份证
    L1-005. 考试座位号
    L1-030. 一帮一
    L1-023. 输出GPLT
    L1-028. 判断素数
  • 原文地址:https://www.cnblogs.com/zhuyuejiu/p/7820366.html
Copyright © 2011-2022 走看看