本读书笔记系列,主要针对陆舟所著<<Struts2技术内幕 深入解析Strtus2架构设计与实现原理>>一书。笔记中所用的图片若无特殊说明,就都取自书中,特此声明。



什么是框架?我们为什么要用框架?框架能给我们带来什么?

这几个问题既简单又复杂。说它简单,是因为框架确实存在在软件设计中,说它复杂是因为我们现在所使用的框架不论是spring还是struts都是经过多年的发展,其内部已经十分庞杂了,因此想一句话两句话说清楚一个框架就不是那么简单了。

OK,既然现有的框架都很复杂,那我们就找一个简单的:

if(str==null || str.length()==0){
    //...你的逻辑
}

上面这段代码,无论是语法还是功能都很简单:判断一个字符串是否为空。

我们仔细回想一下,我们所写的java代码首先就得得到java的语法支持和基本功能的api支持(例如上面的str.length()就是返回字符串的长度)。再换句话说我们所写的代码都依赖一个最最基本的条件:

jdk所提供的api支持***

如果一个需求被重复1000次,那么我们就需要重复1000次针对需求的解决方法。如果一个项目里我们有1000个地方都需要判断字符串是否为空,当然上面的代码完全可以,不过我们是不是能够对它做一点点重构呢?

public abstract class StringUtils{
    public static boolean isEmpty(String str){
        return str.length()==0 || str==null;
    }
}

在我们的代码里要使用上面的功能,代码如下:

if(StringUtils.isEmpty(str)){
    //...你的逻辑
}

我们对代码做了一次小小的改进,可就是这个改进,让我们的代码有了两个良好的品质:

1 可读性

只要是学过英语的朋友,应该都知道empty的意思吧。对"判断字符串是否为空"这个功能点,我们抽象出一个方法,名字就叫做isEmpty,不就是见名知义吗?相信一些有经验的程序员看到isEmpty的方法名就能想到内部的实现过程。我们再看看未重构前的代码,如果在一个七八百行的代码片段里,我们最初写的那部分代码是不能引起我们思维的停顿的。而后者作为一个提炼出来的方法,可以给我们一个直观的提示。

2 可扩展性

这个就更简单了,如果对"判断字符串是否为空"这个功能点做一下改变,之前的方法需要改1000次,而抽取出逻辑合成一个新的方法就只需要改一次。



其实上面的问题,很多计算机前辈都已经预见到了,在Apache的common-lang.jar里面就有类似的代码。如果我们想使用Apache的功能扩展,只需要将上面的那个jar包加到CLASSPATH中即可。

上面的道理很简单,大家都干过,但就是这个简单的例子,告诉了我们一个深刻的道理:

每当我们把一个jar包加入CLASSPATH中,就等于获得了jar中所有对jdk的额外支持。



我们所有的程序,其内在结构如下:



最底层的就是jvm,它提供了java程序运行的基础环境;再之上就是jdk,它是构建在jvm上的基本的对象行为的定义。再之上就是jar包层次,通过上图大家也能看到,jar包层次里面似乎是一块一块的砖头,它们间是可区分的,但是这些砖头合在一起构成一层,为最上层的我们写的应用程序服务。

看eclipse里面CLASSPATH的截图,我们可以看到我们所熟悉的框架都是以一个一个的jar包的形式被加载到程序运行所依赖的CLASSPATH中的。



因而我们又可以得出一个结论:

框架只是一个jar包而已,其本质是对jdk的功能扩展。



那么我们为什么要把jar包加入CLASSPATH呢?回想我们最开始说的字符串判空,我们的初衷就是:

解决中某个领域的开发中遇到的困境。





因而,框架存在的意义:

是在某个领域内,解决问题。

所以,对我们程序员来说,千万不要为了学框架而学框架,我们应该抱着为了解决某些问题的态度来学习框架。



这篇只是一个预热,下面我们再谈谈web开发的一些"基础知识"。

Struts2技术内幕 读书笔记一 框架的本质的更多相关文章

  1. Struts2技术内幕 读书笔记三 表示层的困惑

    表示层能有什么疑惑?很简单,我们暂时忘记所有的框架,就写一个注册的servlet来看看. index.jsp <form id="form1" name="form ...

  2. Struts2技术内幕 读书笔记二 web开发的基本模式

    最佳实践 在讨论基本模式之前,我们先说说一个词:最佳实践 任何程序的编写都得遵循一个特定的规范.这种规范有约定俗称的例如:包名全小写,类名每个单词第一个字母大写等等等等;另外还有一些需要我们严格遵守的 ...

  3. 深入理解linux网络技术内幕读书笔记(三)--用户空间与内核的接口

    Table of Contents 1 概论 1.1 procfs (/proc 文件系统) 1.1.1 编程接口 1.2 sysctl (/proc/sys目录) 1.2.1 编程接口 1.3 sy ...

  4. Kafka技术内幕 读书笔记之(一) Kafka入门

    在0.10版本之前, Kafka仅仅作为一个消息系统,主要用来解决应用解耦. 异步消息 . 流量削峰等问题. 在0.10版本之后, Kafka提供了连接器与流处理的能力,它也从分布式的消息系统逐渐成为 ...

  5. webkit技术内幕读书笔记 (一)

    本文部分摘录自互联网. Chromeium与Chrome Chromium是Google为发展自家的浏览器Google Chrome而打开的项目,所以Chromium相当于Google Chrome的 ...

  6. MySQL技术内幕读书笔记(八)——事务

    事务的实现 ​ 事务隔离性由锁来实现.原子性.一致性.持久性通过数据库的redo log和undo log来完成.redo log称为重做日志,用来保证事务的原子性和持久性.undo log用来保证事 ...

  7. MySQL技术内幕读书笔记(七)——锁

    锁 ​ 锁是数据库系统区分与文件系统的一个关键特性.为了保证数据一致性,必须有锁的介入.数据库系统使用锁是为了支持对共享资源进行并发访问,提供数据的完整性和一致性. lock与latch ​ 使用命令 ...

  8. MySQL技术内幕读书笔记(六)——索引与算法之全文索引

    全文索引 概述 ​ 通过索引字段的前缀进行查找,B+树索引是支持的,利用B+树索引就可以进行快速查询. SELECT * FROM blog WHERE content like 'xxx%'; ​ ...

  9. MySQL技术内幕读书笔记(二)——InnoDB存储引擎

    目录 InnoDB存储引擎 InnoDB存储架构 Checkpoint技术 Master Thread 工作方式 InnoDB关键特性(放一下,感觉看后面,再看总结吧) InnoDB存储引擎 Inno ...

随机推荐

  1. EBS中使用JAVA方式发送HTML格式邮件

    转自huan.gu专栏:http://blog.csdn.net/gh320/article/details/17174769 EBS中使用JAVA方式发送HTML格式邮件 一.开发工具:JDevel ...

  2. bash shell while语法

    在编写脚本时,一定要注意空格 基本语法: while [ condition ] do command1 command2 command3 done condition为true时命令1到命令3将会 ...

  3. 删除表中重复行SQL

    delete from table_name a where rowid < (select max(rowid) from table_name b where a.col1 = b.col1 ...

  4. 关于V4L2中操作比较重要的几个命令以及一般操作流程总结

    最近在做关于摄像头测试程序相关的一些开发,主要是想要实现在摄像头采集视频的过程中,通过按键来实现拍照,然后将拍照得到的数据保存到一个文件中,通过了解V4L2的一些相关操作,原来,拍照后的数据是保存在一 ...

  5. Java进阶(四十)Java类、变量、方法修饰符讲解

    Java进阶(四十)Java类.变量.方法修饰符讲解 Java类修饰符 abstract: 将一个类声明为抽象类,没有实现的方法,需要子类提供方法实现. final: 将一个类生命为最终(即非继承类) ...

  6. 1.QT中播放视频,录音程序的编写

     1  通过process的方式播放视频 T22VideoPlayer.pro HEADERS += \ MyWidget.h SOURCES += \ MyWidget.cpp QT += gu ...

  7. 【一天一道LeetCode】#205. Isomorphic Strings

    一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given t ...

  8. SQL性能优化应该考虑哪些?

     1.调整数据结构的设计.这一部分在开发信息系统之前完成,程序员需要考虑是否使用ORACLE数据库的分区功能,对于经常访问的数据库表是否需要建立索引等. 2.调整应用程序结构设计.这一部分也是在开 ...

  9. eclipse代码恢复(开发程序代码恢复)

    如果误操作,让本地代码丢失了不用怕,Eclipse local history可以恢复. 误删除文件后,直接ctrl+z可以恢复. 拉去代码覆盖了本地,也可以一个一个或者整体进行恢复:http://b ...

  10. [Linux]vbox 虚拟机添加新磁盘

    情况是这样的,开始创建虚拟机的时候硬盘设置太小了,只有10g,我现在通过vbox的设置给这个linux(centos6.6)虚拟机添加了一块硬盘. 下面的操作就是怎么把硬盘挂载到系统中. 通过 fdi ...