`

自己写一个MVC框架(一)

 
阅读更多

MVC是三个单词的缩写,分别为: 模型(Model),视图(View)和控制(Controller)。

        
MVC模式如今大量应用与web开发中,其优势明显,收到了众多开发者的欢迎和支持,struts框架的核心架构也用到了MVC,既然MVC如此犀利,我们就应该深入理解其中的流程,而作为一个IT精英,我们肯定会想到看相关的源码,看完理解之后,我个人认为最高的境界就是自己写一个类似的框架出来,下面我就把自己理解编写的MVC框架分享给大家!


当然我现在采用的是struts1.X版本的思想!
  struts1.X中有两个 核心的配置:
  action和form-bean
  对应每个客户端页面,发送请求时都会把该页面的参数封装到一个form-bean中,这也就是form-bean的基本作用。
  action元素是用来配置业务Action类,在struts中充当控制器,原则上每个请求的路径都会被拦截到对应的action,并调用action中的某个方法。
  于是我仿制的struts.config 配置文件的格式就出来了,如下:
  1. <mvc-config>  
  2. <!-- form-beans标签只有一个 -->  
  3. <form-beans>  
  4. <!-- form-bean标签有多个 -->  
  5. <form-bean name="newsForm" type="net.localer.news.form.NewsForm"/>  
  6.   
  7. <form-bean name="userForm" type="net.localer.news.form.UserForm"/>  
  8.   
  9. </form-beans>  
  10.   
  11. <!-- action-mappings标签只有一个 -->  
  12. <action-mappings>  
  13. <!--   
  14. action元素:配置业务Action类  
  15.   
  16. path : 请求的路径  
  17.   
  18. type : 业务Action类的类路径  
  19.   
  20.  -->  
  21. <!-- action标签有多个 -->  
  22. <action path="/index" type="net.localer.news.action.NewsAction" name="newsForm"/>  
  23. <action path="/user" type="net.localer.news.action.UserAction" name="userForm"/>  
  24. </action-mappings>  
  25. </mvc-config>  

    看到这里很多人应该会知道其中的type属性将来会通过反射形成一个具体的object对象。当然配置文件出来了肯定就要与之相对应的bean类,否则是无法识别的,当然既然与配置文件对应,那bean类也相当的简单!如下:
  1. public class ActionConfig {  
  2. private String path;  
  3. private String type;  
  4. private String name;  
  5. public String getPath() {  
  6. return path;  
  7. }  
  8. public void setPath(String path) {  
  9. this.path = path;  
  10. }  
  11. public String getType() {  
  12. return type;  
  13. }  
  14. public void setType(String type) {  
  15. this.type = type;  
  16. }  
  17. public String getName() {  
  18. return name;  
  19. }  
  20. public void setName(String name) {  
  21. this.name = name;  
  22. }  
  23. }  

  1. public class FormBeanConfig {  
  2. private String name;  
  3. private String type;  
  4. public String getName() {  
  5. return name;  
  6. }  
  7. public void setName(String name) {  
  8. this.name = name;  
  9. }  
  10. public String getType() {  
  11. return type;  
  12. }  
  13. public void setType(String type) {  
  14. this.type = type;  
  15. }  
  16.   
  17. }  


配置文件里还可以看出 action 和 form 要通过name 关联起来。为什么要关联呢?之前说页面的请求封装到form里面 并且 请求会传到action 所以form也会要传给action 所以当请求发出的时候:首先根据请求路径找到对应的action 然后根据action里面name 找到对应的form,将form反射出来后 再传进 对应的action里面!

同时我们还需要一个类,这个类比较特殊


  1. /**  
  2.  *缓存所有已经读取到的ActionConfig对象  
  3.  *和FormBeanConfig对象  
  4.  *  
  5.  */  
  6. public class ActionMappingConfig {  
  7.   
  8. //actionInfo的key键是path  
  9. private Map<String,ActionConfig> actionInfo = null;  
  10.   
  11. //formbeanInfo中的key是name  
  12. private Map<String,FormBeanConfig> formbeanInfo = null;  
  13.   
  14.   
  15. public ActionMappingConfig(){  
  16. actionInfo = new Hashtable<String, ActionConfig>();  
  17. formbeanInfo = new Hashtable<String, FormBeanConfig>();  
  18. }  
  19.   
  20.   
  21. public void setActionConfig(ActionConfig config) {  
  22. actionInfo.put(config.getPath(), config);  
  23. }  
  24.   
  25.   
  26.   
  27. public ActionConfig getActionConfig(String path) {  
  28. return actionInfo.get(path);  
  29. }  
  30.   
  31. public void setFormBeanConfig(FormBeanConfig config) {  
  32. formbeanInfo.put(config.getName(), config);  
  33. }  
  34.   
  35. public FormBeanConfig getFormBeanConfig(String name) {  
  36. return formbeanInfo.get(name);  
  37. }  
  38. }  

运行的时候我们需要找一个类把所有的actionbean 和 formbean 缓存起来 ActionMappingConfig  类就是干这个的。
那么缓存是要缓存 可是怎么缓存起来呢 这就要用到另外一个类:XMLParser
代码如下:


  1. public class XMLParser {  
  2.   
  3. /**  
  4.  *   
  5.  * @param path XML文档的路径  
  6.  * @return 是一已经封装好XML信息的ActionMappingConfig对象  
  7.  */  
  8. public static ActionMappingConfig getActionMappingConfig(String path) {  
  9.   
  10. //1、构造SAX解析器  
  11. SAXReader reader = new SAXReader();  
  12.   
  13. //2、创建一个空的ActionMappingConfig对象  
  14. ActionMappingConfig config = new ActionMappingConfig();  
  15.   
  16.   
  17. try {  
  18.   
  19. //3、获得整个对象  
  20. Document doc = reader.read(path);  
  21.   
  22. //4、获得根元素  
  23. Element root = doc.getRootElement();  
  24.   
  25. //5、解析并封装FormBeanConfig的方法  
  26. formBeanParser(root,config);  
  27.   
  28. //6、解析并封装ActionConfig的方法  
  29. actionParser(root,config);  
  30. } catch (DocumentException e) {  
  31. e.printStackTrace();  
  32. }  
  33.   
  34. return config;  
  35. }  
  36.   
  37. /**  
  38.  *   
  39.  * @param root文档的根元素  
  40.  * @param config 空的ActionMappingConfig对象  
  41.  */  
  42. private static void formBeanParser(Element root, ActionMappingConfig config) {  
  43.   
  44. Element beans = root.element("form-beans");  
  45.   
  46. List<Element> list = beans.elements();  
  47.   
  48. for (Element e : list) {  
  49.   
  50. String name = e.attribute("name").getValue();  
  51. String type = e.attribute("type").getValue();  
  52.   
  53. //构建FormBeanConfig对象  
  54. FormBeanConfig formBean = new FormBeanConfig();  
  55.   
  56. formBean.setName(name);  
  57. formBean.setType(type);  
  58.   
  59. config.setFormBeanConfig(formBean);  
  60. }  
  61. }  
  62.   
  63. private static void actionParser(Element root, ActionMappingConfig config) {  
  64.   
  65. Element beans = root.element("action-mappings");  
  66. List<Element> list = beans.elements();  
  67. for (Element e : list) {  
  68.   
  69. String name = null;  
  70. if (null != e.attribute("name")) {  
  71. name = e.attribute("name").getValue();  
  72. }  
  73. String type = e.attribute("type").getValue();  
  74. String path = e.attribute("path").getValue();  
  75. ActionConfig action = new ActionConfig();  
  76. action.setName(name);  
  77. action.setPath(path);  
  78. action.setType(type);  
  79. config.setActionConfig(action);  
  80. }  
  81. }  
  82. }  

一看好像一个非常复杂的类 但是 一学就会 就是一个普通的解析xml的java代码,网上一搜一堆,不懂可以百度,在这不多浪费时间!

到这里我们已经完成了第一大步,把所有的基础config数据备好,
下面要进行的就是核心精髓的部分:action类,actionForm类,actionForward类等地编写!

8
5
分享到:
评论
5 楼 mazhiyuan 2012-02-13  
这个,有没有考虑多线程的问题啊,action类中存在成员变量,也不想是struts2那样的一个request就new一个action的模式
4 楼 lixinstudio 2011-12-04  
jyjava 写道
是李欣?O(∩_∩)O~

呵呵是立信
3 楼 KimHo 2011-12-01  
楼主应该模仿spring3mvc的思想,写个类似的框架
2 楼 jyjava 2011-12-01  
是李欣?O(∩_∩)O~
1 楼 奥义之舞 2011-12-01  

帅气

相关推荐

    自己写的一个MVC框架

    【标题】:“自己写的一个MVC框架” 【描述】:“放寒假的时候写的一个像struts基本功能的框架!!!” 这个描述中提到的“MVC框架”是指模型-视图-控制器(Model-View-Controller)架构模式,这是一种广泛应用于...

    自己利用mvc写的框架

    这个“自己利用mvc写的框架”是一个个人实现的MVC框架,它借鉴了Struts的一些设计思想。学习和研究这个框架可以帮助开发者巩固MVC模式的理解,提高对Struts框架的掌握,并锻炼实际的软件开发能力。通过分析框架的源...

    自己手写PHP MVC 框架

    为了实现数据库操作的独立性,PHP MVC框架通常会提供一个数据库抽象层,如PDO或Doctrine。这层抽象允许我们使用统一的API来执行SQL查询,而无需关心底层使用的具体数据库系统。 **模板引擎(Template Engine)**: ...

    自己写的PHP MVC框架2.0

    自己写的MVC框架,功能完善,用来写一些小项目是绰绰有余了。实现了MVC三层架构,支持模块化设计,应用目录自动生成,命名空间自动加载到类,url mode,url路由等功能。感兴趣的朋友可以下载回去,一起探讨一起学习...

    MVC框架源代码(自己系=写的)

    在这个标题为“MVC框架源代码(自己写的)”的压缩包中,我们推测作者分享的是他自己实现的一个JavaScript MVC框架的源代码,这可能是对经典MVC模式的一种个人化实现。 **1. Model(模型)** 模型层是MVC的核心,它...

    微信开发php+mvc框架

    微信开发php+mvc框架

    写你自己的MVC框架

    **标题:“写你自己的MVC框架”** 在IT领域,MVC(Model-View-Controller)框架是一种广泛使用的软件设计模式,尤其在Web应用开发中。这个标题暗示我们将探讨如何从头开始构建一个MVC框架。MVC模式将应用程序分为三...

    一个mvc框架实例源代码

    在这个实例中,我们探讨的是一个基于J2EE平台的MVC框架的应用,它具有简洁的源码和清晰的注释,便于学习和理解。 **一、MVC模式解析** 1. **Model(模型)**:模型层负责处理业务逻辑和数据操作。在这个框架中,...

    自己写的PHP MVC框架,轻量框架,含bootstrap组件

    总的来说,这个PHP MVC框架为PHP初学者提供了一个学习和实践的平台,不仅可以了解MVC模式的基本原理,还能熟悉数据库操作和前端开发技术。通过深入研究和实践,开发者可以逐渐掌握PHP Web开发的核心技能。

    PHP mvc框架

    **描述** "使用PHP开发自己的MVC框架,站点其实很简单,一个ToDo程序" 提示我们,这里将涉及如何用PHP构建一个简单的MVC框架,并通过一个Todo应用来演示其功能。Todo应用通常是一个基础的待办事项列表,用于展示基本...

    MVC框架自己写的一个新闻发布系统

    在这个"MVC框架自己写的一个新闻发布系统"中,我们看到的是一个使用PHP语言实现的MVC架构,用于创建一个包含前台展示和后台管理功能的完整新闻发布平台。 1. **MVC模式解析** - **Model(模型)**:负责处理数据和...

    简单的MVC框架例子

    总结来说,这个简单的MVC框架例子展示了如何使用JavaBean、Servlet和JSP来构建一个基本的Web应用。这种架构有助于分离关注点,使代码更易于维护和扩展。在实际项目中,更复杂的MVC框架,如Spring MVC,会提供更丰富...

    ASP.NET MVC框架开发系列课程(1):MVC模式与ASP.NET MVC框架概述

    10. ** Areas**:对于大型项目,ASP.NET MVC的Areas功能可以帮助组织代码,将一个大型应用划分为多个功能区域,每个区域有自己的控制器、视图和模型。 通过学习和掌握这些核心概念,开发者能够有效地利用ASP.NET ...

    C++实现简单的MVC框架

    本项目是用C++实现的一个简单的MVC框架,名为MVCDemo,旨在帮助开发者理解MVC设计模式的基础概念。 首先,我们来详细解释MVC的三个组成部分: 1. Model(模型):模型层是应用的核心,它负责管理数据和业务逻辑。...

    C# MVC 经典框架

    例如,可以创建一个UploadService用于处理文件上传,一个WatermarkService处理水印添加,以及一个ThumbnailService用于生成缩略图。这些服务可以通过依赖注入的方式被Controller或其他组件使用。 为了实现这些功能...

    山寨的一个MVC框架

    "山寨的一个MVC框架"可能指的是一个开发者或团队模仿已有知名MVC框架,如Spring MVC、Struts2或JSF,自行创建的一个简化版或定制化的框架。这样的框架通常旨在满足特定项目需求,或者作为学习和理解MVC设计模式的...

    PHP傻瓜也能搭建自己框架,手把手搭建一个mvc框架

    https://blog.csdn.net/weixin_39934453/article/details/132242216PHP傻瓜也能搭建自己框架,手把手搭建一个mvc框架PHP最简单自定义自己的框架(一) PHP最简单自定义自己的框架创建目录结构(二) PHP最简单自定义...

    .netmvc框架

    在创建新的视图时,可以选择关联一个母版页,这样子页面就可以继承母版页的布局,只需要关注自己的内容部分,提高了开发效率和页面一致性。 在实际应用中,.NET MVC框架支持使用Razor视图引擎来编写视图。Razor语法...

Global site tag (gtag.js) - Google Analytics