今天我学习了自定义一个简单的MVC框架,这个我们首先要知道什么是MVC框架!

MVC框架: MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。

我们今天自己定义的MVC框架是简单模仿struts2的

然后我们会用到两个常用的技能点,一个是使用dom4j解析xml文件,还有一个是java反射机制。

我们先看一下整体架构

我们用的是intellij idea这个工具。我们会创建一个maven项目,然后在pom文件导入我们需要的两个jar包,一个是dom4j的,一个是javaee的

下面是两个节点:

 我们要定义自己的配置文件frame.xml.

我们要定义自己的dtd文件约束和配置信息:

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE myframe[<!ELEMENT myframe (actions)><!ELEMENT actions (action*)><!ELEMENT action (result*)><!ATTLIST actionname CDATA #REQUIREDclass CDATA #REQUIRED><!ELEMENT result (#PCDATA)><!ATTLIST resultname CDATA #IMPLIEDredirect (true|false) "false">]>
<myframe><actions><action name="login" class="cn.curry.action.LoginAction"><result name="success">/success.jsp</result><result name="login">login.jsp</result></action></actions>
</myframe>

然后建好包开始创建我们需要的类和接口。

首先我们定义自己的Action接口,在这个接口里我们简单定义了两个字符串常量,还有一个抽象的execute方法,我们最后看实现,现在先不多说。

然后我们定义一个ActionManager管理类,我们通过类名用反射机制获取对象。
package cn.curry.action;/*** Created by Curry on 2017/3/15.*/
public class ActionManager {public static Action getActionClass(String className) throws Exception{Class clazz=null;Action action=null;clazz=Thread.currentThread().getContextClassLoader().loadClass(className);if (clazz==null){clazz=Class.forName(className);}if (action==null){action=(Action) clazz.newInstance();}return action;}
}然后我们再定义一个ActionMapping类,这个类定义了几个属性,类似于实体类的作用。
package cn.curry.action;import java.util.HashMap;
import java.util.Map;/*** Created by zl on 2017/3/15.*/
public class ActionMapping {private String name;private String className;private Map<String,String> map=new HashMap<String, String>();public String getName() {return name;}public void setName(String name) {this.name = name;}public String getClassName() {return className;}public void setClassName(String className) {this.className = className;}public String getValue(String key) {return map.get(key);}public void addToMap(String key,String value) {map.put(key,value);}
}然后我们要做解析XML的类,我们的类ActionMappingManager ,我们通过读取用jdom4j读取xml,然后把数据添加到集合中。
package cn.curry.action;import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;import java.io.InputStream;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;/*** Created by zl on 2017/3/15.*/
public class ActionMappingManager {private Map<String,ActionMapping> map=new HashMap<String, ActionMapping>();public  ActionMapping getValue(String key) {return map.get(key);}public void addToMaps(String key,ActionMapping value) {map.put(key,value);}public ActionMappingManager(String [] files)throws Exception{for (String item:files){init(item);}}public void init(String path)throws Exception{InputStream is=this.getClass().getResourceAsStream("/"+path);Document doc=new SAXReader().read(is);Element root=doc.getRootElement();Element actions=(Element)root.elements("actions").iterator().next();for (Iterator<Element> action=actions.elementIterator("action");action.hasNext();){Element actionnext=action.next();ActionMapping am=new ActionMapping();am.setName(actionnext.attributeValue("name"));am.setClassName(actionnext.attributeValue("class"));for (Iterator<Element> result=actionnext.elementIterator("result");result.hasNext();){Element resultnext=result.next();String name=resultnext.attributeValue("name");String value=resultnext.getText();if (name==null||"".equals(name)){name="success";}am.addToMap(name,value);}map.put(am.getName(),am);}}
}接下来我们要定义一个servlet来获取请求,LoginServlet.主要通过获取的请求来找到frame.xml.
package cn.curry.servlet;import cn.curry.action.Action;
import cn.curry.action.ActionManager;
import cn.curry.action.ActionMapping;
import cn.curry.action.ActionMappingManager;
import org.omg.PortableInterceptor.ACTIVE;import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;/*** Created by zl on 2017/3/15.*/
public class LoginServlet extends HttpServlet {private ActionMappingManager manager=null;private String getClassName(HttpServletRequest request){String uri=request.getRequestURI();System.out.println(uri+"        uri");String context=request.getContextPath();System.out.println(context+"             context");String result=uri.substring(context.length());System.out.println(result+"              result");return result.substring(1,result.lastIndexOf("."));}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String key=getClassName(request);System.out.println(key+"           key");try {ActionMapping actionMapping=manager.getValue(key);System.out.println(actionMapping.getClassName()+"            classname");Action action= ActionManager.getActionClass(actionMapping.getClassName());String result=action.execute(request,response);System.out.println(result+"                   result");String path=actionMapping.getValue(result);System.out.println(path+"                path");request.getRequestDispatcher(path).forward(request,response);} catch (Exception e) {e.printStackTrace();}}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request,response);}@Overridepublic void init(ServletConfig config) throws ServletException {String fileName=config.getInitParameter("config");String file[]=null;if(fileName==null){file=new String[]{"myframe.xml"};}else {fileName.split(",");}try {manager=new ActionMappingManager(file);} catch (Exception e) {e.printStackTrace();}}
}最后我们配置一下web.xml,然后就书写页面:
<!DOCTYPE web-app PUBLIC"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN""http://java.sun.com/dtd/web-app_2_3.dtd" ><web-app><display-name>Archetype Created Web Application</display-name><servlet><servlet-name>LoginServlet</servlet-name><servlet-class>cn.curry.servlet.LoginServlet</servlet-class></servlet><servlet-mapping><servlet-name>LoginServlet</servlet-name><url-pattern>*.action</url-pattern></servlet-mapping><welcome-file-list><welcome-file>login.jsp</welcome-file></welcome-file-list>
</web-app>

书写页面,我们准备了两个页面,一个login.jsp。一个success.jsp。

首先看login.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>登录</title>
</head>
<body>
<form action="login.action" method="post"><input name="name"><br><input type="submit" value="登陆"/>
</form>
</body>
</html>然后看success.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>登录</title>
</head>
<body>
<h2>登录成功</h2>
</body>
</html>

最后我们看一下运行效果

大家想要更好的理解,需要自己调试看一下每一步怎么走的。

还有就是使用intellij idea遇到各种问题如果,大家有使用idea的相关问题也可以一起讨论。

转载于:https://www.cnblogs.com/cuntouyixiaohuo/p/6576425.html

使用Intellij Idea自定义MVC框架相关推荐

  1. 第一章 自定义MVC框架

    第一章  自定义MVC框架 1.1 MVC模式设计     组成:Model:模型,用于数据和业务的处理           View :视图,用于数据的显示           Controller ...

  2. PHP笔记-自定义MVC框架

    膜拜 膜拜下黑马大佬程序员的项目,学习到了这样的手写MVC框架的方式,受益匪浅,感觉自己在C/C++和Java方面,还有许多要学习的地方,看看能不能抄下这个php自己撸一个C/C++的MVC框架. 下 ...

  3. 自定义MVC框架之工具类-图像处理类

    截止目前已经改造了4个类: ubuntu:通过封装验证码类库一步步安装php的gd扩展 自定义MVC框架之工具类-分页类的封装 自定义MVC框架之工具类-文件上传类 图像处理类: 1,图片加水印处理( ...

  4. 自定义mvc框架复习(crud)

    目录 一.搭建自定义mvc框架的环境 1.1导入框架的jar包依赖 1.2导入框架配套的工具类 1.3导入框架的配置文件 1.4将框架与web容器进行集成,配置web.xml 二.完成实体类与数据库表 ...

  5. java struts2 mvc_struts2自定义MVC框架

    本文实例为大家分享了struts2自定义MVC框架的方法,供大家参考,具体内容如下 自定义MVC:(首先了解Model1和Model2的概念) Model1与Model2: Model1:就是一种纯j ...

  6. 学到微笑之 - 自定义 MVC 框架

    没啥想说的,就放个表情包吧 1 Spring MVC 执行流程 2 MVC 框架注解开发 自定义注解 (1)MyController @Documented @Target(ElementType.T ...

  7. php mvc自定义框架视频教程,基于PHP面向对象的自定义MVC框架高级项目开发视频教程...

    ├ │  ├01-温故而知新.wmv │  ├02-验证码技术介绍.wmv │  ├03-GD处理图像的基本步骤.wmv │  ├04-画布操作基本步骤-补充.wmv │  ├05-仿制ecshop验 ...

  8. 自定义MVC框架实现

    目录 一.让中央控制器动态加载存储子控制器 二.参数传递封装优化 三. 对于方法执行结果,转发重定向优化 四.框架配置文件可变 一.让中央控制器动态加载存储子控制器 通过上篇文章中央控制器接受浏览器的 ...

  9. 自定义MVC原理与框架

    目录 一.自定义MVC 二.如何优化增删改查 三.自定义MVC框架 一.自定义MVC 1.自定义MVC的概念: MVC全称名是Model(模型层) View(视图层) control(控制层),这三个 ...

最新文章

  1. 明年迎来AI泡沫集体爆发?不,融资将再创新高,但这或许是最后一次狂欢
  2. Opera浏览器无法观看土豆 优酷 新浪视频的解决办法!
  3. 哪些模块可用于python性能分析_提升Python程序性能的方法有哪些?看完你就知道啦!...
  4. php中文乱码问号,如何解决PHP中文乱码问题?
  5. windows server 2008 R2系统安装教程
  6. spm oracle cloud,oracle11g新特点——SQLPlanManagement(SPM)-Oracle
  7. 物联网有哪些技术 物联网跟云计算人工智能有什么关系
  8. 主线剧情0.0-Linux学习资源大综合
  9. 软件工程 -- 数据流图的画法
  10. 安全测试(初测)报告
  11. 参考 Docker 官方文档 Centos安装 Docker
  12. 局域网即时通讯Active Messenger 完美破解版本 最新版本破解
  13. centos7.1与无线网 (芯片rtl8723be)
  14. QGIS加载无偏移卫星地图URL
  15. 2021年5月23日哈工大scir笔试
  16. 【Tyvj1922】Freda的迷宫
  17. C语言LMS双麦克风消噪算法,芯片内部的噪声抑制算法,语音芯片来说也是一样(双麦克风降噪理念)...
  18. dhcp snooping华为_华为交换机DHCP snooping
  19. IL遇到的思路及问题
  20. 医疗卫生信息化数据防泄漏保护系统解决方案

热门文章

  1. python @符号_用Python学数学之Sympy代数符号运算
  2. AcWing 900. 整数划分(完全背包计数问题)
  3. Codeforces Round #698 (Div. 2) (思维)
  4. Hadoop集群常用命令
  5. Shell脚本编程之(六)循环
  6. Spark提交任务参数详解
  7. java 框架介绍------权限框架
  8. 在阿里云上遇见更好的Oracle(四)
  9. 在Mac中如何通过命令对NTFS磁盘格式化
  10. [ACM] hdu 2082 找单词 (母函数)