readbook:自己设计mvc框架,java类似struts2的实现

如果你不能简单说清楚,就是你还没有完全明白。——爱因斯坦

need things:
 1.操作xml文档 dom4j 等开源类库
 2. dtd的验证 等知识储备
 * n到n次     ? 0到1次        + 1到n次
 3. java 反射的相关知识
反射过程:
导入 java.lang.reflect.*
1.获得需要操作的类的 Java.lang.Class对象
2.调用Class的方法获取Field, Method等对象
使用 反射api 进行操作

反射的常用类
Class 类 : 反射的核心类,反射的所有操作都是围绕该类来生成的,通过它,可以获取类的属性,方法等信息
Field 类 : 类的属性, 可以获取和设置类中属性信息
Method 类: 类的方法,可以获取类中方法的信息,或者执行方法
Constructor类: 类的构造方法

1.
通过Class类的forName()静态方法也可以获取该类对应的Class对象,它会要求虚拟机查找并加载指定的类

Class cla = Class.forName("java.lang.String");    如果字符串有问题,会抛出ClassNotFoundException异常

2.从Class 对象获取信息
创建对象
使用Class对象的newInstance()方法创建对象
notice:实际上利用了它的无参构造方法来创建了该类的实例, 所以要求该Class对象的对应类有相应的无参构造方法

正文:构建开始
构建基于mvc模式的框架

实现方案1
所有请求发到一个统一的controller (用filter api 实现拦截请求) 这样控制器负责接收请求 ,(根据请求的路径指定由哪个action 来执行处理
然后定义Action接口,用来进行请求的处理, 比如登录action, 注册action 等
action 调用model,进行model的操作并返回相应的view

//controller类的定义
public class ActionFilter implements Filter{
    private FilterConfig config;
    public voic destroy(){

    }

    public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain)
     throws IOException,ServletException {

         //类型转换
         HttpServletRequest hsr = (HttpServletRequest) request;
         HttpServeltResponse hsp = (HttpServletResponse) response;

         //获得action
         Action action = this.getAction(hsr);

         //调用action的excute 方法
         String resultView = null;
         try{
             resultView = action.execute(hsr,hsp);
         }
         catch(Exception e){
             e.printStackTrace();
         }

         //页面跳转
         if(null != resultView) {
             request.getRequestDispatcher(resultView).forward(request, response);
         }
    }

    public void init(FilterConfig conf) throws ServletException {
        this.config = config;
    }
    public Action getAction(HttpServletRequest request) {

        String uri = request.getRequestURI(); //获取请求的url

        String contextPath = request.getContextPath(); //获取上下文路径

        String actionPath = uri.substring(contextPath.length()); //截取上下文路径以后的部分

        String actionName = actionPath.substring(1,actionPath.lastIndexOf(‘.‘)).trim();

        Action action = null;

        // 以后每个定义的Action在这里添加一项用于实例化一个需要的action 类的对象
        if("login".equals(actionName)) {
            action = new LoginAction();
        }

        return action;

    }
}

action接口的定义
主要 import javax.servlet.http.HttpServletRequest;
     import javax.servlet.http.HttpServletResponse;

....

基于Filter 的ActionFilter类的调用执行需要在web.xml中配置

<filter>
    <filter-name>requestFilter</filter-name>
    <filter-class>com.xx.xx.mystruts.framework.ActionFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>requestFilter</filter-name>
    <url-pattern>*.action</url-pattern>
</filter-mapping>

以上就是一个mvc框架大致思路的主体实现,很明显还有很多遗漏的细节需要完善,但主体是这样.

很明显有改进的地方,比如
用前面xml的知识 读取配置文件 把一个一个的action的注入通过xml注入
这样就不用每新增一个action 就得重新加一行if 判断处理需要的action类了
改为让控制器初始化的时候读xml
xml里抽出来定义的这些信息包括 action的name,匹配的url,调用的class文件,作为结果的视图的路径

这里用一个java Bean来生成xml读取后 对应的对象数据模型, 以在运行时读取需要的信息
再写一个manager用来管理这个action

与此同时controller也需要升级,让web容器启动的时候加载controller,并读取我们写的保存action信息的xml,
因此需要在filter的配置里加上初始化参数,来实现这一功能本身
修改web.xml 之前的配置为类似下面这种:

<filter>
    <filter-name>requestFilter</filter-name>
    <filter-class>com.xx.mystruts.ActionFilter</filter-class>
    <init-param>
        <param-name>config</param-name>
        <param-value>mystruts.xml</param-value>
    </init-param>
</filter>

然后是actionFilter 类代码实现的修改, 实现读取配置文件

这时主要用到的几个东西,和它们分别负责的内容为  (关于action mapping的映射可以方便的使用HashMap来进行相应的get,put)

mystruts.xml               配置文件,里面定义每个Action的name result
ActionMapping              用来保存从xml中读取的Action的信息
ActionFilter               作为controller 拦截请求,初始化应用,分配action
ActionMappingManager       ActionMapping的管理器 它被调用初始化时,遍历xml节点,
                           根据节点建立ActionMapping ,同时封装一些对ActionMapping的操作,如根据ActionNameget到相应的ActionMapping对象等
ActionManager              使用反射技术生成具体的 Action实例

注意:
以上配置的时候关于请求访问的时候触发action,
1.可以通过直接访问 localhost:xxx/xx.action
2.可以通过jsp的页面转发来调用,这时地址就可以不必是 xx.action结尾了,而是相应的jsp页面地址
jsp页面里写

<body>
    <jsp:forward page="/index.action"></jsp:forward>
</body>

此时web.xml中的filter-mapping做如下修改:

<filter-mapping>
    <filter-name>requestFilter</filter-name>
    <url-pattern>*.action</url-pattern>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>FORWARD</dispatcher>
</filter-mapping>
时间: 2024-12-28 21:44:25

readbook:自己设计mvc框架,java类似struts2的实现的相关文章

IDEA创建一个Spring MVC 框架Java Web项目,Gradle构建

注:此篇有些细节没写出,此文主要写重要的环节和需要注意的地方,轻喷 新建项目 选择Gradle , 勾选java 和 web.之后就是设定项目路径和名称,这里就不啰嗦了. build.gradle文件下导入所需要的包,刷新一下. 1 group 'com.benjious.createTest' 2 version '1.0-SNAPSHOT' 3 4 apply plugin: 'java' 5 apply plugin: 'war' 6 7 sourceCompatibility = 1.8

如何设计一个易用的MVC框架

导言 把一件简单的事情做复杂很容易,把一件复杂的事情做简单却不易.在计算机的世界里, 冯.诺依曼把复杂的电脑简化为:存储器,控制器,运算器和I/O设备; 丹尼斯·里奇把晦涩的汇编语言简化为258页的<C程序设计语言>; 詹姆斯高斯林把繁琐的跨平台编码简化为256条字节码指令: 对我们大部分人而言,把简单的事情做简单就足够了. 关于框架 框架是对某一类共通业务的封装,框架设计应该遵循几个基本的原则:1 易用性 2 稳定性3 扩展性,框架从来都是给别人用 的,框架的学习成本与他的复杂度成正比,如果

设计 REST 风格的 MVC 框架

http://www.ibm.com/developerworks/cn/java/j-lo-restmvc/ 传统的 JavaEE MVC 框架如 Struts 等都是基于 Action 设计的后缀式映射,然而,流行的 Web 趋势是 REST 风格的架构.尽管使用 Filter 或者 Apache mod_rewrite 能够通过 URL 重写实现 REST 风格的 URL,为什么不直接设计一个全新的 REST 风格的 MVC 框架呢? 本文将讲述如何从头设计一个基于 REST 风格的 Ja

ideat使用struts2之自定义MVC框架

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

Java MVC框架性能比较

- by zvane 现在各种MVC框架很多,各框架的优缺点网络上也有很多的参考文章,但介绍各框架性能方面差别的文章却不多,本人在项目开发中,感觉到采用了struts2框架的项目访问速度,明显不如原来采用了struts1框架的项目快,带着这些疑惑,我对各类MVC框架的做了一个简单的性能分析比较,其结果应该说是基本符合预期的,可供大家参考. 测试环境:CPU:酷睿2 T5750,内存:DDR2-667 2G,Web容器:Tomcat6.0,最大线程数设置为1000,操作系统:WinXP-sp3 测

主流MVC框架的设计模式及遵守的软件设计原则

原文地址,会不断更新  http://it.zuocheng.net/mvc-design-pattern-design-principle-summary   作程的技术博客 本文以主流的MVC框架为例,比如Java 的SSH.PHP的Symfony和Zend Framework ,在简单地剖析他们的设计原理之后,找到其中使用的设计模式:鉴赏他们的代码实现,查看设计者们都遵守了哪些软件设计原则.作此文,一为学习,二为总结.其中下面所写内容可能并不全面,也可能不准确,但会不断修改完善. 框架模式

从MVC框架看MVC架构的设计

转自:http://blog.csdn.net/bluishglc/article/details/6690693 从MVC框架看MVC架构的设计 尽管MVC早已不是什么新鲜话题了,但是从近些年一些优秀MVC框架的设计上,我们还是会发现MVC在架构设计上的一些新亮点.本文将对传统MVC架构中的一些弊病进行解读,了解一些优秀MVC框架是如何化解这些问题的,揭示其中所折射出的设计思想与设计理念. MVC回顾   作为一种经典到不能再经典的架构模式,MVC的成功有其必然的道理,这个道理不同的人会有不同

AsMVC:一个简单的MVC框架的Java实现

当初看了<从零开始写一个Java Web框架>,也跟着写了一遍,但当时学艺不精,真正进脑子里的并不是很多,作者将依赖注入框架和MVC框架写在一起也给我造成了不小的困扰.最近刚好看了一遍springMVC的官方文档,对过去一段时间的使用做了一下总结,总结了一些MVC的使用需求,打算自己开坑写一个MVC框架,虽然是重复造轮子的过程,但也是学习提高的过程. 1.我们可能需要一个什么样的MVC框架 (1)用户一:我讨厌配置文件,最好能用注解的全用注解注解,能扫描直接扫描 (2)用户二:最好我导入一个j

Java Web自定义MVC框架详解 (转)

转自:http://blog.csdn.net/jackfrued/article/details/42774459 最近给学生讲Java Web,希望他们能够在学完这部分内容后自己实现一个MVC框架.但是突然发现百度上能搜索到的靠谱的资料并不是很多,有些只是原理没有代码实现,有些有 代码实现但是对于初学者来说理解起来还是比较困难,于是决定把自己讲自定义MVC框架的内容放在这里分享给大家,不仅仅是代码,也有原理和探讨.内容会比 较长,因为我打算用递增的方式讲解如何写一个自定义MVC框架,重点是前