开发规范学习心得

  
开发规范学习心得
 
单超
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 漂移的问题了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值