终结章开始咯——【模式和Struts】,模式介绍还算精彩,Struts虽然现在版本变化很多,不过作为了解性的介绍也还是可以的:)
134、软件设计模式是“对”常见软件问题的一种可重复的解决方案(P709);
135、你很可能遇到的3个主要的非功能需求:
1)性能;
2)模块性:为了让应用的不同部分能同时在不同的主机上运行,你的软件必须是模块化的……而且要以适当的方式模块化;
3)灵活性(不仅能修改系统,而且无需经过太长的开发周期)、可维护性(想换个数据库开发商并能以最快速度完成系统更新,遇到一些不太明确的bug想尽快跟踪出来……)和可扩展性。(P710);
136、对象跨网络通信时存在一些问题,Java和J2EE提供了一些机制,可以解决其中最常见的两个难题:查找远程对象,以及处理本地和远程对象之间的底层网络I/O通信(换句话说,如何找到远程对象,以及如何调用其方法)(P715);
137、JNDI核心手册:Java Naming and Directory Interface,这是一个访问命名和目录服务的API,基于JNDI,可以在网络中的一个集中位置上完成查找。如果你有一些对象,而且希望网络上的其他程序找到并访问这些对象,就要向JNDI注册这些对象。其他程序想使用你的对象,则可以使用JNDI来查找。
RMI核心手册:Remote Method Invocation,利用这种机制,获得对象并跨网络通信的过程就能大大简化,希望一个JVM中的对象调用一个远程对象上的方法,但是,你想假装成好像调用本地对象的方法一样,这正是RMI的作用。(P715~716);
138、服务器端RMI的4大步骤:
1)创建一个远程接口,getCustData()之类的方法签名就放在这里,桩(代理)和具体的模型服务(远程对象)要实现这个接口。
2)创建远程实现,换句话说,具体的模型对象放在模型服务器上,这一步还包括向一个已知注册服务(如JNDI或RMI注册表)注册模型。
3)生成桩,还可能生成骨架。RMI提供了一个名为rmic的编译器,会为你创建代理。
4)启动/运行模型服务(它会自行向注册表注册,并等待远程客户的调用)。(P717);
139、使用和不使用RMI客户端伪代码:
不使用RMI客户 | 使用RMI客户 |
---|---|
public void goClient () { try{ //得到一个新的Socket
//得到一个OutputStream //把它链到一个ObjectOutputStream
//发送opcode及op参数 //刷新输出OS(输出流)
//得到InputStream //把它链到一个ObjectInputStream
//读取返回值和/或 //处理异常
//完成关闭工作
}//捕获和处理远程异常 } |
public void goClient() { try{ //查找远程对象(桩)
//调用远程对象方法
}//捕获和处理远程异常 } |
(P717too);
140、使用远程对象的3个步骤:
1)模型向JNDI服务注册;
2)控制器得到一个请求,控制器代码完成一个JNDI查找,得到远程模型服务的桩代理;
3)控制器在桩上完成业务方法调用,就好像桩是真正的模型对象一样。(P718);
141、控制器与桩的“中间”对象——业务委托(伪代码如下:)
//得到请求,并完成一个JNDI查找
//得到一个桩
//调用业务方法
//处理并抽出所有远程异常
//把返回值发送给控制器
(P721);
142、把业务委托中处理查找服务的重复代码抽出成——服务定位器(伪代码如下:)。
让业务委托对象只处理业务方法,而不要同时处理注册查找,这样就能提高业务委托的内聚度。
//得到一个InitialContext对象
//完成远程查找
//处理远程问题
//还可能会缓存引用
(P722);
143、远程调用 6 步骤:
1、向JNDI注册服务;
2)使用业务委托和服务器定位器从JNDI得到管理顾客桩;
3)使用业务委托和桩来得到顾客“bean”,在这里,顾客也是一个桩,把这个桩的引用返回给控制器;
4)将顾客桩引用增加到请求;
5)控制器转发到视图Jsp。Jsp从请求对象得到对顾客bean(桩)的一个引用;
6)视图Jsp使用EL得到所需的顾客bean性质,来满足最初的请求。
重要提示:JSP每次调用一个获取方法时,顾客桩都会做一个网络调用。
(P725);
144、可能会要求一个业务服务通过一个很大的粗粒度消息来发送或接收全部或大部分数据,为此,这个服务一般会在API中提供这个特性。通常,业务服务会创建一个可串行化的Java对象,其中包含大量实例变量。Sun把这个对象称为传输对象。(P727);
145、传输对象中的数据会过时!
一旦经网络传输,传输对象就与其来源完全失去联系,而且与底层数据库中的数据状态不再同步。你必须针对各个用例来确定:到底是数据的完整性/同步重要,还是性能更重要。(P727too);
146、MVC在 www 诞生之前就已存在。最初,MVC只是一种用于简化复杂GUI应用的设计。最早在Smalltalk中创建,MVC主要的特点之一就是视图会自动得到通知,可以了解到模型的变化。
最近Web 上也使用MVC,不过视图在浏览器中,当Web 层中的模型有变化时浏览器中的视图不会自动更新。我们关注的就是Web版本的MVC。
模型:保存真正的业务逻辑和状态,换句话说,它了解获取和更新状态的规则。(应用中只有这部分会与数据库通信。)
视图:表示都由视图负责,它从控制器得到模型的状态(尽管不是直接得到;控制器会把模型数据放在视图能找到的一个位置上。)
控制器:从请求取得用户输入,并向模型明确用户输入的含义。告诉模型自行更新【使视图(JSP)可以得到模型的状态】,并转发到JSP(P730);
147、控制器 3 大任务:
1)获取和处理请求参数;
2)调用模型;
3)分派到视图。(P733);
148、框架是一些接口和类的集合,这些接口和类设计为一同处理某种特定类型的问题。(对于Struts,问题空间就是Web应用)(P736);
149、前端控制器也是一种J2EE模式,基本思想是:一个组件(通常Servlet)作为Web应用表示层的一个控制点。采用前端控制器模式,则应用的所有请求都会通过一个控制器,由它处理,并将请求分派到适当的地方。(P737);
150、前端控制器特性:
1)把Web应用的初始化请求处理任务都集中在一个组件中完成。
2)结合其他模式使用前端控制器时,可以采用声明方式建立表示层的分派,从而提供松耦合。(P751)
至此,终结章采收完成。o(∩_∩)o