├── .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
--------------------------------------------------------------------------------