What,Why,How,When;
Struts2 中获取request,response,session,application 的方式1,2,
1:(1)使用帮助类ActionContext的静态方法 ActionContext.getContext()
(2)使用ServletActionContext帮助类的静态方法,ServletActionContext.getRequest();
ServletActionContext.getResponse();
2:IOC方式与EJB的方式相同,实现特定接口享受特定服务.
实现一定的回调接口.
org.apache.struts2.interceptor.ServletRequestAware;
org.apache.struts2.interceptor.ServletResponseAware;
org.apache.struts2.interceptor.ServletSessionAware;
系统的伸缩性:
1;响应时间
2:响应性
3:等待时间
4:吞吐率 对于一般企业通常用"每秒事务数"来度量.
5:负载
6:负载敏感度
7:效率
8;系统的容量. 指最大有效负载或吞吐率的指标
垂直可伸缩性和水平可伸缩性
死锁:两个事务出现相互等待对方释放的资源.
检测死锁,牺牲掉一个事务.
必免死锁:1短事务.
2合理安排表的访问顺序
3设置超时,但这有可能使并未死锁的事务出现不必要的牺牲,因为有的事务并未出现死锁,只是用的时间长一些.
4在事务开始就获得所有锁,事务进行期间不得再获取锁.
死锁:发生之前的检测,发生之后的处理.
业务事务,
系统事务.
乐观锁检测冲突,悲观锁避免冲突.
乐观锁在提交的最后才检测,这有可能要付出很大的重作代价.如果能够提前检测到并发冲突,会更有效.
Web层视图:模板视图(asp,php,jsp),转换视图(xml+xslt),两步视图.
架构上:MVC, 重要的两个分离:1.将表现逻辑和领域逻辑相分离
2.将表现逻辑和控制逻辑相分离
输入控制器的两个责任:1.处理HTTP的请求消息.
2.根据请求的消息来决定下一步做什么.
(1,2会表示成两个Map<String,String>)
FrontController
会话状态的处理:
1.客户端会话保持(1)Cookie (2)URL传参 (3)Hidden 隐藏表单域
2.服务器端会话保持.HttpSession, 有状态SessionBean.
3.数据库会话保持
系统:Linux
数据库:Oracle
面向对象,Java语言
应用服务器WebLogic
设计的臭味:
1,僵化性 Rigidity
2,脆弱性 Fragility
3,牢固性 Immobility
4,粘滞性 Viscosity
5,不必要的复杂性 Needless Complexity
6,不必要的重复 Needless Repetition
7,晦涩性 Opacity
找到一种方法,使得设计对于这种变化具有弹性,并应用一些
实践来防止这种腐化.
XP TDD,重构.
软件编程的基本:一是抽象,
二是封装,封装重复的代码,封装变化的代码.
GOF的第一条是编程(设计)到接口,不要编程(设计)到类或技术.
第二条是组合复合.
设计原则:
1,单一职责(SRP ),发散式的变仳(多个变化引起一个类的改动),
防止霰弹式的变化(一个变化引起多个类的改动),
一个类只有一个变化原因,一个变化只引起一个类的改变.
2,开闭原则(OCP Open-Closed Principle),1988年Meyer提出的.
3,Liskov里氏代换原则(LSP Liskov Substituation Principle), 子类型的可替换性,替换后行为不改变.
契约式编程:前提条件,后置条件,子类型只能弱化前提条件,只能强化后置条件(Meyer提出).
4,依赖倒置原则(DIP Dependency Iversion Prinicple), 的启发式规则:依赖抽象. 变量声明,方法参数,返回值都应使用超类型.
1>针对接口编程,不要设计到类,也不要设计到技术.
2>对变化的封装.每一个子类代表每一种变化的情况.
5,接口隔离原则(ISP Interface Segregation Prinicple) , 接口定义类型,客户消费类型,应当给客户最准确的类型以使用.
6,迪米特法则(LoD Law of Demeter) 关于类的内聚性和类之间的耦合性.
7,组合复合法则(CARP).
-----------------------------------------------------------------------------
包的六个设计原则:
一.包的内聚性(如何把类划分到包中)
1.重用发布等价原则.
2.共同重用原则(使用包中的一个类,则要重用包中的所有类).
3.共同封闭原则,(与类的单一职责遵守相同的原则).
二.包的耦合性(用来处理包之间的关系)
1.无环依赖原则.
2.稳定依赖原则(朝向稳定的方向进行依赖).
3.稳定抽象原则(包的抽象程度应和它的稳定程度相一致)
类的内聚性和类之间的耦合性.
///////////////////////////////////////////////////////////////////////////////////////////////////////////
重构: 名词:对软件内部结构的一种调整,目的是在不改变软件外部行为的前提下,提高其可理解性,降低其修改成本.
动词:使用一系列重构准则(手法),在不改变软件外部行为的前提下,调整其结构.
重构与性能的关系:
重构时机:1>系统增加功能时
2>修补错误时.
3>理解代码时,看是否可以用代码替代注释.
4>复审代码时.
5>开发时,时时重构,使重构成为一种习惯,而不是一种负担.
代码的坏味道:
1.重复的代码.(1)提炼出private方法,让其它方法调用它,在同一个类内.如果另外一个类也需要调用此方法,则应决定是否是其中一个类调用另一个类的方法,还是应将此方 法抽取到第三个类中,让另两个类都调用第三个类.
(2)互为兄弟的两个子类,提炼方法,并放置到超类中.
(3)提炼出方法,让其它方法调用它,需要确定方法的位置,Foreign Method(抽取到第三个类中),WrappedMethod(抽取到继承体系中).
2.过长方法.
3.过大类.
4.过长参数列.使用parameter object
5.发散式变化.(多个变化引起一个类发生变化)
6.霰弹式变化.(一个变化引起多个类发生变化)
7.依赖情结.方法,类的职责.
原则: 将总是一起变化的东西放在一起,Visitor,Strategy模式.
public class FirstCls {
public void process(Entity entity) {
int id = entity.getId();
String name = entity.getName();
.....//操作
}
}
public class Entity {
public void process() {
int id = this.getId();
String name = this.getName();
.....//操作.
}
}
//重构后的FirstCls
public class FirstCls {
Entity entity = ...;
public void process() {
entity.process();
}
}
8.数据泥团.将散乱的数据封装到一个值对象中,然后再添加操作以成为一个真正的对象.
9.基本型别偏执(Primitive Obsession)
10.switch惊悚现身(if then else).将条件语句转化为多态调用.
11.平行继承体系.
12.冗余类.(Lazy Class)
13.夸夸其谈未来性.
14.令人迷惑的临时变量.
15.过度耦合的消息链.
16.
17.
18.
19.不完美的程序类库.(Imcomplete Library Class):Foreign Method,Wrapped Method/SubClass Method
20.纯数据类.(Value Object)
21.将不正确的继承关系重构为两个兄弟类,并提取这两个类的超类.
22.过多的注释.当需要写注释的时候,试着是否可以用提炼代码代替注释.
////////////////////////////////////////////////////////////////////////////////////////////////////////////
临时变量只应赋值一次不应再次赋值.
临时变量只在它所处的方法中有意义.
而提炼到方法(Extract Method)中,则可以在整个类中被调用.
方法头表达“做什么”
方法体表达"怎么做",是对方法头的实现.
解释性变量.
Split Temporary Variable
在Java中不要对参数赋值.
Feature特性
Foreign Method(工具类),继承和Wrapper
类以名词命名
方法以动词命名.
消除方法的副作用(Modifier与Query分离开来).
Parameter Object
程序的健壮性:(1)优雅的失败.(2)设置默认值.(3)纠错能力,写一段恢复代码,重新回到正常的程序流中.
异常对程序的健壮性是有帮助的,编译期或运行期.
断言:程序执行的一种必要条件.
梳理并分解体系:建立两个继承体系,并通过委托关系,让其中一调用另一个,
(形式上很像Bridge Pattern,但与实质上所要表达的意义与Bridge Pattern有着根本的不同,
Bridge Pattern只是将一个继承体系分解开来,外观上是两个继承体系一个调用另一个,但
在概念上这两个继承体系所表达的仍只是一个继承体系,但经过这样的分解,使得继承强耦合的关系
变得可以在运行时动态组合,以带来灵活性,但代价是增加了复杂性.)
首先提炼类(Extract Class),将不同的责任进行分离.
再进行Move Method 和 Move Field.
/////////////////////////////////////////////////////////////////////////////////////////////////////
DI (Dependency Injection)依赖注入.
容器:指应用代码的运行框架. EJB容器,Web容器(管理Servlet),第三方的轻量级容(Spring).
任何容器都应提供的服务:
1.生命周期的管理
2.查找服务
3.配置管理
4.依赖决议.
一个轻量级容器应该有的特性:
1.管理应用代码.
2.可以快速启动
3。不需要任何特殊的部署步骤。
3。最小限度地依赖API,可以确保运行在不同环境中.
4。将对象交给轻量级容器管理时,不管工作量,还是性能都是最小.
Strategy 和 Template Method 组合和继承之间的选择.
提供服务,一种方式是使用回调接口,一种方式使用AOP方式将服务提供给容器中的对象.
编程性和声明性,如果能以声明性则优先选择声明性方式.
对象池: 积极Cache,时间和空间的折中.
依赖查找(提供一个工厂类)和回调接口(加入容器,以提供服务)
依赖注入的原则:应用对象不应该负责查询资源或其它依赖的组件,配置对象的工作应该由IOC容器完成,查找资源的代码
应该从应用代码中抽离出来,交由容器负责.!
OOP是一种层级关系的,继承性使得不同类型的对象共用相同的代码,多态性让我们用同样的方式处理不同类型的对象.
尽量少的重复代码,但无法避免代码的重复.
AOP的目的将分散的横切性逻辑进行模块化.
框架设计:IOC + AOP.
/////////////////////////////////////////////////////////////////////////////////////////////
XML 与 Java
解析XML DOM,SAX
DOM API:1,导航类方法 用于从一个节点转换到另一个节点.
2,信息类方法 用于获取给定节点的相关信息(查询).
3,管理类方法. 用于修改或设置一个节点的值或父子关系(增删改)
Node是所有节点的的超接口.
Document接口表示整个文档,并且它是创建各节点的工厂。
////////////////////////////////////////////////////////////////////////////////////////////////////////////
面向对象的基本概念:
对象:对象标识符,状态,操作. 它是类的实例化.
类:具有相同或相似性质的对象的抽象就是类.
面向对象的编程-1.重复代码的处理.
2.依赖倒转,如果编码是依赖倒转的,则是面向对象的,否则编码是过程性的.!
类的结构:通常有两种主要的结构关系. 1,is a 关系, 2, has a 关系.
类之间的关系完整描述(由弱至强):依赖,关联,聚合,复合,继承. 五种关系.前四种是运行时动态链接,继承是编译期链接.
类之间的耦合性:1.无耦合
2.具体耦合
3.抽象耦合(努力的方向)
通常,面对一个典型的面向对象程序,[Budd 2002]将其分成五个抽象层,分别覆盖了OOP中的分析,设计与编程的各个阶段:
1, 最高级别的抽象层上,程序被看成是由很多相互作用并且遵守契约的对象所组成的对象集合。对象之间相互合作完成程序的计算任务。这个抽象级别上的典型代表就是设计模式思想(Design Pattern)。
2, 第二个抽象层就是一个对象集单元,也就是一群定义之间有相互联系的对象,在程序设计语言级别来看Java中是packages,C++中是name space。这个抽象级别上的典型代表就是模块化思想(Modularity)。
3, 第三个抽象层所代表的是典型的OOP模式:客户/服务器模型,这主要是用来抽象两个对象之间的互交过程。在这个抽象级别上的典型代表就是对象之间的消息机制(Message Passing)。
如果能建模成"客户/服务器"模型就要使用这个模型,这样可以将对象建模成服务提供者和服务消费者.有利于建模.
4, 第四个抽象层就是针对一组相似对象定义一个类作为生成对象的模板,类定义了对象的对外使用接口以及继承对象所需的内部继承接口,而这个抽象层次的典型代表就是接口编程(Interface Programming)。
5, 第五个抽象层就是实现一个类所需要的方法和成员变量的实现(Implementation)。在这里OOP最终和POP(Procedure-Oriented Programming)相融合。
Introspector --> BeanInfo --> BeanDescriptor
--> PropertyDescriptor
--> MethodDescriptor
--> EventSetDescriptor
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
HTTP协议
HTTP消息:请求消息和响应消息.
格式:开始行(请求行或状态行),消息报头(可选的),空行(只有CRLF的行),消息正文(可选的)
请求消息:请求行,消息报头,.......
GET /form.html HTTP/1.1(CRLF)
....(消息报头)
CRLF
....(消息正文)
响应消息:状态行,消息报头,.......
HTTP/1.1 200 OK(CRLF)
....(消息报头)
CRLF
....(消息正文)
消息报头:(1)普通报头
(2)请求报头
(3)响应报头
(4)实体报头.
每一个报头域都是由 (名字 + ":" + 空格 + 值) 组成.
请求消息
HEAD /index.shtml HTTP/1.1
Host: www.sina.com.cn
响应消息
HTTP/1.0 200 OK
Date: Mon, 27 Jul 2009 08:56:27 GMT
Server: Apache/2.0.63 (Unix)
Last-Modified: Mon, 27 Jul 2009 08:50:05 GMT
Accept-Ranges: bytes
X-Powered-By: mod_xlayout_jh/0.0.1vhs.markII.remix
Cache-Control: max-age=60
Expires: Mon, 27 Jul 2009 08:57:27 GMT
Vary: Accept-Encoding
X-UA-Compatible: IE=EmulateIE7
Content-Type: text/html
X-Cache: MISS from xd33-91.HP08040030.sina.com.cn
Connection: close
/////////////////////////////////////////////////////////////////////////////////////////////////////////
复合视图组成方式.
include指令(转译包含)
jsp:include(runtime包含)
自定义标签(不要做超出视图角色之外的事情,事实上自定义标签是页面组成的一部分).
Web层与复合视图.
首先我们先明确Web层的设计目标"细而薄",
Web层的Controller用来控制流程和启动业务逻辑,
将控制逻辑与显示逻辑相分离.
Controller截获请求并分发到处理器,处理器处理完毕选取视图返回到Controller,Controller转发特定视图.
观察者模式:
1.推模型(适合复杂数据)和2.拉模型(适合小数据量).
MVC模型.
1.推(PUSH)模型(C/S)和2.拉(PULL)模型(B/S).
视图与控制代码的分离.
视图与模型代码的分离.
Web层应该含有尽可能少的业务处理代码,这可提高可测试性和可重用性,这样就可以保证整个Web层的替换,可以使用WebService
做为服务消费者.即使不是整个Web层的替换,JSP的替换仍然是可以的.JSP只用来做为数据采集入口和数据显示(可能会包含显示逻辑).
Wap页面和Html页面可以共用相同的Web层的控制代码.
显示逻辑
控制逻辑
业务逻辑
数据访问逻辑
JSP充当视图之外角色引起的问题:
1.这个JSP页有两个角色(显示一个输入表单和显示该表单的结果),使它阅读起来混淆不清.
2.模板数据与JSP之间的参数转义是混淆不清的,虽然JSP创作工具将帮助防止不匹配的<%和%>,但没有任何办法使本页面中的Java控制结构(if,try/catch)与标签生成的组合变得更易读。理解视图需要Java知识,但页面人员不懂Java.
3.重复代码收引起的问题,JSP页面和一些业务对象的EJB实现结合在一起,如果我们弃用EJB,将需要修改所有 这样的页面.
4.JSP页的结构没有体现它将生成的内容,在它的每个角色中,输出结果将是不同的。异常处理是原始的,当我们正在生成动态内容的时候,我们可能会遇到错误,而处理它们太迟了,错误将会导致产生错误页面,由于处理不及时,以致不能对特定类型的错误执行适当的控制流程.
5.增加诸如用户输入是数值之类的检查并相应地警告用户将是困难的,页面将会变得更难读懂.
6.服务器小程序中有太多的JAVA代码,以致观察将被生成的标签是很困难的。
7.由于使用了像这样的JSP页面,所以修改表示层代码可能会破坏业务逻辑.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
<!--hibernate-mapping DTD文档 -->
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--hibernate-configuration DTD文档-->
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
时间和空间的折中:
每一种数据结构与算法都有其时间、空间的开销和收益。当面临一个新的设计问题时,设计者要彻底地掌握怎样权衡时空开销和算法有效性的方法。这就需要懂得算法分析的原理,而且还需要了解所使用的物理介质的特性(例如,数据存储在磁盘上与存储在内存中,就有不同的考虑)。
与开销和收益有关的是时间——空间的权衡。通常可以用更大的时间开销来换取空间的收益,反之亦然。时间——空间的权衡普遍地存在于软件开发的各个阶段中。
例如:ArrayList 和 LinkedList
分享到:
相关推荐
这个“自动Netty笔记111”可能是某个开发者或学习者记录的一系列关于Netty学习过程中的关键点和理解。下面将详细阐述Netty的相关知识点。 1. **异步事件驱动模型**: Netty采用了非阻塞I/O模型,基于Java NIO(Non...
《编译原理笔记111.pdf》主要涵盖了编译器构造中的重要概念,特别是与语法分析相关的知识。编译原理是计算机科学中的一个关键领域,它涉及到将高级编程语言转换为机器可理解的低级代码的过程。以下是笔记中的主要...
斯坦福ML公开课笔记111 本文对应斯坦福ML公开课的第11个视频,主要讲述机器学习算法的诊断、误差分析、销蚀分析和过早优化等内容。同时,也涉及到贝叶斯统计和正则化的知识点。 贝叶斯统计 贝叶斯统计是统计学的...
【索尼笔记本热键控制驱动】是为了解决索尼笔记本电脑用户在使用FN热键时遇到的问题,特别是关于调节音量和屏幕亮度的功能失效。FN热键是笔记本电脑上一种便捷的快捷方式,允许用户在不借助功能键区或系统设置的情况...
计数:0 1 10 11 100 101 110 111 单位数字:2个(0-1) 扩展:所有数据在计算机底层都会以二进制的形式保存。可以将内存想象成一个含有多个小格子的容器,每一个小格子中可以存储一个0或一个1,这一个小格
笔记本电脑的CPU发展历程是计算机科技进化的一个重要篇章。在过去的几十年里,为了满足移动计算的需求,CPU技术经历了显著的进步,特别是在功耗控制、热管理、性能优化等方面。笔记本CPU的发展始于1980年代,当时...
Redis 是一个开源的、高性能的键值存储系统,由Salvatore Sanfilippo(也称为Antirez)在2008年开发。它最初是为了解决MySQL在高并发场景下的性能瓶颈问题而诞生的,使用C语言编写,支持网络、可持久化的内存数据库...
【云笔记项目描述】 云笔记项目是一个旨在提供跨平台数据同步服务的应用,使得用户可以在不同设备之间方便地管理和访问他们的笔记。随着智能手机和平板电脑的普及,人们对在多个设备间同步个人数据的需求日益增长,...
华为学习笔记,
笔记 一些学习笔记 111
3. Windows 将自动计算机允许压缩出的最大磁盘空间,我们可以看到能够压缩的最大空间是 111GB 左右,然后单击“压缩”; 4. 压缩完成后,磁盘管理中会多出一个未分配的空间,我们可以在未分配的空间上,右键单击,...
临时临时111
在《新概念3册Lesson111》这篇课文——"Not guilty"中,我们学习了与海关官员打交道以及如何应对可能的误解的故事。这个故事揭示了一些重要的知识点,包括词汇、短语、句子结构以及文化交流。 首先,我们关注一下...
user_function=100, (eval("3" // $_self.numforce)), (eval("10" // $_self.num)), (eval("34" // $_self.num)), (.cvj.mycaogao), 111, (eval($_self.num)), 1 ``` 3. **编译与调用**:编译子程序生成DLL,并在...
【新概念4册Lesson 111】这篇课文探讨了一个深刻的主题:对死亡的恐惧,特别是在不同年龄段的人群中如何表现。文章指出,年轻人对于死亡的恐惧往往有其合理之处,比如那些面临战争威胁的年轻人,他们担心失去生活的...
**JDBC编程笔记** JDBC(Java Database Connectivity)是Java语言中用来规范客户端程序如何连接数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。本笔记将深入探讨JDBC的核心概念、使用步骤以及常见...
match access-group 111 policy-map PM class telnet set ip precedence 5 ``` - **Service-Policy** - Service-Policy 用于将Policy-Map应用到接口上。 - 例如,在某个接口上应用上述策略: ```plaintext ...
6.2.2 使用return命令 111 6.2.3 使用函数输出 112 6.3 在函数中使用变量 112 6.3.1 向函数传递参数 112 6.3.2 在函数中处理变量 113 6.4 数组变量与函数 114 6.4.1 向函数传递数组 114 6.4.2从函数返回数组 115 6.5...
《信息系统项目管理师教程笔记》是对信息技术领域项目管理的深入探讨,主要涵盖了项目的基本属性、管理过程、项目生命周期以及组织结构等多个方面。以下是对这些知识点的详细解析: 1. **项目的基本属性**: - **...
PMP(项目管理专业人士)认证是...以上只是PMP学习笔记中的部分要点,PMP认证的全面知识体系还包括其他许多主题,如沟通管理、干系人管理、质量管理、成本管理等。通过系统学习和实践,可以提升项目管理的专业水平。