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 配置文件的格式就出来了,如下:
- <mvc-config>
-
- <form-beans>
-
- <form-bean name="newsForm" type="net.localer.news.form.NewsForm"/>
-
- <form-bean name="userForm" type="net.localer.news.form.UserForm"/>
-
- </form-beans>
-
-
- <action-mappings>
- <!--
- action元素:配置业务Action类
-
- path : 请求的路径
-
- type : 业务Action类的类路径
-
- -->
-
- <action path="/index" type="net.localer.news.action.NewsAction" name="newsForm"/>
- <action path="/user" type="net.localer.news.action.UserAction" name="userForm"/>
- </action-mappings>
- </mvc-config>
看到这里很多人应该会知道其中的type属性将来会通过反射形成一个具体的object对象。当然配置文件出来了肯定就要与之相对应的bean类,否则是无法识别的,当然既然与配置文件对应,那bean类也相当的简单!如下:
- public class ActionConfig {
- private String path;
- private String type;
- private String name;
- public String getPath() {
- return path;
- }
- public void setPath(String path) {
- this.path = path;
- }
- public String getType() {
- return type;
- }
- public void setType(String type) {
- this.type = type;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- }
- public class FormBeanConfig {
- private String name;
- private String type;
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public String getType() {
- return type;
- }
- public void setType(String type) {
- this.type = type;
- }
-
- }
配置文件里还可以看出 action 和 form 要通过name 关联起来。为什么要关联呢?之前说页面的请求封装到form里面 并且 请求会传到action 所以form也会要传给action 所以当请求发出的时候:首先根据请求路径找到对应的action 然后根据action里面name 找到对应的form,将form反射出来后 再传进 对应的action里面!
同时我们还需要一个类,这个类比较特殊
- /**
- *缓存所有已经读取到的ActionConfig对象
- *和FormBeanConfig对象
- *
- */
- public class ActionMappingConfig {
-
- //actionInfo的key键是path
- private Map<String,ActionConfig> actionInfo = null;
-
- //formbeanInfo中的key是name
- private Map<String,FormBeanConfig> formbeanInfo = null;
-
-
- public ActionMappingConfig(){
- actionInfo = new Hashtable<String, ActionConfig>();
- formbeanInfo = new Hashtable<String, FormBeanConfig>();
- }
-
-
- public void setActionConfig(ActionConfig config) {
- actionInfo.put(config.getPath(), config);
- }
-
-
-
- public ActionConfig getActionConfig(String path) {
- return actionInfo.get(path);
- }
-
- public void setFormBeanConfig(FormBeanConfig config) {
- formbeanInfo.put(config.getName(), config);
- }
-
- public FormBeanConfig getFormBeanConfig(String name) {
- return formbeanInfo.get(name);
- }
- }
运行的时候我们需要找一个类把所有的actionbean 和 formbean 缓存起来 ActionMappingConfig 类就是干这个的。
那么缓存是要缓存 可是怎么缓存起来呢 这就要用到另外一个类:XMLParser
代码如下:
- public class XMLParser {
-
- /**
- *
- * @param path XML文档的路径
- * @return 是一已经封装好XML信息的ActionMappingConfig对象
- */
- public static ActionMappingConfig getActionMappingConfig(String path) {
-
- //1、构造SAX解析器
- SAXReader reader = new SAXReader();
-
- //2、创建一个空的ActionMappingConfig对象
- ActionMappingConfig config = new ActionMappingConfig();
-
-
- try {
-
- //3、获得整个对象
- Document doc = reader.read(path);
-
- //4、获得根元素
- Element root = doc.getRootElement();
-
- //5、解析并封装FormBeanConfig的方法
- formBeanParser(root,config);
-
- //6、解析并封装ActionConfig的方法
- actionParser(root,config);
- } catch (DocumentException e) {
- e.printStackTrace();
- }
-
- return config;
- }
-
- /**
- *
- * @param root文档的根元素
- * @param config 空的ActionMappingConfig对象
- */
- private static void formBeanParser(Element root, ActionMappingConfig config) {
-
- Element beans = root.element("form-beans");
-
- List<Element> list = beans.elements();
-
- for (Element e : list) {
-
- String name = e.attribute("name").getValue();
- String type = e.attribute("type").getValue();
-
- //构建FormBeanConfig对象
- FormBeanConfig formBean = new FormBeanConfig();
-
- formBean.setName(name);
- formBean.setType(type);
-
- config.setFormBeanConfig(formBean);
- }
- }
-
- private static void actionParser(Element root, ActionMappingConfig config) {
-
- Element beans = root.element("action-mappings");
- List<Element> list = beans.elements();
- for (Element e : list) {
-
- String name = null;
- if (null != e.attribute("name")) {
- name = e.attribute("name").getValue();
- }
- String type = e.attribute("type").getValue();
- String path = e.attribute("path").getValue();
- ActionConfig action = new ActionConfig();
- action.setName(name);
- action.setPath(path);
- action.setType(type);
- config.setActionConfig(action);
- }
- }
- }
一看好像一个非常复杂的类 但是 一学就会 就是一个普通的解析xml的java代码,网上一搜一堆,不懂可以百度,在这不多浪费时间!到这里我们已经完成了第一大步,把所有的基础config数据备好,
下面要进行的就是核心精髓的部分:action类,actionForm类,actionForward类等地编写!
分享到:
相关推荐
【标题】:“自己写的一个MVC框架” 【描述】:“放寒假的时候写的一个像struts基本功能的框架!!!” 这个描述中提到的“MVC框架”是指模型-视图-控制器(Model-View-Controller)架构模式,这是一种广泛应用于...
这个“自己利用mvc写的框架”是一个个人实现的MVC框架,它借鉴了Struts的一些设计思想。学习和研究这个框架可以帮助开发者巩固MVC模式的理解,提高对Struts框架的掌握,并锻炼实际的软件开发能力。通过分析框架的源...
为了实现数据库操作的独立性,PHP MVC框架通常会提供一个数据库抽象层,如PDO或Doctrine。这层抽象允许我们使用统一的API来执行SQL查询,而无需关心底层使用的具体数据库系统。 **模板引擎(Template Engine)**: ...
自己写的MVC框架,功能完善,用来写一些小项目是绰绰有余了。实现了MVC三层架构,支持模块化设计,应用目录自动生成,命名空间自动加载到类,url mode,url路由等功能。感兴趣的朋友可以下载回去,一起探讨一起学习...
在这个标题为“MVC框架源代码(自己写的)”的压缩包中,我们推测作者分享的是他自己实现的一个JavaScript MVC框架的源代码,这可能是对经典MVC模式的一种个人化实现。 **1. Model(模型)** 模型层是MVC的核心,它...
微信开发php+mvc框架
**标题:“写你自己的MVC框架”** 在IT领域,MVC(Model-View-Controller)框架是一种广泛使用的软件设计模式,尤其在Web应用开发中。这个标题暗示我们将探讨如何从头开始构建一个MVC框架。MVC模式将应用程序分为三...
在这个实例中,我们探讨的是一个基于J2EE平台的MVC框架的应用,它具有简洁的源码和清晰的注释,便于学习和理解。 **一、MVC模式解析** 1. **Model(模型)**:模型层负责处理业务逻辑和数据操作。在这个框架中,...
总的来说,这个PHP MVC框架为PHP初学者提供了一个学习和实践的平台,不仅可以了解MVC模式的基本原理,还能熟悉数据库操作和前端开发技术。通过深入研究和实践,开发者可以逐渐掌握PHP Web开发的核心技能。
**描述** "使用PHP开发自己的MVC框架,站点其实很简单,一个ToDo程序" 提示我们,这里将涉及如何用PHP构建一个简单的MVC框架,并通过一个Todo应用来演示其功能。Todo应用通常是一个基础的待办事项列表,用于展示基本...
在这个"MVC框架自己写的一个新闻发布系统"中,我们看到的是一个使用PHP语言实现的MVC架构,用于创建一个包含前台展示和后台管理功能的完整新闻发布平台。 1. **MVC模式解析** - **Model(模型)**:负责处理数据和...
总结来说,这个简单的MVC框架例子展示了如何使用JavaBean、Servlet和JSP来构建一个基本的Web应用。这种架构有助于分离关注点,使代码更易于维护和扩展。在实际项目中,更复杂的MVC框架,如Spring MVC,会提供更丰富...
10. ** Areas**:对于大型项目,ASP.NET MVC的Areas功能可以帮助组织代码,将一个大型应用划分为多个功能区域,每个区域有自己的控制器、视图和模型。 通过学习和掌握这些核心概念,开发者能够有效地利用ASP.NET ...
本项目是用C++实现的一个简单的MVC框架,名为MVCDemo,旨在帮助开发者理解MVC设计模式的基础概念。 首先,我们来详细解释MVC的三个组成部分: 1. Model(模型):模型层是应用的核心,它负责管理数据和业务逻辑。...
例如,可以创建一个UploadService用于处理文件上传,一个WatermarkService处理水印添加,以及一个ThumbnailService用于生成缩略图。这些服务可以通过依赖注入的方式被Controller或其他组件使用。 为了实现这些功能...
"山寨的一个MVC框架"可能指的是一个开发者或团队模仿已有知名MVC框架,如Spring MVC、Struts2或JSF,自行创建的一个简化版或定制化的框架。这样的框架通常旨在满足特定项目需求,或者作为学习和理解MVC设计模式的...
https://blog.csdn.net/weixin_39934453/article/details/132242216PHP傻瓜也能搭建自己框架,手把手搭建一个mvc框架PHP最简单自定义自己的框架(一) PHP最简单自定义自己的框架创建目录结构(二) PHP最简单自定义...
在创建新的视图时,可以选择关联一个母版页,这样子页面就可以继承母版页的布局,只需要关注自己的内容部分,提高了开发效率和页面一致性。 在实际应用中,.NET MVC框架支持使用Razor视图引擎来编写视图。Razor语法...