使用反射手写自己的DispatchServlet

    科技2022-07-12  143

    在此诞生一个属于自己的DispatchServlet

    Spring MVC 的核心DispatchServlet

    本文章只是让我们能够更详细的了解DispatchServlet的大致流程

    Spring MVC 的核心DispatchServlet

    大致做了哪些事情:

    拦截请求解析url根据解析后的url去执行具体方法返回数据,进行页面跳转

    知道了大致流程,使用反射来实现一下这个过程,

    项目目录:

    DispatchServlet 类

    package cn.servlet; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.lang.reflect.Method; /* * url请求方式为 包名+类名+方法名,将 . 替换成 / * 例如:cn/servlet/IndexServlet/test */ //1.拦截所有请求------------- @WebServlet(name = "dispathcServlet",urlPatterns = "/") public class DispatchServlet extends HttpServlet { //提供给子类使用 private static HttpServletRequest request; private static HttpServletResponse response; //默认前缀,也可从配置文件中读取 private final static String PREFIX="/"; //默认后缀 private final static String SUFFIX=".jsp"; //默认报错所跳转的页面 private final static String ERROR_PAGE="/error.jsp"; public HttpServletRequest getRequest() { return request; } public HttpServletResponse getResponse() { return response; } @Override public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request,response); } @Override public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //初始化赋值,以供子类使用 this.request=request; this.response=response; //请求的全部路径 String allPath=request.getRequestURI();// cn/servlet/IndexServlet/test /*2.解析url----------------- 1.根据url找到我们要执行的方法在哪一个类中, 2.找到url的最后一个/后面的值,确定具体执行方法,通过反射去执行 */ //得到全限定类名 String className=allPath.substring(1,allPath.lastIndexOf("/")).replace("/","."); //得到全限定类名 String methodName=allPath.substring(allPath.lastIndexOf("/")+1); String url; try { //得到要执行的方法的所在类 Class<?> cls = Class.forName(className); //得到具体方法 Method method = cls.getMethod(methodName); //执行具体方法,返回值即为所要跳转的页面名称 url = (String) method.invoke(cls.newInstance()); } catch (Exception e) { //报错跳转错误页面 url=this.ERROR_PAGE; e.printStackTrace(); } //最后进行页面跳转 request.getRequestDispatcher(this.PREFIX+url+this.SUFFIX).forward(request,response); } }

    IndexServlet 类:

    package cn.servlet; public class IndexServlet extends DispatchServlet { public String test(){ System.out.println("test--------------->"); return "show"; } }

    index.jsp

    <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>$Title$</title> </head> <body> <a href="/cn/servlet/IndexServlet/test">testSeltDispatchServlet</a> </body> </html>

    tip:项目部署时未加项目名,如果有项目名,url解析,需去除项目名 简单总结一下:灵活使用java反射机制可以做很多事情,下课

    Processed: 0.011, SQL: 8