Struts2技术内幕 读书笔记二 web开发的基本模式
最佳实践
在讨论基本模式之前,我们先说说一个词:最佳实践
任何程序的编写都得遵循一个特定的规范。这种规范有约定俗称的例如:包名全小写,类名每个单词第一个字母大写等等等等;另外还有一些需要我们严格遵守的:例如我们写自己的servlet的时候就得继承javax.servlet.http.HttpServlet接口。
在标准之上的是对不同标准的具体实现。例如同是servlet标准,tomcat有一套实现方式,Websphere又有不同的实现方式。
在程序员级别来说,面对复杂的业务流程,不同的程序员会有不同的实现方式。这就是程序的差异性,我们不否则差异性有点时候能提升效率,但是这种差异在更多的时候带来的是维护的难度的增加。尽管业务是不同的,具体的底层代码实现也肯定是不同的,但是出于对可维护性和可读性的要求,我们还是希望系统从代码之上的架构层次(宏观层面)看上去是一致的。这个目标我们就称之为最佳实践。
总而言之:最佳实践,就是无数程序员经过无数次的探索,尝试后,总结出来的处理特定问题的一套特定方法。如果我们把每个程序员的自由发挥作为通往成功的一条道路,那么先辈们已经总结出来的最佳实践,就是其中最短的捷径。
但是我们还是得说:尽管程序界已经有了很多的最佳实践,例如spring,hibernate,但是我们的系统又是各不相同的,我们绝对不能生搬硬套,能打开真理的锁的钥匙永远都是那把最合适的。
程序的设计是一门艺术,我们面对的大部分问题都没有一个绝对的最好的优于一切的方法。最多的情况都是这样,这种方案也好,那种方案也不错,此时我们就需要找一个"最合适的"。
目前我们能用到的几个最佳实践就包括:
始终保持程序的可读性,可扩展性,可维护性;
简单是美
尽量使用面向对象的思想
减少依赖
分层开发模式
我们谈的web开发的基本模式其实就是分层开发模式。
所谓的分层开发模式就是指在开发j2ee程序时,将整个程序根据功能职责进行纵向划分。
那么为什么要分层?
分层的原始驱动力也是我们之前说的对程序的可读性与可扩展性的追求。
只有把不同的功能职责的代码分开,才能使程序更加清晰明了------可读
把相似的功能归结为一个纵向层次,才使得在这个层次上研究一种通用的解决方案成为可能-----可扩展
最典型的划分方式就是将整个程序分为:表现层(Presentation Layer),业务层(Business Layer),持久层(Persistent Layer)
如下:
不同的层次,分配着不同的任务
表现层: 负责处理与用户交互的相关功能
业务层: 负责负责的业务逻辑计算与判断
持久层: 负责将业务数据进行持久化存储
不过在讨论分层的时候,我们又不得不面对两个问题
一 是否有必要分层?
二 如果分层,分几层?
先说第一个问题,如果项目很小,确实就没有必要分层了,就是俗话说的"杀鸡焉用牛刀""高射炮打蚊子";不过如果项目很大,牵扯到各个方面,那么此时使用分层开发模式就是是有意义的。
第二 如果分层,分几层?之前说了有一个最佳实践是"简单是美"所以我们希望将分层做的简单。但是实际上,对这个问题也没有绝对打答案,因为一切脱离了业务实际的架构设计都是虚幻的我们只能在实践中不断地摸索,把前人的经验作为我们程序分的重要依据。
其实我们所熟知的那些框架就是针对各个开发层次的编程问题而设计的解决方案。
例如 spring服务于业务层,hibernate服务于持久层,struts就工作再表现层。
MVC模式
在分层开发的前提下,每一层我们都可以拿出来单独研究并寻找最佳实践。对于表现层来说,MVC模式被广泛的应用,并且在此基础上创建了许多成熟的框架。(MVC是一种思想,而不是一种技术,它本身并不是代码,就像我们在程序中说的接口,记住,它只是一种思想而已)
M(Model)----数据模型
V(View)----视图展现
C(Control)----控制器
所谓的mvc模式就是通过元素分解来处理基于"请求----响应"模式的程序的开发中遇到的问题。
任何一个B/S应用,其本质就是一个"请求----响应"的处理过程集合体。
现在我们看看"请求----响应"的过程。
在图中,至少有三个元素是不可或缺的:
数据模型:
在图中就是顺着箭头方向进行传输的数据,他们是程序的核心载体。
对外交互:
我们可以理解我两部分,一个"头",一个"尾"。头是我们一切请求的开始,没有头,后面的一切都无从谈起;尾是最后的表现,我们得告诉系统外部的观察者我们最终的执行结果。
程序的执行和控制:
它不仅接受请求,也要处理请求,并且在处理完后还要负责相应跳转。
在很久之前,我们使用servlet来作为程序的执行和控制部分,后来我们有了struts,就使用了它所提供的action,也许几年后,struts也会走下历史舞台,我们会使用一种新的技术来作为程序的执行和控制。但是,如果我们忽略这些外在的表现形式,其内部不就是MVC吗?
数据模型-----------M
对外交互-----------V
程序的执行或控制----C
其实我们很早都这样用了,我们缺乏的只是把这个概念挖掘出来的能力而已。现在我们再看看一个经典的MVC模型图:
我们需要做的就是为这些框赋予不同的表现形式。其实框架干的就是这个事,只不过框架除了赋予上面几个元素一定的表现形式外还解决了各个元素运行起来所遇到的问题而已。
下一节,我们就先忘掉所有的框架,用最原始的方式来实现MVC模式,并且说说表示层所遇到的几个问题。
Struts2技术内幕 读书笔记二 web开发的基本模式的更多相关文章
- Struts2技术内幕 读书笔记一 框架的本质
本读书笔记系列,主要针对陆舟所著<<Struts2技术内幕 深入解析Strtus2架构设计与实现原理>>一书.笔记中所用的图片若无特殊说明,就都取自书中,特此声明. 什么是框架 ...
- Struts2技术内幕 读书笔记三 表示层的困惑
表示层能有什么疑惑?很简单,我们暂时忘记所有的框架,就写一个注册的servlet来看看. index.jsp <form id="form1" name="form ...
- 深入理解linux网络技术内幕读书笔记(二)--关键数据结构
Table of Contents 1 套接字缓冲区: sk_buff结构 1.1 网络选项及内核结构 1.2 结构说明及操作函数 2 net_device结构 2.1 MTU 2.2 结构说明及操作 ...
- webkit技术内幕读书笔记 (二、三)
可视区和网页 通常网页比屏幕的可视区面积要大,因此当网页内容在可视区中放不下时,一般浏览器会提供滚动条. 从URL到构建完DOM树的过程 当用户输入网页URL的时候,WebKit调用其资源加载器加载该 ...
- webkit技术内幕读书笔记 (一)
本文部分摘录自互联网. Chromeium与Chrome Chromium是Google为发展自家的浏览器Google Chrome而打开的项目,所以Chromium相当于Google Chrome的 ...
- 深入理解linux网络技术内幕读书笔记(三)--用户空间与内核的接口
Table of Contents 1 概论 1.1 procfs (/proc 文件系统) 1.1.1 编程接口 1.2 sysctl (/proc/sys目录) 1.2.1 编程接口 1.3 sy ...
- Kafka技术内幕 读书笔记之(四) 新消费者——新消费者客户端(二)
消费者拉取消息 消费者创建拉取请求的准备工作,和生产者创建生产请求的准备工作类似,它们都必须和分区的主副本交互.一个生产者写入的分区和消费者分配的分区都可能有多个,同时多个分区的主副本有可能在同一个节 ...
- MySQL技术内幕读书笔记(二)——InnoDB存储引擎
目录 InnoDB存储引擎 InnoDB存储架构 Checkpoint技术 Master Thread 工作方式 InnoDB关键特性(放一下,感觉看后面,再看总结吧) InnoDB存储引擎 Inno ...
- Kafka技术内幕 读书笔记之(二) 生产者——服务端网络连接
KafkaServer是Kafka服务端的主类, KafkaServer中和网络层有关的服务组件包括 SocketServer.KafkaApis 和 KafkaRequestHandlerPool后 ...
随机推荐
- Eclipse简介和使用技巧快捷方式
1Eclipse简介和使用 IDE(Integrated Development Environment ): 集成开发环境,集合开发.运行.调试于一体的一个软件 Eclipse 是一个开放源代码的. ...
- /proc/stat 详解
在Linux系统中,可以用/proc/stat文件来计算cpu的利用率.这个文件包含了所有CPU活动的信息,该文件中的所有值都是从系统启动开始累计到当前时刻. cat /proc/stat cpu 6 ...
- EBS客户化迁移SQL
检查一些作废了的东西是否在程序包中还有用 SELECT t.* FROM ALL_SOURCE T WHERE T.TEXT LIKE '%CUX_AP_OA_OMS_PROGRAM_ELECT%' ...
- FFmpeg的HEVC解码器源代码简单分析:CTU解码(CTU Decode)部分-PU
===================================================== HEVC源代码分析文章列表: [解码 -libavcodec HEVC 解码器] FFmpe ...
- linux下的环境变量
环境变量有时候要查找,但是经常忘记有哪些文件,现在做一个总结: /etc/profile 此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行.并从/e ...
- 15 ActionBar 总结
ActionBar 一, 说明 是一个动作栏 是窗口特性 提供给用户动作 导航模式 可以适配不同的屏幕 二, ActionBar 提供的功能 1. 显示菜单项 always:总是展示到ActionBa ...
- iOS7 CookBook精彩瞬间(三)UIActivityViewController的基本使用及自定义Activity
1.基本使用 UIActivityViewController主要用于分享内容,创建activityView的方法很简单,调用下面的方法创建: [[UIActivityViewController a ...
- spark idea 的配置问题
不知道下面的错误是为什么? Error:scalac: missing or invalid dependency detected while loading class file 'RDD.cla ...
- Servlet编程实例-servlet学习之旅(三)
LoginServlet代码: public class LoginServlet extends HttpServlet{ @Override protected void service(Http ...
- iOS中 static变量与全局、局部变量的区别 !
static变量与全局.局部变量的区别 全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量.全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式. 这两者在存储方式上并 ...