zoukankan      html  css  js  c++  java
  • 自己实现的简单MVC框架(类似Struts2+Spring)

    一、框架简介

    本框架是一个类似于Struts2+Spring的框架,目的在于个人钻研和技术分享,将流行技术框架Struts2、Spring中使用到的主要技术以较为简化的方式实现出来,给大家一个更直观的呈现。(注意:本框架本身不够完善,还不足以用于商用业务开发,代码可能存在缺陷,部分功能还有优化空间;同时要说明,Struts2、Spring的实际实现较为复杂(自然功能也强大),本框架借鉴中他们本来的一些实现方式,但也做了较大改动和简化)

    二、涉及到的主要技术点

    1.MVC三层分离(参考资料:Struts2与MVC基础入门

     1)M(Model)为业务处理逻辑处理及持久化操作等

     2)V (View)为页面呈现,本架构中通过JSP呈现,Struts2中还可以通过VelocityFreemarker来做展示。

     3)C (Controller) 为action控制对各逻辑模块的调用和到视图层的跳转。

          实现方式:

          采用了类似struts2的配置文件格式,用于定义action、调用方法及跳转。

           页面可以提交数据到Action中使用,Action中可以将数据写入Request或Session中,在JSP页面可以通过request.getAttribute或session.getAttribute方式获取到。

    2.IOC容器(参考资料:IOC容器

      实现方式:采用了类似Spring的配置文件格式,用于定义各种bean及bean间依赖,支持单实例配置。

    3.AOP (参考资料:Spring AOP 详解java动态代理)

      实现方式:采用了不同于Spring的aop配置,做了简化,可以用于定义切面和对应的切面操作类。说实话,AOP这些概念说起来非常晦涩难懂,简单点说,就是利用java里的动态代理机制,对指定的一些类中的一些方法进行拦截,在这些方法执行前后插入自定义的一些操作。如在所有action类中add方法前增加一个记录日志的操作,对于所有update方法记录执行所需要的时间。除了日志的记录,比较常用的还有事务。 不过始终铭记于心,这样的拦截对我们自己的代码都是有要求的,如你指定对add开头的方法进行拦截(方法关键字支持模糊匹配,*代表多个字符),那么自己所开发的所有代码在命名时必须要满足这个格式,如果命名为Add(a变成了大写的了),那就拦截不到了。当然,如果你把拦截的范围设置的大了,则有可能误伤,把一些本不应拦截的也给拦截了。

    4.与Mybatis集成

      实现方式:与mybatis 3.2.7进行集成,支持一个工厂类来产生SqlSessionFactory对象,用于DAO类中进行调用。

    三、本框架与Struts2、Spring框架差异之处

    1)没有支持Struts2中带有的拦截器功能

    2)AOP实现方式与Spring的实现方式有差别,配置文件有较大变化

    还有其他的差异,这里不一一赘述。

    四、源代码下载:

    https://github.com/jerrymousecn/miniMVC

    其中mybatis_demo目录为与mybatis集成的样例,里面使用的数据库是mysql。

    mybatis_demominiMVC_mybatismysql.sql文件为数据库表及数据创建语句;

    如果需要使用此样例,需要检查ibatisConfiguration.xml中数据库配置是否正确(文件位于:mybatis_demominiMVC_mybatissrccnjerrymini_mvcexampleconfig);

    如果要自己编写其他的样例,则需要注意StudentMapper.xml、ibatisConfiguration.xml中各种路径配置是否正确(具体参考mybatis相关资料,本框架未对mybatis配置做出任何改变)

    本文编写时,对于的代码发布版本:https://github.com/jerrymousecn/miniMVC/archive/1.7.zip

    注:导入eclipse项目时要注意修改项目属性中"Java Build Path"对应的JRE路径,修改"Targeted Runtimes"对应的容器配置。

    五、主要源代码:

    1.Action控制类,入口过滤器

    2.对象工厂类,用于实现IOC容器,生成各种bean,支持单例模式

    3.AOP代理生成类(通过cglib方式生成)


    截图:

    1.输入框页面,输入姓名

    2.结果页面,显示一个欢迎信息,其中的姓名来自前一个提交的页面

    后台打印信息(大部分是AOP类打印的,用于展示AOP操作):

    BeforeAdviceImpl1 targetObj: TestAction method: execute
    AroundAdviceImpl1 targetObj: TestAction method: execute
    test1 in TestDao ...
    AroundAdviceImpl1 targetObj: TestAction method: execute
    Time Elapsed: 1 ms
    AfterAdviceImpl1 targetObj: TestAction method: execute

    
    
    
    
  • 相关阅读:
    Eclipse的Debug教程
    Java面向对象--关键字(package、import、this)
    Java面向对象--JavaBean类&UML类图
    Java面向对象--构造器(构造方法)
    Java面向对象--属性和方法
    python | 基础知识与基本概念
    post登录 jsessionid 以及cookie 传递
    JMeter学习-017-java.net.SocketException: Permission denied: connect 解决方案
    python自建模块显示说明与详情
    在linux下pycharm无法输入中文
  • 原文地址:https://www.cnblogs.com/jerry1999/p/4175931.html
Copyright © 2011-2022 走看看