分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 运营维护

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

发布时间:2023-09-06 01:24责任编辑:苏小强关键词:MVC

 

实现功能

当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等 默认支持JSP11 ?* 12 ?* @author ranger13 ?*14 ?*/15 public interface ViewRelover {16 ????/**17 ?????* 定义一个跳转到视图的方法18 ?????* 19 ?????* @param result20 ?????* @param request21 ?????* @param response22 ?????* @throws IOException23 ?????* @throws ServletException24 ?????*/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 ????@Override12 ????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 block16 ????????????e.printStackTrace();17 ????????} catch (IllegalArgumentException e) {18 ????????????// TODO Auto-generated catch block19 ????????????e.printStackTrace();20 ????????} catch (InvocationTargetException e) {21 ????????????// TODO Auto-generated catch block22 ????????????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 @Controller10 public class UserController {11 ????12 ????/**13 ?????* 路径规则:14 ?????* 1.必须包括有/开头15 ?????* 2.后缀必须忽略不写16 ?????* 如:http://localhost:8080/webmvc-demo-test-01/test.do17 ?????* 对应的映射路径为:/test18 ?????* ?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的跳转(四)

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

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved