开发规范学习心得
单超
2007.8.15
日
1
。文件名大小写的规定,
JSP
文件必须全部小写。
原因:开发时用的是
windows
的平台,
windows
并不区分文件名的大小写。而真正实施的时候使用的是
UNIX
平台,他完全区分大小写,所以如果开发时候不遵守这个规范,很可能就会在
windows
平台下把这个问题遗漏掉。
2
。在
update
操作前,必须先把这条记录查出来再
update
原因:这个涉及到
Hibernate
的缓存机制,不是很理解。
3
。
catch
块中不允许写任何逻辑代码。
原因:正常的业务逻辑不应该依赖于异常的捕获。
4
。原则上不允许启跨方法的长事务。
原因:长事务比较复杂。
长事务涉及的问题有这么几个:
第一、长事务的开启和关闭应该由哪个方法来做。
第二、长事务必须在一个线程上完成,否则没有意义。
解决方法:
第一、判断线程上是否有开启的事务,如果有,说明当前方法是事务内的一个子部分,不需要开启和关闭事务,如果没有,说明该方法是事务的发启者,必须开启和关闭事务。
第二、把事务绑定在当前线程之上,就解决了一个事务必须在一个线程上完成的问题。
5
。事务必须尽量短小
说明:组织数据的操作应该放在事务的外面,事务应该只执行
OP
操作,保持尽量简短
原因:如果事务体写的比较大,就会出现以下三个问题
第一、占用回滚段资源
第二、事务执行期间锁表
第三、占用连接池的连接
6
。事务的提交和回滚必须非常小心
原因:如果在事务内部使用了循环,判断,分支等结构,必须让每一个分支都走到提交或回滚的操作上。否则很容易产生既没提交也没回滚的脏连接。这样就会锁定很多的表。会造成十分严重的错误。
7
。调用存储过程
(
这一块没太明白
)
注意:调用存储过程这一块,不是使用
hibernate
写的,而是使用了
JDBC
。因为
hibernate
作为一个通用的
ORM
,不应该也不会去过多地关注各个数据库的特殊处理,而调用存储过程的操作各个数据库都是不一样的,所以
hibernate
对这方面的支持就十分微弱。
注意:存储过程中发生的错误是无法用
java
代码捕获的,所以所有调用存储过程的
JAVA
代码都会得到标识了存储过程执行成功或失败的返回值,我们必须根据这个值,手动地抛出一个异常。
8
。防止重复提交
重复提交有以下三种情况:
第一、连续点按纽
第二、刷新页面
第三、后退
(
客户不会经常犯这样的错误
)
解决办法有三个,分别针对以上三点
第一、
javaScript
控制,又细分为两种,一种是按钮置灰,一种是在页面加载时,在
page_init()
方法中,将表单里的值全部记录下来,然后在点业务按纽时,判断当前表单值是否与加载时的值一样。如果一样,不允许提交。
第二、所有业务逻辑的
Action
配置的
ActionForward
都必须重定向到查询页面,注意:一个是必须用重定向,而不是转发,再一个是必须重定向到别的,无法提交业务逻辑数据的页面。
第三、使用
struts
的令牌机制。
(
具体的不太明白
)
9
。保留查询条件
(form=save)
原理:以当前的
url
为
key
,以查询
form
中的值集为
value
,在
session
中保存
10
。保留分页信息
(
有个专门的标签,忘了是什么
)
原理:以当前的
url
为
key
,以翻页按纽上的
href
为
value
,在
session
中保存
11
。引入脚本文件或
CSS
文件时,必须使用
base
标签的属性而不能自己引入。
原因:如果自己引入,就必须写出
CSS
或
JS
的地址,那么就存在两种选择,一是写地址的绝对路径,二是写相对路径。这两种做法都存在以下问题。
第一:如果写绝对路径,就相当于把项目名硬编码进去。
第二:如果写的是相对路径,当页面发生迁移时,由于页面的
URL
显示的是
Action
的地址。那么就会出现相对路径的参照点不确定,那么相对路径也就没有意义了。
12
。如果要在页面加载完毕后执行一段
javaScript
代码,必须将这段代码写在
page_init()
方法中,而不能在页面的底部写这些代码段。
原理:
page_init()
方法是在
base
的
onload
属性中设置了的,当页面完成加载时,就会自动调用
page_init()
方法。
page_init()
方法在
JS
文件中被定义成一个空的方法,需要我们重写这一方法。
13
。按钮的
functionId
必须要写
原因:为了以后赋权的方便
原理:
session
中缓存了这该用户的权限,在页面加载时,自定义的
button
标签,会根据这个标签上的
functionId
属性,和
session
中的用户权限,自动判断这个用户有没有权限看到这个按纽。如果用户没权限,就根本不往页面上生成这个按纽的代码;如果有权限,才往页面上写这行代码。
14
。所有的
BS
必须实现一个统一的接口。(不记得叫什么接口了)
原因:由于所有的
BS
都是一个类型的东西,所以理论上来说,他们属于面向对象世界中的一类对象,就应该有一个接口来统一他们。但是由于现在这个接口还是一个空的接口,所以还没什么用处。但是如果以后需要给所有的
BS
都加上一层功能,那么只需要在这个接口中改就可以了,现在这样做,只是为以后留出一个好的基础。
原理:
JAVA
中的接口分为两种类型,一种叫做功能接口,也就是定义了方法签名的接口。第二类是叫标志性接口,这种接口不定义任何方法,只是用来标识某个对象是属于哪一类的,比较典型的是
JAVA
的序列化接口。
15
。在检查
textarea
和长输入框的内容长度时,必须使用
getBytes
方法获取长度,不能使用
length
属性获取长度。
原因:
javaScript
只检查字数,也就是把汉字也当成一个长度,但是汉字其实是两个比特的。
原理:这个
getBytes()
方法是通过
css
的
behavior
绑定上去的。
css behavior
确实是个很牛
B
的东西。但是目前没兴趣搞明白。
16
。
UTF-8
字符集是
unicode
的一个子集,是用
12
位表示一个汉字,也就是用
1.5
个
B
表示一个汉字的。
17
。
tab
页的权限跟
button
一样。
18
。使用
session
时必须小心。
原因:真正的原因不是因为
session
耗费资源,这些都可以通过
session
管理策略来实现性能的优化。真正的原因是在
weblogic
做系统集成的时候,会发生一个叫
session
漂移的情况。
session
漂移
:
一台服务器把它内存中维护的某个
session
先序列化,然后传送给另一台服务器,接受到
session
的服务器,将这个
session
重建。经常发生的问题,
一、如果
session
中的对象没有实现序列化接口,那么就无法序列化,也就无法正确还原。
二、如果
session
中存放了大的集合,或大的
javaBean
。也就是说,存放了大的数据块,那么
session
漂移时,发生问题的可能性十分大。
目前为止,部门解决这个问题的方法,是要求客户使用硬件代理。硬件代理支持一种以客户为单位的负载均衡算法。也就是一个客户的请求始终发送给同一个服务器。
补充:代理转发请求的策略有这么几个。
第一类:
weblogic
自带集群软件的算法
1
。容灾算法。一直只用一台服务器,直到这台服务期器挂掉,就用别的备用服务器。
2
。轮询算法。将请求轮流发给各个服务器
3
。负载均衡算法。测试服务器负担,把当前请求发给负载最轻的服务器。
第二类:硬件代理的一个比较好的算法
以用户为单位转发,一个用户的请求总是发给同一个服务器。这样就不会发生
session
漂移的问题了。