自己写一个java的mvc框架吧(一)
自己写一个mvc框架吧(一)
目录
写之前的一些废话
废话 1 (总是要先随便说点啥)
写了好几年的java程序,基本上每个项目都有用到mvc的框架,可能是spring mvc也可能是struts。这些框架怎么用相信大家也都很熟悉了,但是有没有想过自己写一个属于自己的mvc的框架呢?有没有想过为啥你请求一个http的地址,你的一个class里的方法就能被执行了呢?现在咱们开始写一个mvc框架吧。
因为2年前自己写过一个mvc的框架,比较烂,但是也能用。所以大致需要的知识点我写在下面,再写一个应该也还是这些东西。
反射
基本上要写点框架性质的代码就都需要用到反射的知识。
json,xml之类的配置文件的解析
或多或少都可能需要一点。
注解方面的
如果不想使用配置文件的话,自定义注解是肯定要有的。
servlet
因为http的入口就是这一个,肯定要用到。如果你要是要用filter,那你就要比较熟悉filter。
asm
这个是因为要获取方法上的参数名称,使用反射取参数名称一般都是arg0,arg1这样的,除非有特别的配置。
别的应该没了
废话 2 (大致的一个步骤)
大致说一下要写一个mvc咱们都需要干点啥。
第一步 创建一个映射关系
你需要一个 地址和一个方法的映射(这个地址可是一个http的地址,也可以单纯的就是一个随意的字符串或者别的东西,因为这里写的是mvc框架,所以就确定它是一个http的请求地址)。
这个映射关系可以先用一个java对象保存起来,之后我们可以根据不同的形式来获取到这些数据并填充这个对象。这些数据或许是通过注解,或许是xml文件,也可能是json文件来得到,只需要根据不同的形式来写不同的实现代码就好了,最终只要获取到这个映射关系就好。
第二步 获取方法的详细信息
请求地址与方法的映射创建完成之后,我们需要知道这个方法里面都有那些参数,每个参数的名称和参数类型是什么。
这是使用了asm框架。不了解的的同学可以搜一下,他是一个处理java字节码的工具,各大知名框架里都有用到,非常强大。我在这里用这个的主要原因是使用它获取方法的参数名称,因为反射的话没有特殊配置是取不到正确的名称的,但是我又不想有特殊配置~~~
第三步 获取并转换请求参数
因为我们是通过http请求来调用java的方法,所以我们要把http请求中的参数取出来并转换成为对应方法中实际的参数类型。比如一个方法的入参是 两个int类型的数据,我们就要将http请求中的String类型的数据转换成为int类型。
这一步我们不需要先直接处理http的请求,先用一些String类型的数据做一些测试即可。处理http请求的地方可以在后面再写。
第四步 使用反射执行方法
这里没什么好说的,反射中的知识点。
第五步 写一个http请求的入口,并加一些配置
这里开始写一个请求的入口了,spring使用的入口是一个 servlet,struts用的是一个filter,我在这里也用一个servlet。
这里我们需要定义一个配置文件,用来描述上面的映射关系。如果要使用注解的形式,还要自定义一些注解,并写一个包扫描的来处理这些注解。总之就是要吧上面定义的 请求地址与方法映射 的这个对象数据填充起来。
然后将每次请求过来之后,根据不同的请求路径,获取其映射的方法。之后执行这个方法。
第六步 处理执行后的结果。
这里可能有点麻烦,因为要能适应到不同的视图解析之类的,可能是jsp,freemarker,或者别的啥的。需要好好设计一下代码。
因为我自己还没有写到,所以先打算以字符串形式直接返回。
废话 3 (再说点啥)
这个东西我刚开始写,代码在:https://github.com/hjx601496320/aMvc 。
至于什么时候写完?这个就要看公司里忙不忙了,但是基本上能保证这个是能写完的。
博客的话一般我是自己先写一部分代码,然后在根据写代码的思路写一点博客,可能写着写着就和之前的不太一样了。不过我尽量吧我自己的思路说清楚。
废话说完了
现在就开始写吧~
嗯。下一篇开始具体更新每一步怎么写。
自己写一个java的mvc框架吧(一)的更多相关文章
- 自己写一个java的mvc框架吧(五)
自己写一个mvc框架吧(五) 给框架添加注解的支持 一段废话 上一章本来是说这一章要写视图处理的部分,但是由于我在测试代码的时候需要频繁的修改配置文件,太麻烦了.所以这一章先把支持注解的功能加上,这样 ...
- 自己写一个java的mvc框架吧(四)
自己写一个mvc框架吧(四) 写一个请求的入口,以及初始化框架 上一章写了获取方法的入参,并根据入参的参数类型进行数据转换.这时候,我们已经具备了通过反射调用方法的一切必要条件.现在我们缺少一个htt ...
- 自己写一个java的mvc框架吧(三)
自己写一个mvc框架吧(三) 根据Method获取参数并转换参数类型 上一篇我们将url与Method的映射创建完毕,并成功的将映射关系创建起来了.这一篇我们将根据Method的入参参数名称.参数类型 ...
- 自己写一个java的mvc框架吧(二)
自己写一个mvc框架吧(二) 自己写代码的习惯 写一个框架吧,如果这个框架会用到一些配置上的东西,我自己习惯是先不用考虑这个配置文件应该是怎样的,什么形式的,先用一个java对象(比如叫 Config ...
- 自己动手写一个简单的MVC框架(第一版)
一.MVC概念回顾 路由(Route).控制器(Controller).行为(Action).模型(Model).视图(View) 用一句简单地话来描述以上关键点: 路由(Route)就相当于一个公司 ...
- 自己动手写一个简单的MVC框架(第二版)
一.ASP.NET MVC核心机制回顾 在ASP.NET MVC中,最核心的当属“路由系统”,而路由系统的核心则源于一个强大的System.Web.Routing.dll组件. 在这个System.W ...
- AsMVC:一个简单的MVC框架的Java实现
当初看了<从零开始写一个Java Web框架>,也跟着写了一遍,但当时学艺不精,真正进脑子里的并不是很多,作者将依赖注入框架和MVC框架写在一起也给我造成了不小的困扰.最近刚好看了一遍sp ...
- Summer——从头开始写一个简易的Spring框架
Summer--从头开始写一个简易的Spring框架 参考Spring框架实现一个简易类似的Java框架.计划陆续实现IOC.AOP.以及数据访问模块和事务控制模块. ...
- 用Python写一个简单的Web框架
一.概述 二.从demo_app开始 三.WSGI中的application 四.区分URL 五.重构 1.正则匹配URL 2.DRY 3.抽象出框架 六.参考 一.概述 在Python中,WSGI( ...
随机推荐
- linux中权限
$ ls -l /bin/bash -rwxr-xr-x 1 root wheel 430540 Dec 23 18:27 /bin/bash -rwxr-xr-x 包含该特殊文件的权限的符号表示.该 ...
- 【ZOJ2314】Reactor Cooling(有上下界的网络流)
前言 话说有上下界的网络流好像全机房就我一个人会手动滑稽,当然这是不可能的 Solution 其实这道题目就是一道板子题,主要讲解一下怎么做无源无汇的上下界最大流: 算法步骤 1.将每条边转换成0~u ...
- Day 11 作业题
1.整理装饰器的形成过程,背诵装饰器的固定格式 固定格式 def wrapper(func): def inner(*args, **kwargs): #执行函数前进行的操作 ret = func(* ...
- OpenVswitch mirror 镜像功能
# 从int-br-eth1进入的包镜像一份给dummy0 # 现象:dummy0 可以抓到 int-br-eth1 进入的包 modprobe dummy ip link set up dummy0 ...
- python salt 实现windows账户自动化
import random import string import json import logging import time import os import sys def usage(): ...
- poj1953 World Cup Noise
http://poj.org/problem?id=1953 题目大意:给定一个正整数n,确定该长度的不同吟唱模式的数量,即确定不包含相邻1的n位序列的数目.例如,对于n = 3,答案是5 (序列00 ...
- webpack快速入门——Json配置文件使用
在实际工作中,我们的项目都会配置一个Json的文件或者说API文件,作为项目的配置文件. 有时候你也会从后台读取到一个json的文件,这节课就学习如何在webpack环境中使用Json. 如果你会we ...
- JS:事件委托
事件委托 事件流 事件流描述的是从页面中接收事件的顺序.---JS高级程序设计(第3版) DOM Level 2 Events规定的事件流有三个阶段:①事件捕获阶段.②处于目标阶段.③事件冒泡阶段 事 ...
- 【xsy1378】 水题7号 贪心
题目大意:有$m$组约束关系$(x_i,y_i)$,你要构造一个排列,满足数$x_i$出现在数$y_i$前面,请使得这个排列字典序最小,请输出这个排列.无解请输出-1. 数据范围:$n,m≤10^5$ ...
- 【BZOJ3992】【SDOI2015】序列统计 EGF+多项式快速幂+循环卷积
如果是求$n$个数之和在模$m$意义下为$x$,那么做法是显然的. 但是这道题问的是$n$个数之积在模m意义下为$x$,那么做法就和上面的问题不同. 考虑如何把乘法转换成加法(求log): 题目中有一 ...