用原生 JDK 撸一个 MVC 框架
在这里,就不详细谈相关的原理和实现细节了,感兴趣的话,可以读一下这方面的书籍。
我在网上看到一篇不错的关于讲述怎么实现一个 MVC 框架的文章,在此,分享给各位读者,也许能帮助到你。
原文内容如下。
我今天主要带大家实现一个迷你版的 Spring MVC ,本项目将在一个干净的 web 工程开发,不引入 Spring,完全通过原生 JDK 来实现。
具体的工程代码结构如下图。
相关代码说明:
-
在 annotation 包下,我将提供自定义的注解,为了方便理解,会与 Spring MVC 保持一致。
-
为了模拟 Spring MVC 的方法调用链,我这里提供 Controller/Service/Dao 层进行测试。
-
提供自定义的 DispatcherServlet 来完成核心逻辑处理。
一、自定义注解
先给各位读者解释一下 JDK 提供了几个元注解:
-
@Documented : JavaDoc文档
-
@Target:标志此注解可以修饰在哪些地方,类,成员变量,方法...
-
@Retention:Annotation的生命周期,一般情况下,我们自定义注解的话,显然需要在运行期获取注解的一些信息。
我这边自定义的注解主要是模拟 Spring MVC ,具体实现如下。
1、@Controller提供控制器
2、@Qualifier提供依赖注入
3、@RequestMapping提供URL地址处理映射
4、Dao层注解
5、Service层注解
二、核心控制器
在 Spring MVC 中,DispatcherServlet 是核心类,下面我的代码主要用来实现它。首先来说,Spring MVC 中的 DispatcherServlet 说到底,还是 HttpServlet 的子类,因此我这边自定义的 DispatcherSerlvet 也需要继承 HttpServlet。
1、pom.xml 加入 servlet 依赖
2、定义 DispatcherServlet
代码中的 @WebServlet 用处是什么呢?其实,以前我们定义一个 Servlet ,需要在 web.xml 中去配置,不过在 Servlet 3.0 后出现了基于注解的 Servlet 。
仔细观察,你会发现,这个 DispatcherServlet 是自启动,而且传入了一个参数。
要知道,在 Spring MVC 中,要想基于注解,需要在配置中指明扫描的包路径,就像这个样子。
为了方便,我这里就通过初始化参数直接将需要扫描的基包路径传入。
a、初始化流程
-
我们应该去扫描基包下的类,得到信息 A。
-
对于 @Controller/@Service/@Repository 注解而言,我们需要拿到对应的名称,并初始化它们修饰的类,形成映射关系 B。
-
我们还得扫描类中的字段,如果发现有 @Qualifier 的话,我们需要完成注入。
-
我们还需要扫描 @RequestMapping,完成 URL 到某一个 Controller 的某一个方法上的映射关系 C。
其实,Spring MVC 的处理流程,就是类似这样的!
b、扫描基包
注意,基包是 X.Y.Z 的形式,而 URL 是 X/Y/Z 的形式,需要转换。
c、实例化
从这里你可以看出,我们完成了被注解标注的类的实例化,以及和注解名称的映射。
d、依赖注入
以前,我们总是说Spring IOC,上面不就是在做这个事情么?e、URL映射处理
我们需要把 URL 提取出来,映射到 Controller 的 Method 上。f、doGet/doPost
在 doPost 方法中,非常简单,我们只需要提取出 URL,通过 URL 映射到Method 上,然后通过反射的方式进行调用即可。
三、让它跑起来
1、Controller层
2、Service层
3、Dao层
4、运行结果
到这里,一个迷你版的 Spring MVC 就开发完成了。
原文发布时间为: 2018-10-21
本文作者:Java面试那些事儿
本文来自云栖社区合作伙伴“Java面试那些事儿”,了解相关信息可以关注“Java面试那些事儿”。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
c#开发移动APP-Xamarin入门扩展剖析
原文: c#开发移动APP-Xamarin入门扩展剖析 上节将Phoneword应用程序扩展到包含第二个屏幕,该屏幕可以跟踪应用程序的拨打历史 Navigation Xamarin.Form提供了一个内置的导航模型,用于管理一堆页面的导航和用户体验,这个模型实现了Page对象的后进先出(LIFO)堆栈,要从一个页面移动到另一个页面,应用程序将把一个新页面推到这个堆栈上,要返回到前一个页面,应用程序将从堆栈中弹出当前页面。 Xamarin.Forms有一个NavigationPage类,用于管理Page对象的堆栈,NavigationPage类还将在页面顶部添加一个导航栏,该栏将显示标题和与平台相匹配返回到前一个页面回退按钮,下面的代码示例展示了如何用NavigationPage包裹应用程序的第一个页面。 public App () { ... MainPage = new NavigationPage (new MainPage ()); } 所有ContentPage实例都有一个Navigation属性,该属性公开了修改页面堆栈的方法。只有当应用程序包含NavigationPage时...
- 下一篇
干货分享|Java异常经典14问,你都能答对吗?
1、什么是Java中的异常? 异常是在程序执行期间可能发生的错误事件,并且会中断它的正常流程。异常可能来自不同类型的情况,例如用户输入的错误数据,硬件故障,网络连接故障等。 每当执行java语句时发生任何错误,都会创建一个异常对象,然后JRE会尝试查找异常处理程序来处理异常。如果找到合适的异常处理程序,则将异常对象传递给处理程序代码以处理异常,称为捕获异常。如果未找到处理程序,则应用程序将异常抛出到运行时环境,JRE将终止该程序。 Java异常处理框架仅用于处理运行时错误,编译时错误不由异常处理框架处理。 2、Java中的异常处理关键字是什么? java异常处理中使用了四个关键字。 throw:有时我们明确要创建异常对象然后抛出它来停止程序的正常处理。throw关键字用于向运行时抛出异常来处理它。 throws:当我们在方法中抛出任何已检查的异常而不处理它时,我们需要在方法签名中使用throws关键字让调用者程序知道该方法可能抛出的异常。调用方法可以处理这些异常或使用throws关键字将其传播给它的调用方法。我们可以在throws子句中提供多个异常,也可以与main()方法一起使用。 ...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
-
Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8编译安装MySQL8.0.19
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
推荐阅读
最新文章
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS6,CentOS7官方镜像安装Oracle11G
- SpringBoot2整合Redis,开启缓存,提高访问速度
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Hadoop3单机部署,实现最简伪集群
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果