对于框架的一些个人理解

很多时候,为什么感觉一本书很难啃,俩字,抽象,所谓的抽象,不过是自己对这些概念不甚理解,本来程序 软件设计的东西就是从现实里抽取的,大不了我们还原到里面就是。

在这里,我拿去饭店吃饭做比,当http这个客人受到前台的接待,前台会根据你的请求将房间号的包间给你,你过去,这个包间就是一个servlet,然后通过菜单点菜,菜单就是servlet里方法的注解,映射了每道菜制作的过程,无须对展示层展示,只需要客人看到最终的菜肴即可,这样也就达到了隔离安全的效果,餐桌就是一个模板,每个不同的请求返回的结果可以在这个模板里集中展示,modelandview与view解析器也派上用场了。

再仔细的分解这个过程,当http受接待的时候,会受到这个饭店的配置限制吧,也就是你的web.xml就要设置为此饭店,也就是容器了,当你进入饭店的时候,拦截处理,往往会确认一下你是否预定等一些事宜,这里拿Struts2的dispatcher来说明,通过对这些请求进行预处理,这里是PrepareOperations的对象来处理的,其实其也就是个代理对象,正儿八经实现的还是dispatcher本身,由其进行转发处理,这里就别贴源码了,可以自己打开ide自己追着看,想想前台服务员是不是可以各种换,然后其执行的任务是不是始终都一样,通过对客人提供的信息进行处理封装,就像房间号和你放在一个Map中一样,同样,也可以在这里看到Struts和XWork融合的地方,就是dispatcher的serviceAction方法可以看到这里是是Dispatcher对象的核心逻辑调度方法,起到了中转站的作用

     * @since 2.3.17
     */
    public void serviceAction(HttpServletRequest request, HttpServletResponse response, ActionMapping mapping)
            throws ServletException {

        Map<String, Object> extraContext = createContextMap(request, response, mapping);

        // If there was a previous value stack, then create a new copy and pass it in to be used by the new Action
        ValueStack stack = (ValueStack) request.getAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY);
        boolean nullStack = stack == null;
        if (nullStack) {
            ActionContext ctx = ActionContext.getContext();
            if (ctx != null) {
                stack = ctx.getValueStack();
            }
        }
        if (stack != null) {
            extraContext.put(ActionContext.VALUE_STACK, valueStackFactory.createValueStack(stack));
        }

        String timerKey = "Handling request from Dispatcher";
        try {
            UtilTimerStack.push(timerKey);
            String namespace = mapping.getNamespace();
            String name = mapping.getName();
            String method = mapping.getMethod();

            ActionProxy proxy = getContainer().getInstance(ActionProxyFactory.class).createActionProxy(
                    namespace, name, method, extraContext, true, false);

            request.setAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY, proxy.getInvocation().getStack());

            // if the ActionMapping says to go straight to a result, do it!
            if (mapping.getResult() != null) {
                Result result = mapping.getResult();
                result.execute(proxy.getInvocation());
            } else {
                proxy.execute();
            }

            // If there was a previous value stack then set it back onto the request
            if (!nullStack) {
                request.setAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY, stack);
            }
        } catch (ConfigurationException e) {
            logConfigurationException(request, e);
            sendError(request, response, HttpServletResponse.SC_NOT_FOUND, e);
        } catch (Exception e) {
            if (handleException || devMode) {
                sendError(request, response, HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e);
            } else {
                throw new ServletException(e);
            }
        } finally {
            UtilTimerStack.pop(timerKey);
        }
    }

同样,我们也会看到里面有几个cleanup的方法,在客人吃完饭,需要清理残局的时候,又要麻烦dispatcher这个调度器了,拿到框架里就是对这个事件的生命周期里框架元素的清理(总会有不少残余的存在)。

同样,对于我们这拨人去饭店吃饭这个流程,中间所设计的各个小事件,比如点菜,一些突发事件的特别服务等会在大伙入门登记的那一刻起已经绑在一条线程上了,对于框架里 也就是ThreadLocal,当我们付完款离开的时候,那个账单也就没多大用了,留个日志就可以撇过一边了,程序里就是销毁。

再分析,当我们点菜之后,菜单交给服务员,服务员交给后厨,后厨做完饭菜给服务员,服务员上菜,其实这里面就涉及了一个责任链的模式,关于菜单,还涉及到一个模式,就是构造模式,饭店根据季节和自己的优势来设计菜单,然后由厨子来实现,而客人呢只需要点菜就可以了。

当我们消费多少之后,往往饭店会打折或者送东西,这就是涉及到了一个策略的模式,一个接口下有不同的策略实现,减100还是更大力度等等

有时候我们会遇到很奇葩的事情,就是一个菜品,就比如一盘黄瓜,往往会有一个特别高大上的名字,然后一个名字就把这盘黄瓜的身价给提升了,看看装饰模式是多么值钱。。。

看到了吧,一个菜单都有这么多的学问,在这里这个层面的注解包含房间号 菜名,类注解假如写房间号,方法只写菜名就成,否则每道菜都得加房间号,具体就按照自己的想法来就成

可见一个框架的实现其实也就那些东西,各种离不开ThreadLocal模式 装饰模式 策略模式 构造模式 责任链模式 调度器等,源码来源于生活,读源码的时候多多联系实际,理解好了,敲嘛,也就那回事儿了

下一篇,就总结下注解就成

时间: 2024-10-26 17:03:48

对于框架的一些个人理解的相关文章

[转]JAVA三大框架SSH和MVC理解

Java—SSH(MVC) JAVA三大框架的各自作用 hibernate是底层基于jdbc的orm(对象关系映射)持久化框架,即:表与类的映射,字段与属性的映射,记录与对象的映射 数据库模型 也就是Model; struts提供的丰富标签是用于显示层View;同时struts也充当了实现Control的功能(不管是Struts1,还是Struts2),接收参数,视图分发. Spring是用于降低层与层间耦合度的,就是所有的类都可以由spring统一创建,用时只需注入即可(IOC) 从功能上来说

vue是一个渐进式的框架,我是这么理解的

vue是一个渐进式的框架,我是这么理解的 原文地址 时间:2017-10-26 10:37来源:未知 作者:admin 每个框架都不可避免会有自己的一些特点,从而会对使用者有一定的要求,这些要求就是主张,主张有强有弱,它的强势程度会影响在业务开发中的使用方式. 使用vue,你 可以在原有 每个框架都不可避免会有自己的一些特点,从而会对使用者有一定的要求,这些要求就是主张,主张有强有弱,它的强势程度会影响在业务开发中的使用方式.使用vue,你可以在原有大系统的上面,把一两个组件改用它实现,当jQu

SSH框架中Spring框架搭建的初步理解(一)

接手基于SSH框架的web项目已经一个月有余了.早有听说javaweb三大框架,第一次接触,先来说下感受. 我感觉SSH框架最明显的优点有如下: 采用MVC模式,层次结构清晰,使程序员只需关注业务逻辑的实现. 通过配置文件,就可以掌握整个系统各个部分之间的关系. 通过AOP,可以实现事务管理和日志管理. 其中Spring框架能使你通过最简单可行的方法来解决问题,这是非常高效的.但是它的搭建也略微复杂,尤其是对于我这样的新手来说,所以开此篇记录一下SPring框架的搭建: 创建web项目,导入SS

关于SSH框架设计的一些理解

最近在学习企业开发领域很流行的SSH框架(Struts.Hibernate.Spring),由于之前有做过原生的Servlet+JSP的项目,所以在学习过程中我会跟原生开发模式进行对比,在这里我把自己的一些理解做下小结. 1.Servlet+JSP原生开发 先简要说一下Java Web原生开发模式,Java Web开发通常是使用Tomcat之类的容器,Tomcat容器实现了一套也可以称为框架的东西,就是Servlet.Tomcat运行于Apache之类的Web服务器上,Apache服务器负责处理

谈谈对 ”框架“ 这个概念的理解,以及它和库的区别

当一个编程新手真正想要写出一些可以用的程序,比较快速的方法是在一个框架的基础上完成.不过另一方面对于新手来说,用框架的缺点就是,用完了框架,可能会发现还是不理解整个系统,因为只添加代码是不够的,要理解系统,就必须要理解进程的执行流程.  “框架”的定义是什么?按照我的理解,如果一个应用程序的代码是可以扩展的,我们就称这个应用程序的代码是一个框架.这里的“扩展”具体是一个什么概念呢?一般而言,一个框架被确定的时候,进程的大致执行流程就已经确定好了,程序员如果想要扩展这个框架,可以通过“继承+覆写”

struct2.1笔记01:MVC框架思想浅层理解

1. Struts 1是全世界第一个发布的MVC框架,它由Craig McClanahan在2001年发布,该框架一经推出,就得到了世界上Java Web开发者的拥护,经过长达6年时间的锤炼,Struts 1框架更加成熟.稳定,性能也有了很好的保证.因此,到目前为止,Struts 1依然是世界上使用最广泛的MVC框架. 目前,基于Web的MVC框架非常多,发展也很快,每隔一段时间就有一个新的MVC框架发布,例如像JSF.Tapestry和Spring MVC等.除了这些有名的MVC框架外,还有一

卷积神经网络CNN介绍:结构框架,源码理解【转】

1. 卷积神经网络结构 卷积神经网络是一个多层的神经网络,每层都是一个变换(映射),常用卷积convention变换和pooling池化变换,每种变换都是对输入数据的一种处理,是输入特征的另一种特征表达:每层由多个二维平面组成,每个平面为各层处理后的特征图(feature map). 常见结构: 输入层为训练数据,即原始数据,网络中的每一个特征提取层(C-层)都紧跟着一个二次提取的计算层(S-层),这种特有的两次特征提取结构使网络在识别时对输入样本有较高的畸变容忍能力.具体C层和S层的个数不确定

学习之Struts2框架实现原理----个人理解

以下是个人中学习过程中对struts2的一些理解,有不对的地方大家多多提出指正,小弟拜谢! 解析MyStruts.xml文件的过程:需要几个核心类:包括StrutsInfo类,用来装struts标签里的属性参数name.class.method,还需要一个集合用来装result标签里的属性,所以需要另一个类:ResultInfo类,同样是装result标签里的属性参数,name.type.location(是跳转的地址) 然后需要一个ActionMapper来解析该文件,内有一个解析的方法par

ThinkPHP框架 祖辈分的理解 【儿子 FenyeController】继承了【父亲 FuController】继承了【祖辈 Controller】的

注:系统自带的Controller方法代表的是祖辈 FuController控制器是自定义的,代表父亲... FenyeController控制器就代表着儿子 [儿子 FenyeController]继承了[父亲 FuController]继承了[祖辈 Controller]的 在模块控制器Controller文件夹里创建一个简单的 LoginController.class.php控制器 <?php namespace Admin\Controller; use Think\Controlle