05软件开发程序编码规范 v1 1_第1页
05软件开发程序编码规范 v1 1_第2页
05软件开发程序编码规范 v1 1_第3页
05软件开发程序编码规范 v1 1_第4页
05软件开发程序编码规范 v1 1_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 国家旅游局旅游基础数据库建设项目详细设计说明书(软件开发程序编码规范) 北京华胜天成科技股份 I 版本控制信息 北京华胜天成科技股份 II 本文档中的所有内容为用户和专属所有。未经用户的明确书面许可,任何组织或个人不得以任何目的、任何形式及任何手段复制或传播本文分或全部内容。 版本 日期 拟稿和修改 说明 V1.0 版 2014 年 12 月 Teamsun V1.1 版 2015 年 5 月 Teamsun 目 录 1. 总则51.1 目的51.2 对象51.3 总体原则52. JSP/HTML 规范52.1 页面规范52.2 jsp/html 命名规范62.3 jsp/html 代码规范

2、82.4 模板 template 的编写规范103. JAVA 源代码规范133.1 命名规范133.2 Java 代码规范143.3 Java 安全173.4 数据库规范223.4.1 命名223.4.2 关系223.4.3 SQL 语句书写规则223.4.4 数据库安全233.4.5 其它243.5 java 程序编写规则244. J2EE 规范264.1 J2EE 开发命名规范264.1.1 开发规范264.1.2 一般代码274.1.3 Servlet 代码274.1.4 EJB 组件的命名274.1.5 异常处理294.1.6 调用过程说明304.2 J2EE 代码规范315. 文件

3、规范345.1 程序文件命名345.2 图片命名345.3 文件夹345.4 路径345.5 其它35北京华胜天成科技股份 III 6. 日志安全356.1 注意事项357. 附录357.1 提示357.2 匈牙利命名法367.3 java 代码格式样例36北京华胜天成科技股份 IV 1. 总则1.1目的在软件开发过程中,编程的工作量是相当大的,同一项目参与编程的人可能有各自编程的经验和习惯,不同风格的程序代码使维护工作变得复杂和困难。为了提高代码的可读性、系统的稳定性及降低维护和升级的成本,特编写本规范以统一各开发人员的编程工作。本规范主要目的是定义程序设计编码的总体规范,确保程序设计编码的

4、规范性,提高程序总体性能。通过遵循共同的程序设计规范,程序编码人员可以保持代码一贯的风格,提高代码编写的可读性和使用的一贯性。1.2对象括数据库,网页及应用程序开发人员,及有关的程序测试人员。1.3总体原则我们的程序首先是正确,其次是优美程序的可读性第一,效率第二程序结构清清晰,简单易懂,单个函数的程序行数不得超过500行简单,直接了当,代码精简,避免垃圾程序注释行数(不包括程序头和函数头说明部份)应占总行数的 1/5 到1/32.JSP/Html 规范2.1 页面规范u 总体要求 除非特殊情况,一律不使用弹出式页面。如需使用,需考虑到用户实际使用情况,务必做到不影响用户使用、观看。界面中必须

5、有公司或产品标识。 u 兼容性 北京华胜天成科技股份 5 尽量使用IE/Netscape等流行浏览器共有的DHTML特性,少用或基本不用IE特有的属性或方法,若用,则应加浏览器类型判断,以使用户浏览器不支持情况下用户能得到友好提示。尽量使用IE5支持的特性,少用或不用IE6特有的属性。例如,增强的浏览器栏,集成的立即消息、媒体回放,自动图片尺寸调整,Web上个人信息的保密功能等均属于IE6所特有的属性。 u 公用部分 如页面头、脚,导航条等应使用统一风格,相同内容只允许存在一个源码,使用包含方式,以便于维护。 u 窗口 所有窗口应居屏幕中央,弹出式窗口看需要,尽量也在中央。 u 尺度 以102

6、4768为基准。在800*600下应进行测试,尽量避免需使用滚动条拖拉才能看全的情况出现。2.2jsp/html 命名规范jsp与html文件名全部小写,并遵循如下的规范: u 数据/内容显示页 名词,多个单词用下划线分隔,要求能说明显示内容的信息,为避免冲突,可加上“_list”。例如:new_message.html 或 my_file_list.jsp u 操作处理页 命名格式:名词_下划线_动词,例如:file_delete.jsp。 北京华胜天成科技股份 6 u 含 frame 页面 中的name属性命名的格式是xxx._xxx_xxxxxx部分用来标识当前页面隶属于整个系统中的哪能

7、模块。以人力资源管理系统中以下四个模块的命名为例:系统设置模块system组织管理模块organ(Organization的缩写)人事服务模块humres(Human Resource的缩写) 薪酬管理模块salaryxxx部分标识当前页面所要完成的功能。如:完成用户登录的功能则被标识为login,其它情况依次类推。xxx部分用来表示页面在浏览器窗口所处的位置,其中: 处于浏览器窗口的顶部标识head处于左侧的工具条标识tool处于右侧的内容栏标识content 处于右下侧的页脚标识foot例如系统设置模块的用户登录功能的内容栏所对应的文件为system_login_content.jsp。

8、src属性相应的文件名根据情况建议在原命名规范上用下划线加上所处窗口的位置。 u javascript 脚本方法 脚本函数都以xxx_xxx的方式命名。xxx对应页面隶属的模块。xxx表示函数所要实现的功能(动宾结构),多个单词用下划线连接。例如:ebwebmail_send_mail()模块通用的脚本函数必须集合于一个js文件中,在页面上通过形式导入。js文件名命名使用模块名,例如:北京华胜天成科技股份 7 ebwebmail.js。如果项目已经提供了公共js脚本,则优先使用公共js脚本中提供的函数。所有定义方法的元素定义在中或后。 u javascript 脚本内部变量与参数 单词之间用下

9、划线分隔且全部小写,例如:var file_size。 u 表单 name 属性 统一以“form_”开头,其后加该表单所需收集的信息的作用或动作,例如:form_file_upload 或 form_send_mail 。 u 表单 elements 表单element的名称以element需收集的信息标示命全部小写,例如:词之间使用下划线分隔且 u cookie 命名 命名格式:模块名_存储信息名词(多个单词用下划线分隔) ,全部大写,例如:EBWEBMAIL_SORT_TYPE。 u window.open 中 name 参数的命名 javascript的window.open方法中有一

10、个name的参数,浏览器约定同样名字的窗口只能打开一个,如果程序间名字重复将相互冲突。如果不限制打开窗口数,可以指定或“”(不是null),否则需要加上模块名,例如ebwebmail_viewmail。2.3jsp/html 代码规范u jsp/html 描述注释 北京华胜天成科技股份 8 jsp/html页面顶部必须存在一个基本描述注释,包含功能描述、参数列表和历史修改信息,注释和源码必须保持一致,例如: u jsp 头格式 jsp头部一般需要遵循以下格式: / jdk 标准包 / java 扩展包 /使用的外部库的包 /使用的项目的公共包 /使用的模块的其他包 /include 其他的 j

11、sp /一般 jsp 都需要防止缓存 u html 格式 html头一般需要遵循以下格式: some title /some javascript 北京华胜天成科技股份 9 注意:必须指定一个有意义的,严禁出现“Untitled”或“未命名”之类的。所有html标签使用小写html页面一般需要设置一个背景色(一般是#FFFFFF)。 u html 语法校验 所有的jsp/html页面需要能够使用DreamWeaver正确打开(即html语法正确,没有错误的标记)。 u 注释 一般不使用html注释,除非是有必要让最终用户看到的内容。对于包含JSP代码的html块,必须使用JSP注释。对于没有必

12、要的注释,在发行版本中必须移除。 u form 属于域的 maxlength 对于text类型的输入域,必须根据数据库字段的长度设置相应的maxlength,例如数据库类型是VARCHAR(64),那么maxlength是32(因为中文浏览器对于中文也认为是一个字符)。2.4模板 template 的编写规范模板是一种JSP文件,它包含了参数化的内容。模板使用的是一套定制化标签来生成页面组件,封装JSP中的业务处理。模板的编写主要包括三个部分:(1)标签程序和对应Bean的编写,(2)模板标签引用文档的编写,(3)引用该标签的JSP程序的编写。 u 标签程序和对应 Bean 的编写 标签程序除

13、符合一般java程序的编写规范外,其命名一般应遵循以下规则:程序的名称与北京华胜天成科技股份 10 该标签所完成的功能相一致。如页面按钮的标签程序可命名为Button.class,页面单行文本框的标签程序可命名为Text.class,标准的页面组件对应的标签程序命名规则列表如下: 标签所对应的Bean应根据该标签所需要的参数编写,其命名规则为XXX_Bean.class,例如按钮标签对应的Bean可命名为Button_Bean.class。原则上标签程序和对应的Bean应处于同一个包中。 u 模板标签引用文档的编写 模板标签的引用文档是以.tld为扩展名的描述性文档,该文档具体描述了在JSP页

14、面中引用标签程序的相关规则:如标签名称,标签所对应的类名,标签属性名等。文档示例如下: goodsheader student.taglib.GoodsHeaderTag JSP Insert Goods Infomation id false true 该描述文档一般应存放在/WEB-INF/tlds/目录下。 u 引用标签的 JSP 程序的编写 北京华胜天成科技股份 11 组件名称 组件对应的标签程序 组件对应的 Bean 单行文本框 Text.class Text_Bean.class 按钮 Button.class Button_Bean.class 复选框 Checkbox.clas

15、s Checkbox_Bean.class 表单 Form.class Form_Bean.class 列表 Select.class Select_Bean.class 列表选项 Option.class Option_Bean.class 多行文本框 TextArea.class TextArea_Bean.class 单选框 Radio.class Radio_Bean.class 文本框 Password.class Password_Bean.class 隐藏域 Hidden.class Hidden_Bean.class JSP程序中引用标签时应首先指明标签描述程序的uri及别名,

16、JSP中对标签的引用示例如下: 北京华胜天成科技股份 12 3.Java 源代码规范3.1命名规范u Package 的命名 Package 的名字应该都是由一个小写单词组成,例如:net.ebseries.modules。 此外,对于包名我们做如下约定: . u 工具函数类包名前缀为.util Servlet 类包名前缀为.servlet test case 类包名前缀为.test 所有类包名的前缀以 com .cepri 打头 Class 的命名 Class 的名字必须由大写字母开头而其他字母都小写的单词组成,例如:DataFile 或InfoParser。 u 对象的命名

17、对象变量的名字必须用一个小写字母开头。后面的单词用大写字母开头,例如:debug 或inputFileSize。 u 变量的命名 变量命名采用数据类型_自定义名称规则定义,要求看到变量名就能直观的看出其数据类型,使用小写字母。公司统一采用匈牙利命名法,具体参照 6.2。 u 常量的命名 Static Final 变量的名字应该都大写,并且指出完整含义,例如:MAX_UPLOAD_FILE_SIZE=1024。 u 参数的命名 参数的名字必须和变量的命名规范一致。 u 数组的命名 数组应该总是用下面的方式来命名: byte buffer; 而不是: byte buffer; u 方法的参数 使用

18、有意义的参数命名,如果可能的话,使用和要赋值的字段一样的名字: SetCounter(int size) 北京华胜天成科技股份 13 this.size = size; u 属性值的存取 对于取属性值和设置属性值的方法:不管是否是 Bean,建议采用 ValueObject 对象中的 Object getProperty(Object name)和 void setProperty(Object name,Object value)来进行获取或存储,而不建议采用 getXXX(), setXXX()获得这些参数,除非在不考虑程序的可扩展性且采用ValueObject 开销过大。 3.2Java

19、 代码规范u 文件头声明 源文件的头部需要一个 history 段,对于每次对源文件的重大改动,都需要在 history 段中注明。该段定义在 package 和 import 之间,例如: /*= * Copyright: (c) 2002 - 2003 All rights reserved. * File:com.epri.dbaccess.core.TableDynamicAccess * INCULDE:TABLEDYNAMICACCESS * Modify Records * Date Author Content * = * 2003-8-16 zh

20、angsan create class * 2003-9-3 lisi update delete() * =*/ u import 顺序 import包按以下顺序: jdk标准包java扩展包(例如servlet,javamail,jce等) 使用的外部库的包(例如xml parser)使用的项目的公共包使用的模块的其他包每一类import后面加一个换行。 例如: import java.io.*; import java.util.*; import javax.servlet.*; 北京华胜天成科技股份 14 import javax.mail.*; import org.apache.

21、xml.*; import net.ebseries.*; import net.ebseries.util.*; import net.ebseries.ebwebmail.*; u 代码块书写格式 可以选择以下任意一种代码块的书写方式: if (true) /body if (true) /body 建议使用第二种书写方式。如果是修改他人的代码,必须使用代码原来的书写方式。对于代码块过长,超过1屏以上,后面要说明属于那个代码块,例如:if (i 100) /too many lines more than one screen / if (i 100) 程序中禁止采用下面的书写方式: if

22、 (true) /body ,即不允许 ,body 和处于同一行。 u 关于缩进 缩进使用4个连续空格,不要在源文件中保存tab字符, 请注意调整所用的IDE工具,打开将tab转换为空格功能。 u 页宽 页宽应该设置为80字符. 源代码一般不会超过这个宽度, 并导致无法完整显示, 但这一设置也可以灵活调整. 在任何情况下, 超长的语句应该在一个逗号或者一个操作符后折行. 一条语句折行后, 应该比原来的语句再缩进4个空格。 u 操作符 北京华胜天成科技股份 15 操作符左右各用一个空格分隔。例如: int a = b; if (a 0); u 换行规则 类定义或方法定义过长需要换行书写,例如:p

23、ublic class CounterSet extends Observable implements Cloneable private PortletSet getPortlets( Portlets portlets, RunData rundata, boolean application, boolean applicationsOnly ) u 类的注释 类的注释,一般是用来解释类的功能等内容。例如:/* Point 类主要是涉及“点”的描述,在其中定义了本程序中所需要的一些方法和属性*/ u 类的定义 public class Point extends Object impl

24、ements myInterface 类的成员变量:public 和 protected的成员变量和方法必须写javadoc注释。超过1句以上的注释使用中文书写。对于代码多于10行的private方法也要写javadoc注释。类的成员存取方法 /* * return XXXX * param XXXX * exception XXXX */ 北京华胜天成科技股份 16 u public int Function(int Parmmeter) 逻辑分支和循环条件的注释 对于代码中的逻辑分支或循环条件需要书写注释,例如:if (some condition)/符合某个条件,应该这样处理else/否

25、则应该那样处理 u main 方法 main 方法:一般应该将main(String)方法写在类的底部。3.3Java 安全遵循下面列出的准则有利于编写更加安全的代码。但是总体来说,这些准则不能对安全性做出任何保证。遵循这些准则可能好的实践,但是即使遵循了这些准则,写出的代码仍然可能是不安全的。风险永远存在,不管在编写代码时是如何的警觉。这些准则的目标,不是为了保证代码的安全性,而是为了消除若干特定类型攻击带来的风险。遵循这些准则,某些特定类型的攻击将无法实现;但是其它类型的攻击仍然可能成功。因此遵循这些准则仅仅是安全的第一步。当书写可能和非守信链接或混用的代码时,应当仔细的考虑如下准则:静态

26、字段缩小作用域公共方法和字段保护包尽可能使对象不可变(immutable)北京华胜天成科技股份 17 序列化清除敏感信息静态字段避免使用非final的公共静态变量,应尽可能地避免使用非final公共静态变量,因为无法判断代码有无权限改变这些静态变量的值。一般地,应谨慎使用可变的静态状态,因为这可能导致设想中应该相互独立的子系统之间发生不曾预期的交互。缩小作用域作为一个惯例,尽可能缩小成员方法和成员变量的作用域。检查包访问权限成员(package-private)能否改成私有成员(private),保护访问成员(protected)可否改成包访问权限成员(package-private)/私有成

27、员(private)等等。公共方法/字段公共变量应当避免使用,访问这些变量时应当通过getter/setter法。在这种方式下, 必要时可以增加集中的安全检查。任何能够访问或修改任何敏感内部状态的公共方法,务必包含安全检查。参考如下代码段,该代码段中不可信任代码可能修改TimeZone的值:保护包有时需要整体上保护一个包以避免不可信任代码的访问,本节描述了一些防护技术:防止包注入:如果不可信任代码想要访问类的包保护成员,可能通过在被攻击的包内定义自己的新类用以获取这些成员的访问权的方式。防止这类攻击的方式有两种:通过向perties文件中加入如下文字防止包内被

28、注入恶意类。北京华胜天成科技股份 18 . package.definition=Package#1 ,Package#2,.,Package#n private static TimeZone defaultZone = null; public static synchronized void setDefault(TimeZone zone) defaultZone = zone; 当检测到代码试图在包内定义新类时,类装载器的defineClass方非代码被赋予以下权限:抛出异常,除另一种方式是通过将包放到封闭的JAR(sealed Jar)文件里。(参看http:/java.sun.c

29、om/j2se/sdk/1.2/docs/guide/extensions/spec.html) 通过使用这种技巧,代码无法获得扩展包的权限,因此也无须修改perties文件。防止包访问:可以通过限制包访问但同时仅赋予特定代码访问权限防止不可信任代码对包成员的访问。通过向perties文件中加入如下文字可以达到这一目的:当检测到代码试图访问上述包中的类时,类加载器的loadClass方非代码被赋予以下权限:抛出异常,除尽可能使对象不可变(immutable)尽可能使对象不可变。如果对象必须改变,使得它们可以克隆并在方法调用时返

30、回副本。如果方法调用的返回对象是数组、向量或哈希表等,牢记这些对象并非不可变,调用者可以修改这些对象的内容并导致安全漏洞。此外,不可变的对象因为不用上锁所以能够提高并发性。不要返回包含敏感数据的内部数组引用。这个不可变惯例的变型,在这儿提出是因为是个常见错误。即使数组中包含不可变的对象比如说是字符串,也要返回一个副本,这样调用者不能修改数组中包含的到底是哪个字符串。在方法调用返回时,返回数据的拷贝而不要返回数组。北京华胜天成科技股份 19 . RuntimePermission(defineClassInPackage.+package) . . package.access=Package#

31、1 ,Package#2,.,Package#n . . RuntimePermission(defineClassInPackage.+package) . . 不要直接在用户提供的数组里存储这是不可变惯例的另一个变型。构造器和方法可以接受对象数组,比如说PubicKey数组,这个数据存储到内部之前应当克隆,并保存克隆后的数据,而不是直接将数组引用赋给同样类型的内部变量。如果缺少这个步骤,在使用了有问题的构造器创建了对象后,用户对外部数组所作的任何修改都将更改对象的内部状态,尽管对象应该是不可变的。序列化对象在序列化后、反序列化之前,都不在Java运行时环境的控制之下,也因此不在Java平台

32、提供的安全控制范围内。在实现接口Serializable时务必将以下事宜牢记在心:transient直接引用系统资源的句柄和包含了地址空间相关信息的字段应当使用关键字transient修饰。资源,如文件句柄,如果不被声明为transient,该对象在序列化状态下可能会被修改,从而在被反序列化后获取对资源的不当访问。特定类的序列化/反序列化方法为了确保反序列化对象不包含违反一些不变量集合的状态,类应该定义自己的反序列化方法并使用接口ObjectInputValidation验证这些变量。如果一个类定义了自己的序列化方法,它就不能向任何DataInput/DataOuput方法传递内部数组。所有的

33、DataInput/DataOuput方法都能被重写。注意默认序列化不会向DataInput/DataOuput字节数组方法暴露私有字节数组字段。如果Serializable类直接向DataOutput(write(byte b)方法传递了一个私有数组,那么可以创建ObjectOutputStream的子类并覆盖write(byte b)方法,这样他可以访问并修改私有数组。下面示例说明了这个问题。示例类:北京华胜天成科技股份 20 public class YourClass implements Serializable private byte internalArray; . priva

34、te synchronized void writeObject(ObjectOutputStream stream) . stream.write(internalArray); . 代码:字节流加密另一种保护位于虚拟机之外的字节流的方式是对序列化产生的流进行加密。字节流加密可以防止解码和读取被序列化对象的私有状态。如果决定加密,需要管理好密钥,密钥的存储以及密钥交付给反序列化程序的方式,等等。需要注意的其它事宜如果不可信任代码在创建对象时受到约束,务必确保不可信任代码在反序列化对象时受到相同的约束。牢记对象反序列化是创建对象的另一途径。比如说,如果applet创建了frame,在该fram

35、e上创建了警告标签。如果该frame被应用程序序列化并被applet反序列化,务必使该frame在反序列化后标有相同的警告标签。本地方法应从以下几个方面检查本地方法:返回什么需要什么参数是否绕过了安全检查是否是公共的,私有的等是否包含能绕过包边界的方法调用,从而绕过包保护清除敏感信息北京华胜天成科技股份 21 public class HackerObjectOutputStream extends ObjectOutputStream public void write (byte b) Modify b . YourClass yc = new YourClass(); . HackerO

36、bjectOutputStream hoos = new HackerObjectOutputStream(); hoos.writeObject(yc); 当保存敏感信息时,如信用信息,尽量保存在如数组这样的可变数据类型中,而不是保存在字符串这样的不可变对象中,这样使得敏感信息可以尽早显式地被清除。不要指望Java平台的自动垃圾回收来做这种清除,因为回收器可能不会清除这段内存,或者很久后才会回收。尽早清除信息使得来自虚拟机外部的堆检查攻击变得困难。 3.4数据库规范3.4.1命名 考虑不同数据库间的差别及保证与平台的最大无关性,避免可能错误,所有命名采用大写单词,单词间使用下划线连接。1)

37、数据库名大写。2) 表名大写,准确表明该表功能。3) 字段简单明了,表意清楚,无歧义,以单个单词为佳,表名中含有单词全部采用单数形式,多个单词时长度不超过20,字段名前使用表名或表名缩写及下划线前缀,表名缩写取能唯一标识该表的三到五个字母,如:USER_ID,USER_NAME。3.4.2关系 尽量使相关表的关系简单化,整体的设计应使数据库的结构更简洁,更健壮,更易于维护。3.4.3SQL 语句书写规则 代码中书写的sql语句要求sql关键字全部大写,表名和字段名根据数据库中的命名规则书写(如Oracle中表名忽略大小写而字段名必须为大写)。例如:SELECT USER_ID, NAME FR

38、OM account WHERE USER_ID ? AND DEPART= ? ORDER BY NAME北京华胜天成科技股份 22 3.4.4数据库安全 开发人员应尽量使用PreparedStatement,并且使用占位符?来表示参数。在使用set命令时,数据库驱动程序会对参数中的关键字进行转义。严格禁止将参数和SQL语句做拼接。只给数据库用户授予其需要的最小权限,以保障数据库服务器的安全。当使用JDBC操作数据库时,涉及到的资源包括ResultSet、Statement、Connection都必须及时关闭。ResultSet、PreparedStatement、Connection必须依

39、次关闭,同时三者的close方法都应提示异常,且每个close方法都必须用try、catch来实现。数据库关闭的原则是:谁创建的资源,谁负责关闭。应在try代码块中及时关闭数据库资源,同时finally的代码块中也要关闭资源,或者将一个try代码块拆分为多个try代码块,保证每个资源都能在使用完以后立即关闭。数据库表名、字段名必须大写。对于返回较大结果集的查询,必须禁止SELECT *,在其他查询中也应避免使用。编写可以移植的SQL语句,原则如下:不得使用某个数据库专用的关键字、函数等;当必须要使用某个数据库特定的特性时,需在程序运行时,先判断当前数据库的类型,然后再根据数据的不同使用其特性;

40、可以使用各种数据库都支持的函数包括MIN、MAX、AVG、COUNT;尽量使用简单的SQL语句,当因为特殊情况需要使用非常见SQL语句时,应该在多种数据库下测试。优化SQL语句时开发人员应遵循以下原则: 使用合适的SQL语句以避免不必要的关联;使用JDBC批量更新来优化insert和update的性能;必要时可以使用对象缓存技术,但是技术方案需要通过讨论并且获得批准后方可执行。不得将数据库的用户名和以明文形式存储在配置文件中。对于存储于数据库中的重要数据以密文形式存放,可以大大增强数据的安全性。北京华胜天成科技股份 23 时通过严格的权限设置来控制对日志文件的访问。3.4.5其它 应用程序中,

41、数据库连接应使用统一的用户,尽量减少创建数据库连接请求,不用的连接应及时关闭以释放资源。3.5java 程序编写规则u exit() exit 除了在 main 中可以被调用外,其他的地方不应该调用。因为这样做不给任何代码代码机会来截获退出。一个类似服务地程序不应该因为某一个库模块决定了要退出就退出。 u 异常 申明的错误应该抛出一个RuntimeException或者派生的异常。顶层的main()函数或Servlet方法应该截获所有的异常,并且打印(或者记录在日志中)在屏幕上,记住Servlet中无法捕捉JSP中产生的异常,因此JSP需要显式捕捉自己产生的异常。 u final 类 绝对不要

42、因为性能的原因将类和方法定义为 final 的(除非程序的框架要求)如果一个类还没有准备好被继承或一个方法没有准备好被重写,最好在类文档中注明,而不要将它们定义为 final 的。这是因为没有人可以保证会不会由于什么原因需要继承或重载 。 u 性能 (1)在写代码的时候,从头至尾都应该考虑性能问题。这不是说时间都应该浪费在优化代码上,而是我们时刻应该提醒自己要注意代码的效率。比如:如果没有时间来实现一个高效的算法,那么我们应该在文档中记录下来,以便在以后有空的时候再来实现她。北京华胜天成科技股份 24 不是所有的人都同意在写代码的时候应该优化性能这个观点的,他们认为性能优化的问题应该在项目的后

43、期再去考虑,也就是在程序的轮廓已经实现了以后。(2)不必要的对象构造oo不要在循环中构造和释放对象使用 StringBuffer 对象在处理 String 的时候要尽量使用 StringBuffer 类,StringBuffer 类是构成 String 类的基础。String 类将 StringBuffer 类封装了起来,(以花费更多时间为代价)为开发人员提供了一个安全的接口。当我们在构造字符串的时候,我们应该用 StringBuffer 来实现大部分的工作,当工作完成后将 StringBuffer 对象再转换为需要的 String 对象。比如:如果有一个字符串必须不断地在其后添加许多字符来完

44、成构造,那么我们应该使用 StringBuffer 对象和她的 append() 方法。如果我们用 String 对象代替 StringBuffer对象的话,会花费许多不必要的创建和释放对象的 CPU 时间。(3)避免太多的使用 synchronized 关键字避免不必要的使用关键字 synchronized,应该在必要的时候再使用她,这是一个避免死锁的好方法。北京华胜天成科技股份 25 4.J2EE 规范 4.1J2EE 开发命名规范4.1.1开发规范独立、完整且集中的输入验证校验全部的程序输入校验全部的输入长度校验全部的输入类型不使用任何方式处理失败的数据对HTTP所有内容进行校验校验向用户输出的数据只相信服务器端校验,客户端校验只能作为补充使用安全、统一的编码或转义方式设定有安全的权限边界校验被调用的命令校验被调用的文本或配置文件在HTML中

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论