标签: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