# mywebmvc **Repository Path**: wisdomwz/mywebmvc ## Basic Information - **Project Name**: mywebmvc - **Description**: 自己实现一个极简版springmvc - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2018-07-17 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ##极简版springmvc框架 ##整个框架的核心是`com.wisdom.servlet.MyDispatcherServlet`这个自定义前端控制器类 核心是以下两个方法: 1、init方法中定义了初始化的相关信息,包括加载配置文件-->扫描指定的类-->通过反射实例化-->将访问url与method映射 ```$xslt @Override public void init(ServletConfig config) throws ServletException { //1.加载配置文件,即application.properties doLoadConfig(config.getInitParameter("contextConfigLocation").replace("*", "") .replace("classpath:", "")); //2.初始化所有相关联的类,扫描用户设定的包下面所有的类 doScanner(properties.getProperty("scanPackage")); //3.拿到扫描到的类,通过反射机制,实例化,并且放到ioc容器中(k-v beanName-bean) beanName默认是首字母小写 doInstance(); //4.初始化HandlerMapping(将url和method对应上) initHandlerMapping(); } ``` 2、doDispatch方法定义了请求的路径及参数如何与方法一一对应 ```$xslt private void doDispatch(HttpServletRequest req, HttpServletResponse resp) throws Exception { if (handlerMapping.isEmpty()) { return; } String url = req.getRequestURI(); String contextPath = req.getContextPath(); url = url.replace(contextPath, "").replaceAll("/+", "/"); if (!this.handlerMapping.containsKey(url)) { resp.getWriter().write("404 NOT FOUND!"); return; } Method method = this.handlerMapping.get(url); //获取方法的参数列表 Class[] parameterTypes = method.getParameterTypes(); //获取请求的参数 Map parameterMap = req.getParameterMap(); //保存参数值 Object[] paramValues = new Object[parameterTypes.length]; //方法的参数列表 for (int i = 0; i < parameterTypes.length; i++) { //根据参数名称,做某些处理 String requestParam = parameterTypes[i].getSimpleName(); if (requestParam.equals("HttpServletRequest")) { //参数类型已明确,这边强转类型 paramValues[i] = req; continue; } if (requestParam.equals("HttpServletResponse")) { paramValues[i] = resp; continue; } if (requestParam.equals("String")) { for (Map.Entry param : parameterMap.entrySet()) { String value = Arrays.toString(param.getValue()).replaceAll("\\[|\\]", "").replaceAll(",\\s", ","); paramValues[i] = value; } } } //利用反射机制来调用 try { //第一个参数是method所对应的实例 在ioc容器中 method.invoke(this.controllerMap.get(url), paramValues); } catch (Exception e) { e.printStackTrace(); } } ``` 如何运行: 将项目clone到IDE中,使用tomcat运行即可。 **欢迎指正。**