关于java的mvc框架层出不穷,可能大家都会用,但是具体的原理知道不知道呢。所以我想写一个写一个简单mvc的系列博客,主要面向想了解这些原理的。

其实所谓的mvc框架,基本都是一个原理,就是配置一个filter或者servlet来拦截所有的请求,然后转发请求。

这个图就能说明mvc的工作模式

1.首先页面发送一个post请求,请求到某一个action。

2.然后由servlet或filter进行拦截,拦截固定后缀的请求,比如*.action,这里比如我们发送的请求是UserAction.action,servlet或filter就会拦截下来,然后在servlet里进行封装,转发到某一个action里。处理完毕后,再通过拦截器进行转发,回到配置好的页面。

下面是一个struts2的配置文件(网上找的)。


    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <web-app id="WebApp_9" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
    3. <display-name>Struts Blank</display-name>
    4. <filter>
    5. <!-- 配置Struts2核心Filter的名字 -->
    6. <filter-name>struts2</filter-name>
    7. <!-- 配置Struts2核心Filter的实现类 -->
    8. <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
    9. <init-param>
    10. <!-- 配置Struts2框架默认加载的Action包结构,可以没有。 -->
    11. <param-name>actionPackages</param-name>
    12. <param-value>org.apache.struts2.showcase.person</param-value>
    13. </init-param>
    14. <!-- 配置Struts2框架的配置提供者类 -->
    15. <init-param>
    16. <param-name>configProviders</param-name>
    17. <param-value>lee.MyConfigurationProvider</param-value>
    18. </init-param>
    19. </filter>
    20. <!-- 配置Filter拦截的URL -->
    21. <filter-mapping>
    22. <!-- 配置Struts2的核心FilterDispatcher拦截所有用户请求 -->
    23. <filter-name>struts2</filter-name>
    24. <url-pattern>/*</url-pattern>
    25. </filter-mapping>
    26. <welcome-file-list>
    27. <welcome-file>index.html</welcome-file>
    28. </welcome-file-list>
    29. </web-app>
 

这里的org.apache.struts2.dispatcher.FilterDispatcher就是图中第2步中的拦截器。由于我没看源码,所以就大概说一下这个拦截器在中间都做了什么动作。

1.拦截从页面发来的请求。假设这里的请求是 UserAction.action

2.然后拦截器会读取框架配置文件,找到UserAction这个类

3.找到这个类以后,利用java的反射原理,封装请求发来的参数

4.把封装好的参数转发给UserAction

5.UserAction执行其中的逻辑,返回一个值,根据这个值,由拦截器转发执行完毕的结果,跳到制定页面。

这大概就是一个mvc框架的流程。可见并不复杂,所以我就打算写一个简单的框架,来详细的带大家理解mvc。

写这个mvc主要就是用到了java的反射原理,像第2步中,怎么找到把请求转发给哪个类?第3步中的怎么把页面的数据进行封装?还有第5步中怎么根据值确定返回哪个页面?

这些基本都是用的java反射原理。

在我写的这个mvc框架中,我是用的注解配置,所以这里还设计到自定义注解。当然你也可以自己定制通过xml来配置你的mvc框架。

基本原理都是相同的。

下一篇文章我将讲解一下其中的基础知识。也就是java反射跟自定义注解以及他们在mvc框架中的应用。

其实本来想录个视频跟大家讲解的,又怕没多少人看,到时候就白费力气了。所以就写博客吧,当一个自己的积累。

如果有错误,请大家指出,谢谢!

大家一起写mvc(一)的更多相关文章

  1. 60行以内写mvc

    标题党.几天前看到一个30行写mvc的文章,东施效颦,也动手写了个60行的,功能上略微扩充一些,记录下来,后面有时间可以继续优化. mvc其实是一个观察者模式.view来监听model,所以当mode ...

  2. 大家一起写mvc(三)_结束

    上一篇介绍到要写mvc的所用的核心技术,这一篇我们就开始真正的开始写mvc,其实就是把昨天写过的代码进行一些组装就可以了. 我们用eclipse新建一个web项目.然后web.xml如下 <?x ...

  3. 大家一起写mvc(二)

    上一篇已经看了,我想大家都明白了mvc的原理,今天我们来说一下要写自己mvc框架必须要会的技术. mvc的目录是这样的 src目录是我们核心的mvc代码.这个代码明天讲,今天主要讲的代码都在test目 ...

  4. 手写MVC框架(一)-再出发

    背景 前段时间把之前写的DAO框架(手写DAO框架(一)-从“1”开始)整理了一下,重构了一版.整理过程中看以前写的代码,只是为了了解实现,只是为了实现,代码写的有点粗糙.既然已经整理了DAO框架,索 ...

  5. 手写MVC框架(二)-代码实现和使用示例

    --------上一篇:手写MVC框架(一)-再出发----- 背景 书接上文,之前整理了实现MVC框架需要写哪些东西.这周粗看了一下,感觉也没多少工作量,所以就计划一天时间来完成.周末的时间,哪会那 ...

  6. 源码分析系列 | 从零开始写MVC框架

    1. 前言 2. 为什么要自己手写框架 3. 简单MVC框架设计思路 4. 课程目标 5. 编码实战 5.1 配置阶段 web.xml配置 config.properties 自定义注解 5.2 初始 ...

  7. 基于j2ee的程序代写MVC架构

    人力资源管理系统 完成系统静态页面设计,页面数量不少于10个,页面需用CSS进行美化,并为需要验证的信息利用JavaScript提供客户端验证.要求至少包含部门信息及部门内员工信息的添加.修改.删除和 ...

  8. 使用C#写MVC框架(一:核心原理)

    目录: 一.MVC原理解析 二.HttpHandler 1.HttpHandler,IHttpHandler,MvcHandler的说明 2.IHttpHandler解析 3.MvcHandler解析 ...

  9. 我的代码,写的pagebase。还是留着吧。语义化,与我的云平台一样,只不过云平台是用js写的。这个是webform.下回写mvc吧。核心很简单。

    Ps:记一下用的时候,一不小心我手贱碰到的问题吧:我在页面里面加上了form runat=server,然后所有的html控件就再也找不着了.就是下面的control collection这里,如果加 ...

随机推荐

  1. Java 基础知识总结 (一、标识符)

    一.Identifiers: 标识符 Names of class,method and variable 用于类名.方法名.变量名 Begin with character,'_' or '$' 标 ...

  2. Deep Learning(1)-Introduction学习总结

    学习DL搁置很久了,终于下定决心开始咯~~ Deep Learning(Ian Goodfellow&&Yoshua Bengio&&Aaron Courville)- ...

  3. 如何在asp.net中使用多线程及队列,异步处理一个耗时的任务(原创)

    最近想在使用.net 的队列处理一些耗时的工作.经过考虑,需要先设计一个类,类中包含一个静态的队列.主要是写队列和读取队列. public class PaperCalculator { // 用于存 ...

  4. IT公司笔试题(一)

    1.  已知一个递归算法的算法复杂度计算公式为T(n) = T(n/2) + n,则T(n)的算法复杂度为多少? 解:O(n) T(n) = T(n/2) + n = T(n/4) + n/2 + n ...

  5. python 高阶函数与装饰器

    高阶函数定义1.函数接收的参数是一个函数名2.函数的返回值是一个函数名以上两者满足任意一个,就是高阶函数装饰器定义本质就是函数,功能是为其他函数添加新功能 装饰器的原则 1.不修改被装饰函数的源代码( ...

  6. 0909 45作业one

    1.编译原理学什么? 答: 初遇编译原理,我知道编译原理是计算机专业设置的一门重要的专业课程,主要是介绍编译程序构造的一般原理和基本方法.其内容大概包括语言和文法.词法分析.语法分析.语法制导翻译.中 ...

  7. 【Java学习笔记】Map

    Map: 一次添加一对元素,也称为双列集合. 而Collection,一次添加一个元素,称为单列集合. 常用方法: 1.添加 value  put(key,value);        返回前一个与k ...

  8. 【模板】【转载】区间dp

    区间动态规划问题一般都是考虑,对于每段区间,他们的最优值都是由几段更小区间的最优值得到,是分治思想的一种应用,将一个区间问题不断划分为更小的区间直至一个元素组成的区间,枚举他们的组合 ,求合并后的最优 ...

  9. Python 2 —— 基本数据类型及其运算

    基本运算 一.数字 **表示乘方运算 12 / 3 = 4.0浮点数 12 // 3 = 4整数 二.字符串 1.表示 单行:'...'或者"..." 多行:'''...'''或者 ...

  10. (转) 在C#用HttpWebRequest中发送GET/HTTP/HTTPS请求

    转自:http://blog.csdn.net/zhoufoxcn/article/details/6404236 通用辅助类 下面是我编写的一个辅助类,在这个类中采用了HttpWebRequest中 ...