├── .classpath ├── .project ├── .settings ├── .jsdtscope ├── org.eclipse.jdt.core.prefs ├── org.eclipse.wst.common.component ├── org.eclipse.wst.common.project.facet.core.xml ├── org.eclipse.wst.jsdt.ui.superType.container └── org.eclipse.wst.jsdt.ui.superType.name ├── README.md ├── WebContent ├── META-INF │ └── MANIFEST.MF └── WEB-INF │ ├── lib │ └── log4j-1.2.17.jar │ └── web.xml ├── build └── classes │ ├── application.properties │ ├── com │ ├── myspringframework │ │ └── core │ │ │ ├── annotation │ │ │ ├── MyAutowired.class │ │ │ ├── MyController.class │ │ │ ├── MyRequestMapping.class │ │ │ ├── MyRequestParam.class │ │ │ └── MyService.class │ │ │ └── servlet │ │ │ └── MyDispatcherServlet.class │ └── test │ │ ├── controller │ │ └── DemoController.class │ │ └── service │ │ ├── IDemoService.class │ │ └── impl │ │ └── DemoService.class │ └── log4j.properties ├── imgs ├── QQ截图20190323195659.png ├── QQ截图20190329140948.png ├── QQ截图20190329141007.png └── QQ截图20190329141748.png └── src ├── application.properties ├── com ├── myspringframework │ └── core │ │ ├── annotation │ │ ├── MyAutowired.java │ │ ├── MyController.java │ │ ├── MyRequestMapping.java │ │ ├── MyRequestParam.java │ │ └── MyService.java │ │ └── servlet │ │ └── MyDispatcherServlet.java └── test │ ├── controller │ └── DemoController.java │ └── service │ ├── IDemoService.java │ └── impl │ └── DemoService.java └── log4j.properties /.classpath: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /.project: -------------------------------------------------------------------------------- 1 | 2 | 3 | MySpringFramework 4 | 5 | 6 | 7 | 8 | 9 | org.eclipse.jdt.core.javabuilder 10 | 11 | 12 | 13 | 14 | org.eclipse.wst.common.project.facet.core.builder 15 | 16 | 17 | 18 | 19 | org.eclipse.wst.validation.validationbuilder 20 | 21 | 22 | 23 | 24 | 25 | org.eclipse.jem.workbench.JavaEMFNature 26 | org.eclipse.wst.common.modulecore.ModuleCoreNature 27 | org.eclipse.wst.common.project.facet.core.nature 28 | org.eclipse.jdt.core.javanature 29 | org.eclipse.wst.jsdt.core.jsNature 30 | 31 | 32 | -------------------------------------------------------------------------------- /.settings/.jsdtscope: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /.settings/org.eclipse.jdt.core.prefs: -------------------------------------------------------------------------------- 1 | eclipse.preferences.version=1 2 | org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled 3 | org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 4 | org.eclipse.jdt.core.compiler.compliance=1.8 5 | org.eclipse.jdt.core.compiler.problem.assertIdentifier=error 6 | org.eclipse.jdt.core.compiler.problem.enumIdentifier=error 7 | org.eclipse.jdt.core.compiler.source=1.8 8 | -------------------------------------------------------------------------------- /.settings/org.eclipse.wst.common.component: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /.settings/org.eclipse.wst.common.project.facet.core.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /.settings/org.eclipse.wst.jsdt.ui.superType.container: -------------------------------------------------------------------------------- 1 | org.eclipse.wst.jsdt.launching.baseBrowserLibrary -------------------------------------------------------------------------------- /.settings/org.eclipse.wst.jsdt.ui.superType.name: -------------------------------------------------------------------------------- 1 | Window -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 手写SpringMVC 2 | ## 概述: 3 | 本项目是为了探究SpringMVC底层原理,在学习之余自己实现了一个乞丐版SpringMVC。 4 | ## 功能实现: 5 | 1.项目紧依赖于log4j日志包
6 | 2.实现了RequestMapping、Controller、Service、Autowired注解。
7 | 3.在配置文件中配置扫描包路径。
8 | 4.实现了url到method的映射。
9 | 5.对不存在页面的404处理,页面异常的500处理
10 | ## 功能展示: 11 | ### 这是项目结构: 12 | 13 |
14 | 15 | ### web.xml: 16 | 17 |
18 | 19 | ### 访问http://localhost/MySpringFramework/demo/query?name=123: 20 | 21 |
22 | 23 | ### 后台日志输出: 24 | 25 |
26 | 27 | 28 | -------------------------------------------------------------------------------- /WebContent/META-INF/MANIFEST.MF: -------------------------------------------------------------------------------- 1 | Manifest-Version: 1.0 2 | Class-Path: 3 | 4 | -------------------------------------------------------------------------------- /WebContent/WEB-INF/lib/log4j-1.2.17.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FurionZG/MySpringFramework/b5ca0b648872dc0416334ccbf1078afdc2346723/WebContent/WEB-INF/lib/log4j-1.2.17.jar -------------------------------------------------------------------------------- /WebContent/WEB-INF/web.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | myspring 8 | com.myspringframework.core.servlet.MyDispatcherServlet 9 | 10 | contextConfigLocation 11 | application.properties 12 | 13 | 14 | 15 | myspring 16 | /* 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /build/classes/application.properties: -------------------------------------------------------------------------------- 1 | scanPackege=com.test -------------------------------------------------------------------------------- /build/classes/com/myspringframework/core/annotation/MyAutowired.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FurionZG/MySpringFramework/b5ca0b648872dc0416334ccbf1078afdc2346723/build/classes/com/myspringframework/core/annotation/MyAutowired.class -------------------------------------------------------------------------------- /build/classes/com/myspringframework/core/annotation/MyController.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FurionZG/MySpringFramework/b5ca0b648872dc0416334ccbf1078afdc2346723/build/classes/com/myspringframework/core/annotation/MyController.class -------------------------------------------------------------------------------- /build/classes/com/myspringframework/core/annotation/MyRequestMapping.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FurionZG/MySpringFramework/b5ca0b648872dc0416334ccbf1078afdc2346723/build/classes/com/myspringframework/core/annotation/MyRequestMapping.class -------------------------------------------------------------------------------- /build/classes/com/myspringframework/core/annotation/MyRequestParam.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FurionZG/MySpringFramework/b5ca0b648872dc0416334ccbf1078afdc2346723/build/classes/com/myspringframework/core/annotation/MyRequestParam.class -------------------------------------------------------------------------------- /build/classes/com/myspringframework/core/annotation/MyService.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FurionZG/MySpringFramework/b5ca0b648872dc0416334ccbf1078afdc2346723/build/classes/com/myspringframework/core/annotation/MyService.class -------------------------------------------------------------------------------- /build/classes/com/myspringframework/core/servlet/MyDispatcherServlet.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FurionZG/MySpringFramework/b5ca0b648872dc0416334ccbf1078afdc2346723/build/classes/com/myspringframework/core/servlet/MyDispatcherServlet.class -------------------------------------------------------------------------------- /build/classes/com/test/controller/DemoController.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FurionZG/MySpringFramework/b5ca0b648872dc0416334ccbf1078afdc2346723/build/classes/com/test/controller/DemoController.class -------------------------------------------------------------------------------- /build/classes/com/test/service/IDemoService.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FurionZG/MySpringFramework/b5ca0b648872dc0416334ccbf1078afdc2346723/build/classes/com/test/service/IDemoService.class -------------------------------------------------------------------------------- /build/classes/com/test/service/impl/DemoService.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FurionZG/MySpringFramework/b5ca0b648872dc0416334ccbf1078afdc2346723/build/classes/com/test/service/impl/DemoService.class -------------------------------------------------------------------------------- /build/classes/log4j.properties: -------------------------------------------------------------------------------- 1 | ### 设置### 2 | log4j.rootLogger = debug,stdout,D,E 3 | 4 | ### 输出信息到控制抬 ### 5 | log4j.appender.stdout = org.apache.log4j.ConsoleAppender 6 | log4j.appender.stdout.Target = System.out 7 | log4j.appender.stdout.layout = org.apache.log4j.PatternLayout 8 | log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n 9 | 10 | ### 输出DEBUG 级别以上的日志到=E://logs/error.log ### 11 | log4j.appender.D = org.apache.log4j.DailyRollingFileAppender 12 | log4j.appender.D.File = E://logs/log.log 13 | log4j.appender.D.Append = true 14 | log4j.appender.D.Threshold = DEBUG 15 | log4j.appender.D.layout = org.apache.log4j.PatternLayout 16 | log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n 17 | 18 | ### 输出ERROR 级别以上的日志到=E://logs/error.log ### 19 | log4j.appender.E = org.apache.log4j.DailyRollingFileAppender 20 | log4j.appender.E.File =E://logs/error.log 21 | log4j.appender.E.Append = true 22 | log4j.appender.E.Threshold = ERROR 23 | log4j.appender.E.layout = org.apache.log4j.PatternLayout 24 | log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n -------------------------------------------------------------------------------- /imgs/QQ截图20190323195659.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FurionZG/MySpringFramework/b5ca0b648872dc0416334ccbf1078afdc2346723/imgs/QQ截图20190323195659.png -------------------------------------------------------------------------------- /imgs/QQ截图20190329140948.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FurionZG/MySpringFramework/b5ca0b648872dc0416334ccbf1078afdc2346723/imgs/QQ截图20190329140948.png -------------------------------------------------------------------------------- /imgs/QQ截图20190329141007.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FurionZG/MySpringFramework/b5ca0b648872dc0416334ccbf1078afdc2346723/imgs/QQ截图20190329141007.png -------------------------------------------------------------------------------- /imgs/QQ截图20190329141748.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FurionZG/MySpringFramework/b5ca0b648872dc0416334ccbf1078afdc2346723/imgs/QQ截图20190329141748.png -------------------------------------------------------------------------------- /src/application.properties: -------------------------------------------------------------------------------- 1 | scanPackege=com.test -------------------------------------------------------------------------------- /src/com/myspringframework/core/annotation/MyAutowired.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FurionZG/MySpringFramework/b5ca0b648872dc0416334ccbf1078afdc2346723/src/com/myspringframework/core/annotation/MyAutowired.java -------------------------------------------------------------------------------- /src/com/myspringframework/core/annotation/MyController.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FurionZG/MySpringFramework/b5ca0b648872dc0416334ccbf1078afdc2346723/src/com/myspringframework/core/annotation/MyController.java -------------------------------------------------------------------------------- /src/com/myspringframework/core/annotation/MyRequestMapping.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FurionZG/MySpringFramework/b5ca0b648872dc0416334ccbf1078afdc2346723/src/com/myspringframework/core/annotation/MyRequestMapping.java -------------------------------------------------------------------------------- /src/com/myspringframework/core/annotation/MyRequestParam.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FurionZG/MySpringFramework/b5ca0b648872dc0416334ccbf1078afdc2346723/src/com/myspringframework/core/annotation/MyRequestParam.java -------------------------------------------------------------------------------- /src/com/myspringframework/core/annotation/MyService.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FurionZG/MySpringFramework/b5ca0b648872dc0416334ccbf1078afdc2346723/src/com/myspringframework/core/annotation/MyService.java -------------------------------------------------------------------------------- /src/com/myspringframework/core/servlet/MyDispatcherServlet.java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FurionZG/MySpringFramework/b5ca0b648872dc0416334ccbf1078afdc2346723/src/com/myspringframework/core/servlet/MyDispatcherServlet.java -------------------------------------------------------------------------------- /src/com/test/controller/DemoController.java: -------------------------------------------------------------------------------- 1 | package com.test.controller; 2 | 3 | import javax.servlet.http.HttpServletRequest; 4 | import javax.servlet.http.HttpServletResponse; 5 | 6 | import com.myspringframework.core.annotation.MyAutowired; 7 | import com.myspringframework.core.annotation.MyController; 8 | import com.myspringframework.core.annotation.MyRequestMapping; 9 | import com.myspringframework.core.annotation.MyRequestParam; 10 | import com.test.service.IDemoService; 11 | 12 | @MyController 13 | @MyRequestMapping("/demo") 14 | public class DemoController { 15 | @MyAutowired 16 | private IDemoService demoService; 17 | @MyRequestMapping("/query") 18 | public void query(HttpServletRequest req, HttpServletResponse resp, @MyRequestParam("name") String name) { 19 | String result = demoService.get(name); 20 | try { 21 | resp.getWriter().write(result); 22 | } catch (Exception e) { 23 | e.printStackTrace(); 24 | } 25 | } 26 | @MyRequestMapping("/add") 27 | public void add(HttpServletRequest req, HttpServletResponse resp, @MyRequestParam("name") String name) { 28 | String result = demoService.add(name); 29 | try { 30 | resp.getWriter().write(result); 31 | } catch (Exception e) { 32 | e.printStackTrace(); 33 | } 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/com/test/service/IDemoService.java: -------------------------------------------------------------------------------- 1 | package com.test.service; 2 | 3 | public interface IDemoService { 4 | public String get(String name); 5 | public String add(String name); 6 | } 7 | -------------------------------------------------------------------------------- /src/com/test/service/impl/DemoService.java: -------------------------------------------------------------------------------- 1 | package com.test.service.impl; 2 | 3 | import com.myspringframework.core.annotation.MyService; 4 | import com.test.service.IDemoService; 5 | @MyService 6 | public class DemoService implements IDemoService { 7 | 8 | public String get(String name) { 9 | return "My name is:" + name; 10 | } 11 | public String add(String name) { 12 | return "Add name:" + name; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/log4j.properties: -------------------------------------------------------------------------------- 1 | ### 设置### 2 | log4j.rootLogger = debug,stdout,D,E 3 | 4 | ### 输出信息到控制抬 ### 5 | log4j.appender.stdout = org.apache.log4j.ConsoleAppender 6 | log4j.appender.stdout.Target = System.out 7 | log4j.appender.stdout.layout = org.apache.log4j.PatternLayout 8 | log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n 9 | 10 | ### 输出DEBUG 级别以上的日志到=E://logs/error.log ### 11 | log4j.appender.D = org.apache.log4j.DailyRollingFileAppender 12 | log4j.appender.D.File = E://logs/log.log 13 | log4j.appender.D.Append = true 14 | log4j.appender.D.Threshold = DEBUG 15 | log4j.appender.D.layout = org.apache.log4j.PatternLayout 16 | log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n 17 | 18 | ### 输出ERROR 级别以上的日志到=E://logs/error.log ### 19 | log4j.appender.E = org.apache.log4j.DailyRollingFileAppender 20 | log4j.appender.E.File =E://logs/error.log 21 | log4j.appender.E.Append = true 22 | log4j.appender.E.Threshold = ERROR 23 | log4j.appender.E.layout = org.apache.log4j.PatternLayout 24 | log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n --------------------------------------------------------------------------------