JSF开发规范1.21
jsp开发规范
文件命名 文件名按照 unix 的命名习惯,文件名用小写字母,如果名字是由两个或以上单词构成,从 第二个单词开始, 第一个字母大写, 一般不用下划线连接, 不要用中文拼音和英文单词混用。 JSP 程序要尽量做到简洁 要作到这步必须先把页面的风格确定。然后对页面进行拆分。一般可以分出 4 个部分。第 一个部分是页面的头:第二个部分是标签部分。第三个部分是动态实现部分(写的程序实现 一般在这个部分实现) ,第四个部分是页面的尾部。 要保证第一,二,四这三个部分是所有的程序公用部分。这样的修改起来方便。 程序实现起来只操作第三部分,这样程序看起来简单、易读。 与 javascript 代码分离
4
jsp 页面模型 bean: <pagename>Bean 如 loginBean.java jsp 会话标记 bean: xxxxSessionBean 标记类: xxxxTag,xxxxTagExtraInfo 7.应在 jsp 中避免使用页面引入指令。import 指令会促使类的实例化而不是 jsp bean 的 实例化 不用:<%@ page import="com.java.util"%> 而用:<%java.until.List a = new java.util.LinkedList();%> 8.jsp 不要直接访问请求参数,bean 应该执行这样的处理过程并且输出所处理的模型数据 9.jsp 不应该访问属性文件,或者使 JNDI 。bean 可以访问属性 10.如果 jsp bean 具有的所有属性不能能页面请求中被映射到, 就要尽力在<jsp:useBean> 标记中设置属性 11.应该避免设计既显示表单又处理结果的页面 12.在 jsp 中避免代码重复。把要重复的功能放在一个包含 jsp、bean 或标记扩展中,使得 它能够被重用 13.jsp bean 永远不要去生成 HTML 14.在 jsp 中应该避免使用 out.println()产生页面内容 15.jsp 不应该直接访问数据,这包括 JDBC 数据库访问和 EJB 访问 16.在长度上,scriptlests 的代码最好不超过 5 行 17.除了 jsp bean,jsp 不应该去实例化复杂的可读写的对象。如果这样的话,就有可能在 jsp 中去执行不适当的 业务逻辑 18.jsp bean 中不应该包含大量的数据 19.如果使用了<jsp:forward>和<jsp:include 标记>,并且必须使用简单类型的值来与外 部页面进行通讯的话 ,就应该使用一个或多个<jsp:param>元素 20.定制标记应该在适当把逻辑从 jsp 中移走的地方 21.应该谨慎地使用<jsp:forward>标记,在 jsp 中,它是一个等价的 goto 22.应该使用隐藏的注释来阻止输出过大的 html Nhomakorabea5
java开发规范
Java开发规范1排版规范1.1规则1.1.1*程序块要采用缩进风格编写,缩进的空格数约为4个。
说明:对于由开发工具自动生成的代码可以有不一致。
1.1.2*分界符(如大括号‘{’和‘}’)各独占一行并且位于同一列,同时与引用它公的语句左对齐。
在函数体的开始、类和接口的定义、以及if、for、do、while、switch、case语句中的程序都要采用如上的缩进方式。
示例:如下例子不符合规范。
for (…) {… // program code}if (…){… //program code}void example_fun (void){… //program code}应如下书写。
for (…){… //program code}if{… //program code}void example_fun (void){… //program code}1.1.3*较长的语句、表达式或参数(>80字符)要分成多行书写,长表达式要在低优先级操作符处划分新行,操作符放在新行之首,划分出的新行要进行适当的缩进,使排版整齐,语句可读。
示例:if(filename != null&& new File(logPath + filename).length() < LogConfig.getFileSize()) {… // program code}public static LogIterator read(String logType, Date startTime, Date endTime,int logLevel, String username, int bufferNum)1.1.4*不允许把多个短语句写在一行,即一行只写一条语句示例:如下例子不符合规范。
LogFilename now = null; LogFilename that = null;应如下书写:LogFilename now = null;LogFilename that = null;1.1.5*if, for, do, while, case, switch, default等语句自占一行,且if, for, do,while语句的执行语句无论多少都要加括号{}。
开发规范与要求范文
开发规范与要求范文开发规范是一系列的编码原则、技术规范、文档规范等的集合,旨在确保团队开发的代码质量、可读性、可维护性、可扩展性,并提高团队合作效率。
本文将介绍开发规范的要求以及其对项目开发的重要性。
一、命名规范1.变量、函数、方法的命名应具有清晰的表达意义,使用有意义的英文单词或单词的组合。
2.类名、接口名应使用名词或名词词组,并使用大写开头的驼峰命名法。
3.常量名应使用大写字母加下划线的形式,如:MAX_COUNT。
4.避免使用容易混淆的命名,如:i1,l1,O0等。
二、缩进与排版规范1. 使用合适的缩进风格,如四个空格或一个Tab,统一团队内部的缩进风格。
2.代码块的开始和结束要与其对应的可见的包含结构对齐。
3.行宽应控制在80-120个字符之间。
三、代码注释规范1.对于代码中的每个模块或功能,必须提供必要的注释说明。
2.注释应简明扼要、准确清晰,解释代码的关键逻辑以及设计思想。
3.注释应使用英文书写,并遵循一定的规范,如在注释前使用特定的修饰符以区分说明的对象。
四、代码规范1.遵循单一职责原则,每个函数、方法只负责一个功能,尽量避免一个函数或方法实现多种功能。
2.遵循开闭原则,尽量使用扩展而非修改已有的代码。
3.避免使用变量的魔法数值,应提取为常量或配置项。
4.代码尽量简单清晰,可读性强,避免冗余的代码和复杂的逻辑结构。
五、测试规范1.编写单元测试代码,保证代码的正确性和稳定性。
2.合理组织测试用例,覆盖代码的各种情况,包括正常情况和异常情况。
3.定期运行测试用例,及时发现和解决问题,确保程序的健壮性。
六、文档规范1.编写开发文档和用户文档,清晰描述程序的设计思路、开发流程、代码的使用方法等。
2.文档内容应准确、详尽,方便其他开发人员和用户了解项目的细节。
开发规范对于项目开发具有重要的作用:1. 提高代码质量和可维护性:规范的代码易于阅读和理解,减少错误和bug的产生,提高代码的可维护性和可读性。
JavaScript开发规范要求
JavaScript开发规范要求作为一名开发人员(WEB前端JavaScript开发),不规范的开发不仅使日后代码维护变的困难,同时也不利于团队的合作,通常还会带来代码安全以及执行效率上的问题。
本人在开发工作中就曾与不按规范来开发的同事合作过,与他合作就不能用“愉快”来形容了。
现在本人撰写此文的目的除了与大家分享一点点经验外,更多的是希望对未来的合作伙伴能够起到一定的借鉴作用。
当然,如果我说的有不科学的地方还希望各路前辈多多指教。
下面分条目列出各种规范要求,这些要求都是针对同事编码毛病提出来的,好些行业约定的其它规范可能不会再提及。
1、保证代码压缩后不出错对于大型的JavaScript项目,一般会在产品发布时对项目包含的所有JavaScript文件进行压缩处理,比如可以利用Google Closure Compiler Service对代码进行压缩,新版jQuery已改用这一工具对代码进行压缩,这一般会去掉开发时写的注释,除去所有空格和换行,甚至可以把原来较长的变量名替换成短且无意义的变量名,这样做的目的是加快文件的下载速度,同时也减小网站访问带来的额外数据流量,另外在代码保护上也起到了一点点作用,至少压缩后的代码即使被还原还是没那么容易一下读懂的。
要想代码能正确通过压缩,一般要求语句都要以分号正常结束,大括号也要严格结束等,具体还要看压缩工具的要求。
所以如果一开始没有按标准来做,等压缩出错后再回去找错误那是浪费时间。
2、保证代码能通过特定IDE的自动格式化功能一般较为完善的开发工具(比如Aptana Studio)都有代码“自动格式”化功能,这一功能帮助实现统一换行、缩进、空格等代码编排,你可以设置自己喜欢的格式标准,比如左大括号{是否另起一行。
达到这个要求的目的在于方便你的开发团队成员拿你代码的一个副本用IDE自动格式化成他喜欢或熟悉的风格进行阅读。
你同事需要阅读你的代码,可能是因为你写的是通用方法,他在其它模块开发过程中也要使用到,阅读你的代码能最深入了解方法调用和实现的细节,这是简单API文档不能达到的效果。
.jsbf 标准
.jsbf 标准随着互联网技术的不断发展,网页前端开发也面临着越来越多的挑战。
为了更好地规范网页前端开发的标准和规范,提高网页的性能和用户体验,一种新的标准——.jsbf 标准应运而生。
本文将详细介绍 .jsbf 标准的定义、作用、实施原则、实施方法等方面的内容。
.jsbf 是 JavaScript Boilerplate Framework 的简称,是一种基于 JavaScript 语言的网页前端开发标准。
它是一种用于构建现代Web 应用程序的前端框架,旨在提供一套简单、灵活、可扩展的解决方案,以简化网页前端开发的流程和降低开发成本。
.jsbf 标准的作用主要体现在以下几个方面:1. 提高开发效率:通过提供一套标准化的解决方案,开发者可以快速地搭建起一个完整的网页前端,减少重复工作和代码冗余,提高开发效率。
2. 降低维护成本:由于 .jsbf 标准具有很好的可扩展性和可维护性,因此可以降低维护成本,减少因技术问题而导致的维护成本增加。
3. 提高用户体验:.jsbf 标准注重性能和用户体验,通过优化代码结构和减少不必要的加载项,可以有效地提高网页的加载速度和响应速度,提高用户体验。
三、.jsbf 标准的实施原则实施 .jsbf 标准需要遵循以下原则:1. 标准化:采用统一的框架结构和命名规范,避免出现不同的实现方式和命名方式,以提高代码的可读性和可维护性。
2. 可扩展性:框架应该具有良好的扩展性,能够适应不同的应用场景和需求,同时也要考虑到未来的发展需求。
3. 易用性:框架应该尽可能地简单易用,减少学习成本和使用难度,让开发者能够快速上手并投入使用。
4. 性能优化:在保证功能实现的基础上,注重性能优化,减少不必要的加载项和冗余代码,提高网页的性能和响应速度。
四、.jsbf 标准的实施方法实施 .jsbf 标准需要遵循以下步骤和方法:1. 学习和了解 .jsbf 标准:通过阅读相关文档和资料,了解 .jsbf 标准的框架结构和核心组件,掌握其基本原理和使用方法。
JAVASCRIPT开发规范
JAVASCRIPT开发规范∙JavaScript 是一种客户端脚本语言, Google 的许多开源工程中都有用到它. 这份指南列出了编写JavaScript 时需要遵守的规则.∙Alipay 前端JavaScript 以些规范为准,局部有所修改注:/svn/trunk/javascriptguide.xml∙声明变量必须加上var 关键字.∙Decision: 当你没有写var , 变量就会暴露在全局上下文中, 这样很可能会和现有变量冲突. 另外, 如果没有加上, 很难明确该变量的作用域是什么, 变量也很可能像在局部作用域中, 很轻易地泄漏到Document 或者Window 中, 所以务必用var 去声明变量.∙常量的形式如: NAMES_LIKE_THIS , 即使用大写字符, 并用下划线分隔. 你也可用@const 标记来指明它是一个常量. 但请永远不要使用const 关键词.∙Decision:(1) 对于基本类型的常量, 只需转换命名./*** The number of seconds in a minute.* @type {number}*/goog.example.SECONDS_IN_A_MINUTE = 60;(2) 对于非基本类型, 使用@const 标记./*** The number of seconds in each of the given units.* @type {Object.<number>}* @const*/goog.example.SECONDS_TABLE = {minute: 60,hour: 60 * 60,day: 60 * 60 * 24}这标记告诉编译器它是常量.至于关键词const , 因为IE 不能识别, 所以不要使用.∙总是使用分号.∙如果仅依靠语句间的隐式分隔, 有时会很麻烦. 你自己更能清楚哪里是语句的起止.∙而且有些情况下, 漏掉分号会很危险:// 1.MyClass.prototype.myMethod = function() {return 42;} // No semicolon here.(function() {// Some initialization code wrapped in a function to create a scope for locals.})();var x = {'i': 1,'j': 2} // No semicolon here.// 2. Trying to do one thing on Internet Explorer and another on Firefox.// I know you'd never write code like this, but throw me a bone.[normalVersion, ffVersion][isIE]();var THINGS_TO_EAT = [apples, oysters, sprayOnCheese] // No semicolon here.// 3. conditional execution a la bash-1 == resultOfOperation() || die();这段代码会发生些什么诡异事呢?1.报JavaScript 错误- 例子1上的语句会解释成, 一个函数带一匿名函数作为参数而被调用, 返回42后, 又一次被"调用", 这就导致了错误.2.例子2中, 你很可能会在运行时遇到'no such property in undefined' 错误, 原因是代码试图这样x[ffVersion][isIE]() 执行.3.当resultOfOperation() 返回非NaN 时, 就会调用die , 其结果也会赋给THINGS_TO_EAT .为什么?∙JavaScript 的语句以分号作为结束符, 除非可以非常准确推断某结束位置才会省略分号. 上面的几个例子产出错误, 均是在语句中声明了函数/对象/数组直接量, 但闭括号('}'或']')并不足以表示该语句的结束. 在JavaScript 中, 只有当语句后的下一个符号是后缀或括号运算符时, 才会认为该语句的结束.∙遗漏分号有时会出现很奇怪的结果, 所以确保语句以分号结束.∙可以使用∙嵌套函数很有用, 比如,减少重复代码, 隐藏帮助函数, 等. 没什么其他需要注意的地方, 随意使用.∙不要在块内声明一个函数,不要写成:if (x) {function foo() {}}∙虽然很多JS 引擎都支持块内声明函数, 但它不属于ECMAScript 规范(见ECMA-262, 第13和14条). 各个浏览器糟糕的实现相互不兼容, 有些也与未来ECMAScript 草案相违背. ECMAScript 只允许在脚本的根语句或函数中声明函数. 如果确实需要在块中定义函数, 建议使用函数表达式来初始化变量:if (x) {var foo = function() {}}∙可以∙你在写一个比较复杂的应用时, 不可能完全避免不会发生任何异常. 大胆去用吧.∙可以∙有时发生异常了, 但返回的错误信息比较奇怪, 也不易读. 虽然可以将含错误信息的引用对象或者可能产生错误的完整对象传递过来, 但这样做都不是很好, 最好还是自定义异常类, 其实这些基本上都是最原始的异常处理技巧. 所以在适当的时候使用自定义异常.∙总是优于非标准特性.∙最大化可移植性和兼容性, 尽量使用标准方法而不是用非标准方法, (比如, 优先用string.charAt(3) 而不用string[3] , 通过DOM 原生函数访问元素, 而不是使用应用封装好的快速接口.∙不要∙没有任何理由去封装基本类型, 另外还存在一些风险: var x = new Boolean(false);if (x) {alert('hi'); // Shows 'hi'.}∙除非明确用于类型转换, 其他情况请千万不要这样做!var x = Boolean(0);if (x) {alert('hi'); // This will never be alerted.}typeof Boolean(0) == 'boolean';typeof new Boolean(0) == 'object';∙有时用作number , string 或boolean 时, 类型的转换会非常实用.∙不是首选∙多级原型结构是指JavaScript 中的继承关系. 当你自定义一个D类, 且把B类作为其原型, 那么这就获得了一个多级原型结构. 这些原型结构会变得越来越复杂!∙使用Arale 中的inherits 或其他类似的用于继承的函数, 会是更好的选择. function MyClass() {doSomeThing()}arale.inherits(MyClass, Parent);MyClass.prototype.method = function() {...};有很多方法可以给构造器添加方法或成员, 我们更倾向于使用如下的形式: Foo.prototype.bar = function() {/* ... */};∙可以, 但小心使用.∙闭包也许是JS 中最有用的特性了. 有一份比较好的介绍闭包原理的文档.∙有一点需要牢记, 闭包保留了一个指向它封闭作用域的指针, 所以, 在给DOM 元素附加闭包时, 很可能会产生循环引用, 进一步导致内存泄漏. 比如下面的代码: functionfoo(element, a, b) {element.onclick = function() { /* uses a and b */ };}∙这里, 即使没有使用element , 闭包也保留了element , a 和b 的引用, . 由于element 也保留了对闭包的引用, 这就产生了循环引用, 这就不能被GC 回收. 这种情况下, 可将代码重构为:function foo(element, a, b) {element.onclick = bar(a, b);}function bar(a, b) {return function() { /* uses a and b */ }}∙只用于解析序列化串(如: 解析RPC 响应)∙eval() 会让程序执行的比较混乱, 当eval() 里面包含用户输入的话就更加危险. 可以用其他更佳的, 更清晰, 更安全的方式写你的代码, 所以一般情况下请不要使用eval().当碰到一些需要解析序列化串的情况下(如, 计算RPC 响应), 使用eval 很容易实现.∙解析序列化串是指将字节流转换成内存中的数据结构. 比如, 你可能会将一个对象输出成文件形式: users = [{name: 'Eric',id: 37824,email: 'jellyvore@'},{name: 'xtof',id: 31337,email: 'b4d455h4x0r@'},...];∙很简单地调用eval 后, 把表示成文件的数据读取回内存中.∙类似的, eval() 对RPC 响应值进行解码. 例如, 你在使用XMLHttpRequest 发出一个RPC 请求后, 通过eval () 将服务端的响应文本转成JavaScript 对象:var userOnline = false;var user = 'nusrat';var xmlhttp = new XMLHttpRequest();xmlhttp.open('GET', '/isUserOnline?user=' + user, false);xmlhttp.send('');// Server returns:// userOnline = true;if (xmlhttp.status == 200) {eval(xmlhttp.responseText);}// userOnline is now true.∙不要使用∙使用with 让你的代码在语义上变得不清晰. 因为with 的对象, 可能会与局部变量产生冲突, 从而改变你程序原本的用义. 下面的代码是干嘛的? with (foo) {var x = 3;return x;}∙答案: 任何事. 局部变量x 可能被foo 的属性覆盖, 当它定义一个setter 时, 在赋值3 后会执行很多其他代码. 所以不要使用with 语句.∙仅在对象构造器, 方法, 闭包中使用.∙this 的语义很特别. 有时它引用一个全局对象(大多数情况下), 调用者的作用域(使用eval 时), DOM 树中的节点(添加事件处理函数时), 新创建的对象(使用一个构造器), 或者其他对象(如果函数被call() 或apply() ).∙使用时很容易出错, 所以只有在下面两个情况时才能使用:∙在构造器中对象的方法(包括创建的闭包)中∙只用于object/map/hash 的遍历∙对Array 用for-in 循环有时会出错. 因为它并不是从0 到length - 1 进行遍历, 而是所有出现在对象及其原型链的键值. 下面就是一些失败的使用案例: functionprintArray(arr) {for (var key in arr) {print(arr[key]);}}printArray([0,1,2,3]); // This works.var a = new Array(10);printArray(a); // This is wrong.a = document.getElementsByTagName('*');printArray(a); // This is wrong.a = [0,1,2,3];a.buhu = 'wine';printArray(a); // This is wrong again.a = new Array;a[3] = 3;printArray(a); // This is wrong again.∙而遍历数组通常用最普通的for 循环.function printArray(arr) {var l = arr.length;for (var i = 0; i < l; i++) {print(arr[i]);}}∙永远不要使用Array 作为map/hash/associative 数组.∙数组中不允许使用非整型作为索引值, 所以也就不允许用关联数组. 而取代它使用Object 来表示map/hash 对象. Array 仅仅是扩展自Object (类似于其他JS 中的对象, 就像Date , RegExp 和String )一样来使用.∙不要使用∙不要这样写长字符串: var myString = 'A rather long string of English text, an error message \actually that just keeps going and going -- an error \message to make the Energizer bunny blush (right through \those Schwarzenegger shades)! Where was I? Oh yes, \you\'ve got an error and all the extraneous whitespace is \just gravy. Have a nice day.';在编译时, 不能忽略行起始位置的空白字符; "\" 后的空白字符会产生奇怪的错误; 虽然大多数脚本引擎支持这种写法, 但它不是ECMAScript 的标准规范.∙使用∙使用Array 和Object 语法, 而不使用Array 和Object 构造器.∙使用Array 构造器很容易因为传参不恰当导致错误.// Length is 3.var a1 = new Array(x1, x2, x3);// Length is 2.var a2 = new Array(x1, x2);// If x1 is a number and it is a natural number the length will be x1.// If x1 is a number but not a natural number this will throw an exception.// Otherwise the array will have one element with x1 as its value.var a3 = new Array(x1);// Length is 0.var a4 = new Array();∙如果传入一个参数而不是2个参数, 数组的长度很有可能就不是你期望的数值了. 为了避免这些歧义,我们应该使用更易读的直接量来声明.var a = [x1, x2, x3];var a2 = [x1, x2];var a3 = [x1];var a4 = [];∙虽然Object 构造器没有上述类似的问题, 但鉴于可读性和一致性考虑, 最好还是在字面上更清晰地指明.var o = new Object();var o2 = new Object();o2.a = 0;o2.b = 1;o2.c = 2;o2['strange key'] = 3;应该写成:var o = {};var o2 = {a: 0,b: 1,c: 2,'strange key': 3};∙不要∙千万不要修改内置对象, 如Object.prototype 和Array.prototype 的原型. 而修改内置对象, 如Function.prototype 的原型, 虽然少危险些, 但仍会导致调试时的诡异现象.所以也要避免修改其原型.∙不要使用∙不要这样子写:var f = function () {/@cc_on if (@_jscript) { return 2* @/ 3; /@ } @/};条件注释妨碍自动化工具的执行, 因为在运行时, 它们会改变JavaScript 语法树.通常, 使用functionNamesLikeThis , variableNamesLikeThis , ClassNamesLikeThis , EnumNamesLikeThis , methodNamesLikeThis , 和SYMBOLIC_CONSTANTS_LIKE_THIS .A. 属性和方法∙文件或类中的私有属性, 变量和方法名应该以下划线"_" 开头.∙保护属性, 变量和方法名不需要下划线开头, 和公共变量名一样.更多有关私有和保护的信息见, visibility.B.方法和函数参数可选参数以opt_ 开头.∙函数的参数个数不固定时, 应该添加最后一个参数var_args 为参数的个数. 你也可以不设置var_args 而取代使用arguments .∙可选和可变参数应该在@param 标记中说明清楚. 虽然这两个规定对编译器没有任何影响, 但还是请尽量遵守C. Getters 和SettersGetters 和setters 并不是必要的. 但只要使用它们了, 就请将getters 命名成getFoo() 形式, 将setters 命名成setFoo(value) 形式. (对于布尔类型的getters, 使用isFoo() 也可.)D. 命名空间∙JavaScript 不支持包和命名空间.∙不容易发现和调试全局命名的冲突, 多个系统集成时还可能因为命名冲突导致很严重的问题. 为了提高JavaScript 代码复用率, 我们遵循下面的约定以避免冲突.∙为全局代码使用命名空间∙在全局作用域上, 使用一个唯一的, 与工程/库相关的名字作为前缀标识. 比如, 你的工程是"Project Sloth", 那么命名空间前缀可取为sloth.* .var sloth = {};sloth.sleep = function() {...};∙许多JavaScript 库, 包括the Closure Library and Dojo toolkit为你提供了声明你自己的命名空间的函数. 比如:goog.provide('sloth');sloth.sleep = function() {...};∙明确命名空间所有权∙当选择了一个子命名空间, 请确保父命名空间的负责人知道你在用哪个子命名空间, 比如说, 你为工程'sloths' 创建一个'hats' 子命名空间, 那确保Sloth团队人员知道你在使用sloth.hats .外部代码和内部代码使用不同的命名空间"外部代码" 是指来自于你代码体系的外部, 可以独立编译. 内外部命名应该严格保持独立. 如果你使用了外部库, 他的所有对象都在foo.hats.* 下, 那么你自己的代码不能在foo.hats.* 下命名, 因为很有可能其他团队也在其中命名.foo.require('foo.hats');/*** WRONG -- Do NOT do this.* @constructor* @extend {foo.hats.RoundHat}*/foo.hats.BowlerHat = function() {};∙如果你需要在外部命名空间中定义新的API, 那么你应该直接导出一份外部库,然后在这份代码中修改. 在你的内部代码中, 应该通过他们的内部名字来调用内部API , 这样保持一致性可让编译器更好的优化你的代码.foo.provide('googleyhats.BowlerHat');foo.require('foo.hats');/*** @constructor* @extend {foo.hats.RoundHat}*/googleyhats.BowlerHat = function() {...}; goog.exportSymbol('foo.hats.BowlerHat', googleyhats.BowlerHat);∙重命名那些名字很长的变量, 提高可读性主要是为了提高可读性. 局部空间中的变量别名只需要取原名字的最后部分./*** @constructor*/space.MyClass = function() {};/*** @param {space.MyClass} a*/space.MyClass.staticHelper = function(a) {...};myapp.main = function() {var MyClass = space.MyClass;var staticHelper = space.MyClass.staticHelper;staticHelper(new MyClass());};∙不要对命名空间创建别名.myapp.main = function() {var namespace = space;namespace.MyClass.staticHelper(new namespace.MyClass());};∙除非是枚举类型, 不然不要访问别名变量的属性./** @enum {string} */space.Fruit = {APPLE: 'a',BANANA: 'b'};myapp.main = function() {var Fruit = space.Fruit;switch (fruit) {case Fruit.APPLE:...case Fruit.BANANA:... }}; myapp.main = function() {var MyClass = space.MyClass;MyClass.staticHelper(null);};∙不要在全局范围内创建别名, 而仅在函数块作用域中使用.E. 文件名文件名应该使用小写字符, 以避免在有些系统平台上不识别大小写的命名方式. 文件名以 .js 结尾, 不要包含除- 和_ 外的标点符号(使用- 优于_ ).F. JS 钩子JS 钩子一律使用“J-” 前缀,如:#J-ui-repeater∙应该总是成功调用且不要抛异常.∙可自定义toString() 方法, 但确保你的实现方法满足:∙1.总是成功2.没有其他负面影响. 如果不满足这两个条件, 那么可能会导致严重的问题, 比如, 如果toString() 调用了包含assert 的函数, assert 输出导致失败的对象,这在toString() 也会被调用.∙可以∙没必要在每次声明变量时就将其初始化.∙任何时候都需要∙任何时候都要明确作用域- 提高可移植性和清晰度. 例如, 不要依赖于作用域链中的window 对象. 可能在其他应用中, 你函数中的window 不是指之前的那个窗口对象.主要依照C++ 格式规范(中文版), 针对JavaScript, 还有下面一些附加说明.A. 大括号分号会被隐式插入到代码中, 所以你务必在同一行上插入大括号. 例如:if (something) {// ...} else {// ...}B. 数组和对象的初始化∙如果初始值不是很长, 就保持写在单行上:var arr = [1, 2, 3]; // No space after [ or before ].var obj = {a: 1, b: 2, c: 3}; // No space after { or before }.∙初始值占用多行时, 缩进2个空格.// Object initializer.var inset = {top: 10,right: 20,bottom: 15,left: 12 };// Array initializer.this.rows_ = ['"Slartibartfast" <fjordmaster@>','"Zaphod Beeblebrox" <theprez@>','"Ford Prefect" <ford@>','"Arthur Dent" <has.no.tea@>','"Marvin the Paranoid Android" <marv@>','the.mice@' ];// Used in a method call.goog.dom.createDom(goog.dom.TagName.DIV, {id: 'foo',className: 'some-css-class',style: 'display:none'}, 'Hello, world!');∙比较长的标识符或者数值, 不要为了让代码好看些而手工对齐. 如: CORRECT_Object.prototype = {a: 0,b: 1,lengthyName: 2};∙不要这样做:WRONG_Object.prototype = {a : 0,b : 1,lengthyName: 2};C. 函数参数∙尽量让函数参数在同一行上. 如果一行超过80 字符, 每个参数独占一行, 并以4个空格缩进, 或者与括号对齐, 以提高可读性. 尽可能不要让每行超过80个字符. 比如下面这样:// Four-space, wrap at 80. Works with very long function names, survives// renaming without reindenting, low on space.goog.foo.bar.doThingThatIsVeryDifficultToExplain = function(veryDescriptiveArgumentNumberOne, veryDescriptiveArgumentTwo,tableModelEventHandlerProxy, artichokeDescriptorAdapterIterator) {// ...};// Four-space, one argument per line. Works with long function names,// survives renaming, and emphasizes each argument.goog.foo.bar.doThingThatIsVeryDifficultToExplain = function(veryDescriptiveArgumentNumberOne,veryDescriptiveArgumentTwo,tableModelEventHandlerProxy,artichokeDescriptorAdapterIterator) {// ...};// Parenthesis-aligned indentation, wrap at 80. Visually groups arguments,// low on space.function foo(veryDescriptiveArgumentNumberOne, veryDescriptiveArgumentTwo,tableModelEventHandlerProxy, artichokeDescriptorAdapterIterator) {// ...}// Parenthesis-aligned, one argument per line. Visually groups and// emphasizes each individual argument.function bar(veryDescriptiveArgumentNumberOne,veryDescriptiveArgumentTwo,tableModelEventHandlerProxy,artichokeDescriptorAdapterIterator) {// ...}D. 传递匿名函数如果参数中有匿名函数, 函数体从调用该函数的左边开始缩进2个空格, 而不是从function 这个关键字开始. 这让匿名函数更加易读(不要增加很多没必要的缩进让函数体显示在屏幕的右侧). var names = items.map(function(item) {return ;});prefix.something.reallyLongFunctionName('whatever', function(a1, a2) {if (a1.equals(a2)) {someOtherLongFunctionName(a1);} else {andNowForSomethingCompletelyDifferent(a2.parrot);}});E. 更多的缩进事实上, 除了初始化数组和对象, 和传递匿名函数外, 所有被拆开的多行文本要么选择与之前的表达式左对齐, 要么以4个(而不是2个)空格作为一缩进层次.someWonderfulHtml = '' +getEvenMoreHtml(someReallyInterestingValues, moreValues,evenMoreParams, 'a duck', true, 72,slightlyMoreMonkeys(0xfff)) +'';thisIsAVeryLongVariableName = hereIsAnEvenLongerOtherFunctionNameThatWillNotFitOnPrevLine();thisIsAVeryLongVariableName = 'expressionPartOne' + someMethodThatIsLong() + thisIsAnEvenLongerOtherFunctionNameThatCannotBeIndentedMore();someValue = this.foo(shortArg,'Some really long string arg - this is a pretty common case, actually.',shorty2,this.bar());if (searchableCollection(allYourStuff).contains(theStuffYouWant) &&!ambientNotification.isActive() && (client.isAmbientSupported() ||client.alwaysTryAmbientAnyways()) {ambientNotification.activate();}F. 空行使用空行来划分一组逻辑上相关联的代码片段.doSomethingTo(x);doSomethingElseTo(x);andThen(x);nowDoSomethingWith(y);andNowWith(z);G. 二元和三元操作符操作符始终跟随着前行, 这样就不用顾虑分号的隐式插入问题. 如果一行实在放不下, 还是按照上述的缩进风格来换行. var x = a ? b : c; // All on one line if it will fit.// Indentation +4 is OK.var y = a ?longButSimpleOperandB : longButSimpleOperandC;// Indenting to the line position of the first operand is also OK.var z = a ?moreComplicatedB :moreComplicatedC;∙只在需要的时候使用∙不要滥用括号, 只在必要的时候使用它.∙对于一元操作符(如delete , typeof 和void ), 或是在某些关键词(如return , throw , case , new )之后, 不要使用括号.∙使用' 优于"∙单引号(') 优于双引号("). 当你创建一个包含HTML 代码的字符串时就知道它的好处了.∙var msg = 'This is some HTML';∙推荐使用JSDoc 中的两个标记: @private 和@protected∙JSDoc 的两个标记@private 和@protected 用来指明类, 函数, 属性的可见性域. ∙标记为@private 的全局变量和函数, 表示它们只能在当前文件中访问.∙标记为@private 的构造器, 表示该类只能在当前文件或是其静态/普通成员中实例化;私有构造器的公共静态属性在当前文件的任何地方都可访问, 通过instanceof 操作符也可.∙永远不要为全局变量, 函数, 构造器加@protected 标记. // File 1.// AA_PrivateClass_ and AA_init_ are accessible because they are global// and in the same file./*** @private* @constructor*/AA_PrivateClass_ = function() {};/** @private */function AA_init_() {return new AA_PrivateClass_();}AA_init_();∙标记为@private 的属性, 在当前文件中可访问它; 如果是类属性私有, "拥有"该属性的类的所有静态/普通成员也可访问, 但它们不能被不同文件中的子类访问或覆盖.∙标记为@protected 的属性, 在当前文件中可访问它, 如果是类属性保护, 那么"拥有"该属性的类及其子类中的所有静态/普通成员也可访问.∙注意: 这与C+, Java 中的私有和保护不同, 它们是在当前文件中, 检查是否具有访问私有/保护属性的权限, 有权限即可访问, 而不是只能在同一个类或类层次上. 而C+ 中的私有属性不能被子类覆盖. (C++/Java 中的私有/保护是指作用域上的可访问性, 在可访问性上的限制. JS 中是在限制在作用域上. PS: 可见性是与作用域对应)// File 1./** @constructor */AA_PublicClass = function() {};/** @private */AA_PublicClass.staticPrivateProp_ = 1;/** @private */AA_PublicClass.prototype.privateProp_ = 2;/** @protected */AA_PublicClass.staticProtectedProp = 31;/** @protected */AA_PublicClass.prototype.protectedProp = 4;// File 2./*** @return {number} The number of ducks we've arranged in a row. */AA_PublicClass.prototype.method = function() {// Legal accesses of these two properties.return this.privateProp_ + AA_PublicClass.staticPrivateProp_; };// File 3./*** @constructor* @extends {AA_PublicClass}*/AA_SubClass = function() {// Legal access of a protected static property.AA_PublicClass.staticProtectedProp = this.method();};goog.inherits(AA_SubClass, AA_PublicClass);/*** @return {number} The number of ducks we've arranged in a row. */AA_SubClass.prototype.method = function() {// Legal access of a protected instance property.return this.protectedProp; };∙强烈建议你去使用编译器.∙如果使用JSDoc, 那么尽量具体地, 准确地根据它的规则来书写类型说明. 目前支持两种JS2和JS1.x 类型规范.∙JavaScript 类型语言*/function MyClass(value) {/*** Some value.* @type {Object}* @private*/this.myValue_ = value;}告诉编译器myValue_ 属性为一对象或null. 如果myValue_ 永远都不会为null, 就应该如下声明:/*** Some class, initialized with a non-null value.* @param {!Object} value Some value.* @constructor*/function MyClass(value) {/*** Some value.* @type {!Object}* @private*/this.myValue_ = value;}这样, 当编译器在代码中碰到MyClass 为null 时, 就会给出警告.函数的可选参数可能在运行时没有定义, 所以如果他们又被赋给类属性, 需要声明成:/*** Some class, initialized with an optional value.* @param {Object=} opt_value Some value (optional).* @constructor*/function MyClass(opt_value) {/*** Some value.* @type {Object|undefined}* @private*/this.myValue_ = opt_value;}这告诉编译器myValue_ 可能是一个对象, 或null, 或undefined.注意: 可选参数opt_value 被声明成{Object=} , 而不是{Object|undefined} . 这是因为可选参数可能是undefined. 虽然直接写undefined 也并无害处, 但鉴于可阅读性还是写成上述的样子.最后, 属性的非空和可选并不矛盾, 属性既可是非空, 也可是可选的. 下面的四种声明各不相同: /*** Takes four arguments, two of which are nullable, and two of which are* optional.* @param {!Object} nonNull Mandatory (must not be undefined), must not be null.* @param {Object} mayBeNull Mandatory (must not be undefined), may be null.* @param {!Object=} opt_nonNull Optional (may be undefined), but if present,* must not be null!* @param {Object=} opt_mayBeNull Optional (may be undefined), may be null.*/function strangeButTrue(nonNull, mayBeNull, opt_nonNull, opt_mayBeNull) {// ...};A. 使用JSDoc我们使用JSDoc中的注释风格. 行内注释使用// 变量的形式. 另外, 我们也遵循C++ 代码注释风格 . 这也就是说你需要:∙版权和著作权的信息,∙文件注释中应该写明该文件的基本信息(如, 这段代码的功能摘要, 如何使用, 与哪些东西相关), 来告诉那些不熟悉代码的读者.∙类, 函数, 变量和必要的注释,∙期望在哪些浏览器中执行,∙正确的大小写, 标点和拼写.为了避免出现句子片段, 请以合适的大/小写单词开头, 并以合适的标点符号结束这个句子.现在假设维护这段代码的是一位初学者. 这可能正好是这样的! 目前很多编译器可从JSDoc 中提取类型信息, 来对代码进行验证, 删除和压缩. 因此, 你很有必要去熟悉正确完整的JSDoc .B. 顶层/文件注释顶层注释用于告诉不熟悉这段代码的读者这个文件中包含哪些东西. 应该提供文件的大体内容, 它的作者, 依赖关系和兼容性信息. 如下:// Copyright 2009 Google Inc. All Rights Reserved.* @fileoverview Description of file, its uses and information* about its dependencies.* @author user@ (Firstname Lastname)*/C. 类注释∙每个类的定义都要附带一份注释, 描述类的功能和用法. 也需要说明构造器参数. 如果该类继承自其它类, 应该使用@extends 标记. 如果该类是对接口的实现, 应该使用@implements 标记./*** Class making something fun and easy.* @param {string} arg1 An argument that makes this more interesting.* @param {Array.<number>} arg2 List of numbers to be processed.* @constructor* @extends {goog.Disposable}*/project.MyClass = function(arg1, arg2) {// ...};goog.inherits(project.MyClass, goog.Disposable);∙方法与函数的注释. 提供参数的说明. 使用完整的句子, 并用第三人称来书写方法说明./*** Converts text to some completely different text.* @param {string} arg1 An argument that makes this more interesting.* @return {string} Some return value.*/project.MyClass.prototype.someMethod = function(arg1) {// ...};/*** Operates on an instance of MyClass and returns something.* @param {project.MyClass} obj Instance of MyClass which leads to a long* comment that needs to be wrapped to two lines.* @return {boolean} Whether something occured.*/function PR_someMethod(obj) {// ...}∙对于一些简单的, 不带参数的getters, 说明可以忽略./*** @return {Element} The element for the component.*/ponent.prototype.getElement = function() {return this.element_;};D. 属性注释需要对属性进行注释./*** Maximum number of things per pane.* @type {number}*/project.MyClass.prototype.someProperty = 4;E. 类型转换的注释有时, 类型检查不能很准确地推断出表达式的类型, 所以应该给它添加类型标记注释来明确之, 并且必须在表达式和类型标签外面包裹括号./** @type {number} */ (x)(/** @type {number} */ x)F. JSDoc 缩进∙如果你在@param , @return , @supported , @this 或@deprecated 中断行, 需要像在代码中一样, 使用4个空格作为一个缩进层次./*** Illustrates line wrapping for long param/return descriptions.* @param {string} foo This is a param with a description too long to fit in* one line.* @return {number} This returns something that has a description too long to* fit in one line.*/project.MyClass.prototype.method = function(foo) {return 5;};∙不要在@fileoverview 标记中进行缩进.∙虽然不建议, 但也可对说明文字进行适当的排版对齐. 不过, 这样带来一些负面影响, 就是当你每次修改变量名时, 都得重新排版说明文字以保持和变量名对齐. /*** This is NOT the preferred indentation method.* @param {string} foo This is a param with a description too long to fit in* one line.* @return {number} This returns something that has a description too long to * fit in one line.*/project.MyClass.prototype.method = function(foo) {return 5;};枚举/*** Enum for tri-state values.* @enum {number}*/project.TriState = {TRUE: 1,FALSE: -1,MAYBE: 0};注意一下, 枚举也具有有效类型, 所以可以当成参数类型来用./*** Sets project state.* @param {project.TriState} state New project state.*/project.setState = function(state) {// ...};G. Typedefs有时类型会很复杂. 比如下面的函数, 接收Element 参数:/*** @param {string} tagName* @param {(string|Element|Text|Array.<Element>|Array.<Text>)} contents* @return {Element}*/goog.createElement = function(tagName, contents) {...};你可以使用@typedef 标记来定义个常用的类型表达式./** @typedef {(string|Element|Text|Array.<Element>|Array.<Text>)} */goog.ElementContent;/*** @param {string} tagName* @param {goog.ElementContent} contents* @return {Element}*/goog.createElement = function(tagName, contents) { ...};H. JSDoc 标记表/** @lends {Button.prototype} */ { isButton: function() { return true; } 表示把对象的键看成是其他对象的属性. 该标记只能出现在对象语法中. 注意, 括号中的名称和其他标记中的类型名称不一样, 它是一个对象名, 以"借过来"的属性名命名.如, @type {Foo} 表示"Foo 的一个实例",but @lends {Foo} 表示"Foo 构造器". 更多有关此标记的内容见JSDoc Toolkit docs.会检查在第三方代码中, 你还会见到其他一些JSDoc 标记. 这些标记在JSDoc Toolkit Tag Reference都有介绍到, 但在Google 的代码中, 目前不推荐使用. 你可以认为这些是将来会用到的"保留" 名. 它们包含:∙@augments∙@argument∙@borrows∙@class∙@constant∙@constructs∙@default∙@event∙@example∙@field∙@function∙@ignore∙@inner∙@link∙@memberOf∙@name∙@namespace∙@property∙@public∙@requires∙@returns∙@since∙@static∙@versionI. JSDoc 中的HTML类似于JavaDoc, JSDoc 支持许多HTML 标签, 如<code>, <pre>, <tt>, <strong>, <ul>, <ol>, <li>, <a>, 等等. 这就是说JSDoc 不会完全依照纯文本中书写的格式. 所以, 不要在JSDoc 中, 使用空白字符来做格式化:/*** Computes weight based on three factors:* items sent* items received* last timestamp*/上面的注释, 出来的结果是:Computes weight based on three factors: items sent items received items received应该这样写:/*** Computes weight based on three factors:* <ul>* <li>items sent* <li>items received* <li>last timestamp* </ul>*/另外, 也不要包含任何HTML 或类HTML 标签, 除非你就想让它们解析成HTML 标签./*** Changes <b> tags to <span> tags.*/出来的结果是:Changes tags to tags.另外, 也应该在源代码文件中让其他人更可读, 所以不要过于使用HTML 标签:/*** Changes <b> tags to <span> tags.*/上面的代码中, 其他人就很难知道你想干嘛, 直接改成下面的样子就清楚多了:/*** Changes 'b' tags to 'span' tags.*/推荐使用建议您去使用JS 编译器, 如Closure Compiler.A. JavaScript 小技巧(1) True 和False 布尔表达式下面的布尔表达式都返回false:∙null∙undefined∙'' 空字符串∙0 数字0但小心下面的, 可都返回true:∙'0' 字符串0∙[] 空数组∙{} 空对象下面段比较糟糕的代码:while (x != null) {你可以直接写成下面的形式(只要你希望x 不是0 和空字符串, 和false): while (x) {如果你想检查字符串是否为null 或空:if (y != null && y != '') {但这样会更好:if (y) {注意: 还有很多需要注意的地方, 如:∙Boolean('0') == true'0' != true∙0 != null0 == []0 == false∙Boolean(null) == falsenull != truenull != false∙Boolean(undefined) == falseundefined != trueundefined != false∙Boolean([]) == true[] != true[] == false∙Boolean({}) == true{} != true{} != false(2) 条件(三元)操作符(?:)三元操作符用于替代下面的代码:if (val != 0) {return foo();} else {return bar();}你可以写成:return val ? foo() : bar();在生成HTML 代码时也是很有用的:var html = '<input type="checkbox"' +(isChecked ? ' checked' : '') +(isEnabled ? '' : ' disabled') +' name="foo">';(3) && 和||二元布尔操作符是可短路的, 只有在必要时才会计算到最后一项. "||" 被称作为'default' 操作符, 因为可以这样:/* @param {=} opt_win */function foo(opt_win) {var win;if (opt_win) {win = opt_win;} else {win = window;} // ...}。
JavaScript开发标准规范
JavaScript开发标准规范文件编号:起草部门:开发三部审核人:签发人:批准日期:版本标识:内部保密文件仅限内部使用文件修改控制 .......................................................................................................................................................... - 4 -1引言 ................................................................................................................................................................. - 5 -1.1简介.. (5)1.2目的 (5)1.3参考资料 (5)2源文件 ............................................................................................................................................................. - 5 -2.1源文件命名.. (5)2.2供发布的文件 (6)2.3版本信息和版权声明 (6)3命名规范.......................................................................................................................................................... - 6 -3.1组件和的命名. (6)3.2变量命名 (7)3.3全局变量命名 (7)3.4函数命名 (7)4空白的使用...................................................................................................................................................... - 8 -4.1空行.. (8)4.2空格 (9)4.3缩进 (9)5注释 ................................................................................................................................................................. - 9 -5.1版权信息注释.. (10)5.2组件注释 (10)5.3变量注释 (10)5.4函数注释 (10)5.5其他注释 (11)5.5.1代码修改的注释 .................................................................................................................................. - 11 -5.5.2冗余代码的注释 .................................................................................................................................. - 11 -6语句 ................................................................................................................................................................- 11 -6.1简单语句. (11)6.1.1赋值和表达式 ...................................................................................................................................... - 11 -6.1.2变量声明 .............................................................................................................................................. - 12 -6.1.3return语句 ............................................................................................................................................... - 12 -6.2复合语句 (12)6.2.1括号的格式 .......................................................................................................................................... - 12 -6.2.2IF语句....................................................................................................................................................... - 12 -6.2.3FOR语句................................................................................................................................................... - 13 -6.2.4WHILE语句............................................................................................................................................... - 13 -6.2.5DO-WHILE语句......................................................................................................................................... - 13 -6.2.6SWITCH语句............................................................................................................................................. - 13 -6.2.7TRY-CATCH语句 ........................................................................................................................................ - 14 -7附录 ................................................................................................................................................................- 14 -7.1缩写列表. (14)7.2JS优化常识 (14)7.2.1循环 ...................................................................................................................................................... - 14 -7.2.2局部变量和全局变量 .......................................................................................................................... - 15 -7.2.3不使用Eval .......................................................................................................................................... - 15 -7.2.4减少对象查找 ...................................................................................................................................... - 15 -7.2.5字符串连接 .......................................................................................................................................... - 15 -7.2.6类型转换 .............................................................................................................................................. - 16 -7.2.7使用直接量 .......................................................................................................................................... - 16 -7.2.8字符串遍历操作 .................................................................................................................................. - 17 -7.2.9高级对象 .............................................................................................................................................. - 17 -7.3DOM相关 .. (17)7.3.1插入HTML............................................................................................................................................ - 17 -7.3.2对象查询 .............................................................................................................................................. - 17 -7.3.3创建DOM节点.................................................................................................................................... - 17 -7.3.4定时器 .................................................................................................................................................. - 18 -7.4其他 (18)7.4.1脚本引擎 .............................................................................................................................................. - 18 -7.4.2文件优化 .............................................................................................................................................. - 18 -文件修改控制1 引言1.1 简介所有的程序开发手册都包含了各种规则。
开发规范标准
软件开发规范标准一、总则为了规范化管理员工日常工作,制定本方案。
二、前后端协调规范1.业务逻辑相关代码放在后端,前端只处理页面展示。
2.参数校验前后端都需要处理,前端新增、修改、删除逻辑需要加入loading防重复提交。
3.后端接口编写完成后需要实时告知前端开发,前端使用Swagger文档进行对接。
三、开发测试协调规范1.前端联调完接口后需要实时告知测试人员可以进入测试。
2.测试测出的BUG告知负责功能的开发人员,禁止因为前后端的问题跟测试人员推诿,应当由开发人员自行排查跟协调。
3.生产发版过程中,有发版内容的开发人员应等待发版并通过测试验证成功后才可下班。
四、后端规范4.统一工具a)代码编辑工具:IntelliJ IDEAb)数据库关系设计工具Power Designerc)流程图编辑工具微软Visio5.代码规约整体遵循阿里巴巴java规约,在idea中使用插件:Alibaba Java Coding Guidelinesa)包名定义包名全部使用小写字母,例如:com.myzy.xxxb)类命名首字母大写,遵守驼峰命名法,如:ThisIsClassNamec)常量命名常量名称必须全部大写,以下划线分割,如:final static int DEDAULT_HTTP_PORT =80d)分层领域模型规约DTO(Data Transfer Object):数据传输对象,API层接口定义业务数据输出对象。
VO(Value Object):请求入参。
DO(Data Object):与数据库表结构一一对应,通过DAO层向上传输数据源对象。
其他各moudule内部可直接使用原始的pojo命名不必强加后缀,造成多次convert6.数据库设计规范a)数据表命名名称统一用小写,以下划线分割。
业务数据表统一tb_b_开头,如tb_b_trade资料表统一tb_f_开头,如tb_f_user业务基础数据配置表统一td_b_开头,如td_b_city系统参数配置表统一td_s_开头,如td_s_parameter日志表统一tb_l_开头,如tb_l_color中间表统一tb_m_开头,如tb_m_location_patientb)公共字段定义c)用于统计是否的字段统一使用tinying(1)禁止使用varchar定义时间类型,没有特殊需求尽量使用timestamp高查询需求的数据表禁止定义大字段d)索引设计尽量在开发前理清业务需求查询场景,按需求合理设置索引,不要过多添加索引。
jsf用法
1111JSF(JavaServer Faces)是一种用于构建 Java Web 应用程序的用户界面框架。
它提供了一种基于组件的开发模型,使得开发 Web 应用程序更加容易和高效。
以下是 JSF 的一些基本用法:1. 创建 JSF 页面:JSF 页面是使用 XML 格式的文件来定义的,通常以`.xhtml`为扩展名。
页面中包含了各种 JSF 组件,如输入框、按钮、下拉框等。
2. 定义 JSF 组件:JSF 提供了丰富的组件库,包括标准组件和自定义组件。
可以通过在 JSF 页面中使用`<ui:component>`标签来定义组件。
3. 处理用户交互:JSF 支持事件处理机制,可以通过监听器来处理组件的事件,如点击按钮、输入框的值变化等。
可以使用`<f:listener>`标签来定义监听器。
4. 绑定数据:JSF 提供了数据绑定功能,可以将组件的值与后端的模型对象进行绑定。
通过使用`<h:form>`标签和`<f:ajax>`标签,可以实现表单提交和局部更新。
5. 验证输入:JSF 提供了内置的验证机制,可以在组件上添加验证规则,以确保用户输入的正确性。
6. 国际化支持:JSF 支持国际化,可以通过资源包来实现多语言界面。
7. 部署和配置:JSF 应用程序需要部署在支持 JSF 的容器中,如 Apache Tomcat。
需要在 Web 部署描述符中配置相关的 JSF 库和监听器。
需要注意的是,以上只是 JSF 的一些基本用法,JSF 还提供了许多其他高级特性和功能,如复合组件、视图状态管理、转换和验证等。
如果你需要更详细的信息,可以查阅相关的 JSF 文档和教程。
JavaScript的代码规范
JavaScript的代码规范作为一门常用且灵活的编程语言,JavaScript能够为网页开发带来很多便利。
然而,由于其灵活性,JavaScript代码往往容易出现混乱和难以维护的问题。
为了提高代码的可读性和可维护性,制定并遵守一套良好的JavaScript代码规范是至关重要的。
一、命名规范1. 变量名、函数名和方法名应该使用驼峰命名法,即首字母小写,后续单词首字母大写。
例如:firstName。
2. 常量名应该全部大写,多个单词之间用下划线(_)分隔。
例如:MAX_COUNT。
3. 类名应该使用帕斯卡命名法,即首字母大写,后续单词首字母大写。
例如:Person。
二、缩进和空格1. 使用两个空格进行缩进,并确保在代码块之间的一致性。
2. 操作符前后应该加上空格,例如:var x = y + z;。
3. 在大括号({})前使用一个空格,例如:if (x > 0) {。
4. 在逗号(,)后面使用一个空格,例如:var fruits = ['apple', 'banana', 'orange'];。
三、注释规范1. 使用注释来解释代码的意图和功能,提高代码的可读性。
2. 使用单行注释(//)或多行注释(/* */)来注释代码。
3. 在函数、类和方法的上方使用多行注释来说明其功能和输入输出。
四、代码格式1. 所有语句结尾都应该加上分号(;),即使在可选的情况下也应该如此。
2. 在逻辑行结束后换行,不要过长的一行代码。
3. 在操作符之间使用空格,但在逗号后不需要加上空格。
4. 使用合理的缩进,保持代码块的整洁和可读性。
五、变量和常量声明1. 使用var来声明变量,避免使用全局变量。
2. 在函数或代码块的顶部声明变量,避免变量声明的提升带来的问题。
3. 声明变量时给其赋初值,避免出现undefined的情况。
4. 使用const或let来声明常量或块级作用域的变量,以提高代码的可维护性。
JSF运行流程简介
JSF运行流程简介1. 概述JSF(JavaServer Faces)是一个用于构建Web用户界面的Java规范。
它提供了一种组件化的方法来构建用户界面,使开发人员可以更轻松地开发复杂的Web应用程序。
在本文中,我们将介绍JSF的运行流程,包括请求处理、生命周期和渲染过程。
2. 请求处理当用户访问一个使用JSF构建的页面时,请求会被发送到一个Servlet,该Servlet负责将请求交给JSF的核心处理器:FacesServlet。
FacesServlet是JSF应用程序的入口点,它负责将请求路由到正确的JSF组件以及处理各种生命周期事件。
3. 生命周期JSF的生命周期分为六个阶段,每个阶段都有不同的功能,确保页面的正确渲染和数据处理。
以下是JSF的六个生命周期阶段:3.1 Phase 1: Restore View在这个阶段,JSF会尝试还原视图状态,即将之前页面的状态还原到当前页面。
如果是第一次访问页面,则会创建一个新的视图。
3.2 Phase 2: Apply Request Values在这个阶段,JSF会将请求的参数值应用到组件模型中,以便在后续阶段中继续处理这些值。
3.3 Phase 3: Process Validations在这个阶段,JSF会校验用户输入的数据,并记录任何校验错误,以便后续显示给用户。
3.4 Phase 4: Update Model Values在这个阶段,JSF会将输入数据更新到模型中,确保模型中的数据与用户界面保持同步。
3.5 Phase 5: Invoke Application在这个阶段,JSF会调用任何需要在后台执行的业务逻辑,并根据之前阶段的处理结果确定接下来的操作。
3.6 Phase 6: Render Response在这个阶段,JSF会将视图渲染为HTML,并将其返回给客户端,完成请求的处理过程。
4. 渲染过程在JSF的渲染过程中,每个组件都会根据自身的属性和状态进行渲染,最终生成HTML。
java开发规范文档
一千零一夜产品部系统开发规范V1.0一千零一夜途遇科技有限公司2015-11-03修改记录目录1前言 (4)2开发管理 (4)3项目周期 (4)4命名规范 (5)4.1项目编号命名规范 (5)4.2文档命名规范 (5)4.3路径管理 (5)4.4jsp/html命名规范 (6)4.5数据库命名规范 (8)4.5.1表名规范 (8)4.5.2字段规范 (8)5文档规范 (8)6代码规范 (9)6.1Java源代码规范 (9)6.1.1命名 (9)6.1.2代码格式 (11)6.1.3注释 (12)6.1.4其他 (13)6.2jsp/html代码规范 (13)6.3数据库开发规范 (15)6.3.1主键 (15)6.3.2日期类型 (16)6.3.3固定字段 (16)6.3.4取值规范 (16)6.3.5数据库开发工具 (16)6.3.6Sql书写规范 (17)6.4其他规范 (17)7实战代码规范 (18)7.1Java源代码规范 (18)7.1.1java代码命名与格式 (18)7.2jsp/html代码规范 (26)8FAQ (29)8.1Logic类中新增数据方法怎么写 (29)8.2Logic类中修改数据方法怎么写 (30)8.3Logic类中删除数据方法怎么写 (31)8.4怎样创建一个没有底部按钮的窗口 (32)8.5怎样设置弹出窗口的标题 (32)8.6怎样重写提交数据的方法 (33)8.7怎样创建单grid的页面 (33)8.8怎样多个页签的grid的页面 (34)8.9怎样创建左边树右边grid的页面 (34)9代码检查规定 (34)10附录1:JPA使用指南javax.persistence的注解配置 (34)1前言为了使软件开发过程有章可循,保证软件质量,加强开发管理。
2开发管理3项目周期公司项目开发周期分为以下几个步骤:4命名规范4.1 项目编号命名规范4.2 文档命名规范4.3 路径管理路径结构如下:项目名称|_database(数据库数据)|_docs(文档)|_参考文档(项目参考文件)|_需求&设计(需求文件及各种设计文档)|_开发计划|_软件测试|_部署&培训|_工作汇报|_trunk(主目录)|_WebRoot(应用文件)|_src(源代码)|_业务模块一(某一个功能分类,如工具类)|_com.navinfo.分类英文名(源代码目录)||_entity (数据模型)|_logic (逻辑实现类)|_services (逻辑接口层)|_action (Action层)|_utils(当前功能的工具类或常量定义)|_|_spring/ (spring的配置文件)|_hibernate/ (hibernate的配置文件)|_struts/ (struts的配置文件)|_quartz/ (quartz的配置文件)注,红色字体的部分和原有规范不同,主要是业务模块和配置文件放在同一个根目录下,为防止eclipse的配置顺序导致源代码和配置文件分离的很远。
JavaScript_开发规范
JavaScript 开发规范一、注释规范(2009-07-18)1.版权信息:放在每个文件头部,格式如下2.方法信息:格式如下3.细节提示信息:这种类型的注释既可以放在某一行代码之后,也可放在几行代码之间,用双斜杠注释,格式如下4.失效代码:当一段代码不再有效,但这段代码对于阅读者理解程序有重大意义,可以将其注释掉,格式如下5.以下几点需要注意:1)不可滥用注释,在程序中的任何一行代码和注释都必须是有意义的,对程序没有意义的任何语句和注释都必须摒弃,如:2)不要在不合适的地方注释,例如不要在分行的字符串间加上注释3)设计核心算法或机密的代码发布时请清除注释4)常犯的错误:二、命名规范(2009-07-18)1.尽量采用匈牙利命名法:类型+变量命名前缀+对象描述如:var nCount = 1;var sEmail = “javascript@”;var fnAdd = function()……;2.每个页面的命名以“该页面的Nameplace_自定义名称“命名,如:AddNewDetailInfo_nCount,私有变量加“_”下划线前缀,可以不加Nameplace,如:function AddNewDetailInfo_fnAdd (nNum1, nNum2){var _nSum = nNum1 + nNum2;return _nSum;}place命名采用Pascal命名法,可以有三种变形形式:如:Nameplace 为AddNewDetailInfo公共:AddNewDetailInfo 局部:addNewDetailInfo 私有:_addNewDetailInfoID等命名使用“局部“.。
开发工作规范
开发工作规范目录1目的 (1)2范围 (1)3术语 (1)3.1常用命名规则 (1)4编码规范 (1)4.1JS编码规范 (1)4.1.1命名规范 (1)4.1.2编写规范 (2)4.1.3代码注释规范 (2)4.1.4变量使用规范 (3)4.1.5函数使用规范 (3)4.1.6其它规范 (4)4.2ASP.N ET编码规范 (5)4.2.1编码原则 (5)4.2.2命名规范 (5)4.2.3其他规范 (5)4.2.4避免SQL注入式攻击的代码处理 (6)4.3SQL编码规范 (6)4.3.1通用规范 (6)4.3.2变量命名规范 (7)4.3.3视图编码规范 (7)4.3.4存储过程编码规范 (8)4.3.5触发器编码规范 (9)4.3.6自定义函数编码规范 (10)5功能设计规范 (10)5.1图标使用规范 (10)5.2提示信息规范 (10)5.3其它设计规范 (12)5.3.1文件及文件夹命名规范 (12)5.3.2逻辑流程规范 (13)5.3.3动作点规范 (13)5.3.4典型功能点 (13)5.4通用默认规范 (14)5.4.1界面整体规范 (14)5.4.2数据样式规范 (14)5.4.3边界规范 (14)5.4.4默认值规范 (15)5.4.5特殊字符集合 (15)1目的本文的目的是为了规范项目开发活动中开发阶段的产出物,为团队协作提供依据,提升协作效率;并给开发阶段提供工作依据,改善产品源代码的可读性,提升产品的可维护性,降低维护成本。
2范围本文详细描述了产品开发过程中所有编码实践需要遵循的编码规范及功能设计规范,属于在开发明源ERP系统标准时必须遵守的。
3术语3.1常用命名规则4编码规范4.1JS编码规范4.1.1命名规范JavaScript命名规范一般基于Java命名规范,由26个英文字母的大小写(A..Z,a..z)、10个数字(0..9)、“_”(下划线)组成。
避免使用国际化字符(如中文),因为它们不是在任何地方都可以被方便的阅读和理解。
javascript规范
javascript规范JavaScript是一种广泛用于Web开发的编程语言,因其灵活性和易学性而成为了开发者的首选。
为了使代码清晰、易读、易于维护,制定了一些JavaScript规范。
本文将介绍一些常见的JavaScript规范,以帮助开发者写出更好的代码。
1. 变量和函数命名变量和函数的命名应该具有描述性,并且尽量避免使用简写。
同时,应使用驼峰命名法,即首字母小写,后续每个单词的首字母大写。
2. 缩进代码应该使用四个空格进行缩进。
可以在代码编辑器中设置自动缩进功能。
3. 空格在运算符(如=、+、-等)周围使用空格,例如:var x = y + z。
在逗号前不加空格,逗号后加一个空格。
4. 分号每行代码的末尾应添加分号。
这有助于提高代码的可读性,并防止一些意外的错误。
5. 注释对于代码中关键部分的注释是很重要的。
对于复杂的逻辑,应该用注释解释每个步骤的目的。
另外,注释也可以用来标明代码的作者、日期和版本号。
6. 变量声明变量应该在使用前首次声明,并且应该使用let或const关键字进行声明。
尽量避免使用var关键字。
7. 字符串应该使用单引号或反引号而不是双引号来定义字符串。
如果字符串中包含变量或表达式,应使用反引号。
例如:`Hello, ${name}!`8. 对象和数组对象和数组的定义应在一行内写完,而不是换行。
每个属性或元素在下一行单独缩进一次。
9. 条件语句条件语句的代码块应该使用花括号括起来,即使代码块只有一行。
这样可以提高代码的可读性和可维护性。
10. 函数函数应该有明确的输入和输出,并且每个函数只完成一个特定的任务。
函数的代码块应该缩进,并且最好在函数的开始处添加注释,解释函数的作用和参数的含义。
11. 模块化JavaScript中的模块化有助于将代码拆分成更小的、可重用的部分。
应该使用ES6的模块化语法,即使用import和export 关键字来导入和导出模块。
12. 错误处理对可能发生错误的代码应进行适当的错误处理。
JavaScript 代码规范总结
JavaScript 代码规范目录1、常见代码规范 (2)2、空格与运算符 (2)3、变量名 (2)4、代码缩进 (2)5、语句规则 (3)6、对象规则 (3)7、每行代码字符小于 80 (4)8、命名规则 (4)9、使用 JavaScript 访问 HTML 元素 (5)10、HTML 载入外部 JavaScript 文件 (5)11、文件扩展名 (5)12、使用小写文件名 (5)1、常见代码规范代码规范通常包括以下几个方面:1.1变量和函数的命名规则1.2空格,缩进,注释的使用规则。
规范的代码可以更易于阅读与维护。
代码规范一般在开发前规定,可以跟你的团队成员来协商设置。
2、空格与运算符通常运算符 ( = + - * / ) 前后需要添加空格:3、变量名变量名推荐使用驼峰法来命名(camelCase):4、代码缩进通常使用 4 个空格符号来缩进代码块:不推荐使用 TAB 键来缩进,因为不同编辑器 TAB 键的解析不一样。
5、语句规则简单语句的通用规则:• 5.1一条语句通常以分号作为结束符。
复杂语句的通用规则:• 5.1将左花括号放在第一行的结尾。
• 5.2左花括号前添加一空格。
• 5.3将右花括号独立放在一行。
• 5.4不要以分号结束一个复杂的声明。
6、对象规则对象定义的规则:6.1将左花括号与类名放在同一行。
6.2冒号与属性值间有个空格。
6.3字符串使用双引号,数字不需要。
6.4最后一个属性-值对后面不要添加逗号。
6.5将右花括号独立放在一行,并以分号作为结束符号。
7、每行代码字符小于 80为了便于阅读每行字符建议小于数 80 个。
如果一个 JavaScript 语句超过了 80 个字符,建议在运算符或者逗号后换行。
8、命名规则一般很多代码语言的命名规则都是类似的,例如:8.1变量和函数为小驼峰法标识, 即除第一个单词之外,其他单词首字母大写(lowerCamelCase)8.2全局变量为大写 (UPPERCASE )8.3常量 (如 PI) 为大写 (UPPERCASE )9、使用 JavaScript 访问 HTML 元素一个糟糕的 HTML 格式可能会导致 JavaScript 执行错误。
JSF规范(四)
JSF规范(四)本文是基于JSF规范的翻译而来,并省掉一些无关紧要的章节。
如有不当之处请大家指正。
作者:youfly email:seedcloned-pub@转载请注明出处: /youfly2.5 Concepts that impact several lifecycle phases 本章试图通过给读者提供一个影响“请求处理生命周期”各个阶段的一些复杂概念的“big picture”视图。
2.5.1 Value Handling在基本原理层面,JavaServer Faces提供了一个从用户那里获取数据并提供给模型层处理的一个途径。
关于从用户到模型的值处理流在这份规范的其他地方描述,但是可以从这里得到一个整体的认识。
下面的描述假定是JSP/HTTP的情形,并且所有的组件都拥有Renderers。
2.5.1.1 Apply Request Values Phase当用户点击按钮并且引发提交,将发送name=value对形式的HTTP请求POST数据到服务器中。
这就进入了JSF的“请求处理生命周期”,并且最终我们进入了Apply Request Values阶段。
在这个阶段视图中的每个组件的每个Renderer上的decode()方法被调用。
Renderer 从请求中取出值,并将这些值传递给组件的setSubmittedValue()方法,当然,这些组件应该是EditableValueHolder的实例。
如果组件的”immediate”属性被设置成true,我们在decoding后将立即执行验证。
请阅读下面的内容以得到执行验证时所发生的事情。
2.5.1.2 Process Validators Phase视图根的processValidators()方法被调用。
对于视图中的每一个EditableValueHolder,要是”immediate”属性没有设置,我们将执行视图中的每一个UIInput的验证。
JAVA系统开发规范
JAVA开发规范编写人:彭毅批准人:批准日期:版本历史目录1前言 (4)1.1文档目的 (4)1.2适用范围 (4)1.3名词解释 (4)1.4参考资料 (4)2Java开发规范 (4)2.1排版规范 (5)2.1.1缩进 (5)2.1.2分界符(如大括号‘{’和‘}’) (5)2.1.3空格 (6)2.1.3.1 加空格的情况 (6)2.1.3.2 不加空格的情况 (6)2.2注释规范 (7)2.3命名规范 (7)2.3.1包名 (7)2.3.2类名和接口 (7)2.3.3方法名 (7)2.3.4属性名 (8)2.3.5变量 (8)2.3.6常量 (8)2.4编码规范 (8)2.4.1明确方法功能 (8)2.4.2明确类功能 (9)2.4.3三层调用顺序 (9)1 前言1.1 文档目的代码规范对程序员很重要的一些原因:一、一个软件得花费其生命周期的80%去维护。
二、几乎没有任何软件在整个生命周期中是由其原作者维护的。
三、代码规范提高了软件的可读性,能够让工程师更快、更透彻的了解新的代码。
1.2 适用范围本规范规定了使用Java语言编程时排版、注释、命名、编码的规则。
本规范适用于使用Java语言编程的产品和项目1.3 名词解释1.4 参考资料2 Java开发规范日志记录规范规范日志设计规范主要目的是节省工作量,帮助对问题进行诊断。
最终终端用户可以获得更好的应用程序,并能从技术支持团队获得迅速的响应。
2.1 排版规范2.1.1 缩进程序块要采用缩进风格编写,缩进一个tab键。
示例:以下例子不符合规范public void add(int add,int addend){return add + addend;}应该如下书写public void add(int add,int addend){return add + addend;}2.1.2 分界符(如大括号‘{’和‘}’)根据我们的编码习惯,左大括号“{”位于声明语句同行的末尾,右大括号“}”另起一行,与相应的声明语句对齐,除非是一个空语句,“}”应紧跟在“{”之后。
js代码规范
js代码规范JavaScript代码规范(1000字)JavaScript是一种广泛使用的脚本语言,具有灵活性和强大的功能。
为了使代码可读性更好、易于维护和共享,遵循一定的代码规范是非常重要的。
下面是一些常用的JavaScript代码规范。
1. 缩进:使用4个空格作为缩进。
不要使用制表符。
2. 空格:在运算符和操作数之间使用空格,使代码更易读。
3. 大括号:在if、for、while等语句中始终使用大括号。
即使语句只有一行,也应使用大括号。
这样可以减少错误,并提高代码的可读性。
4. 变量命名:使用驼峰命名法(camel case)命名变量和函数。
变量名应具有描述性,并遵循一致的命名约定。
5. 常量命名:使用全大写字母和下划线命名常量。
示例:MAX_LENGTH。
6. 注释:使用注释来解释代码的目的和用途。
对于复杂的代码块或特殊的算法,添加详细的注释是非常重要的。
7. 函数:函数应该具有描述性的名字,并且只完成一个任务。
函数应该尽量保持简短,并避免嵌套过深。
8. 字符串:使用单引号或双引号括起字符串,并保持一致。
示例:var name = 'John';。
9. 变量声明:始终使用var关键字声明变量。
这样可以提高代码的可读性,并避免变量泄漏到全局作用域。
10. 分号:在每条语句的末尾添加分号。
这样可以避免出现一些难以排查的错误。
11. 引号:避免在对象字面量中使用引号。
示例:var person = {name: 'John', age: 30};。
12. 布尔类型:避免使用布尔类型的构造函数。
示例:var isValid = true;。
13. 比较运算符:使用全等(===)和不全等(!==)运算符进行比较。
不要使用双等号(==)进行比较。
14. 避免全局变量:避免在全局作用域中定义变量。
将变量封装在函数内部,以减少变量冲突和增加代码的可维护性。
15. 异常处理:在可能引发错误的代码块中使用try-catch语句来处理异常。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
文档修订记录目录1引言 .................................................................................................................................... - 1 -1.1文档目的 (1)1.2文档适用人员 (1)1.3文档内容范围 (1)1.4相关文档 (1)2界面需求快速描述规范 .................................................................................................... - 2 -2.1描述方式 (2)2.2描述规范 (2)2.3描述模板 (2)3标签使用规范 .................................................................................................................... - 3 -3.1标签选择原则 (3)3.2标签编码风格 (3)3.3标签使用参考手册 (3)3.4标签库引用规范 (3)4BACKINGBEAN编码规范 ............................................................................................. - 4 -4.1B ACKING B EAN命名规范 (4)4.2属性命名规范 (4)4.3方法命名规范 (4)4.4编码风格 (4)4.5B ACKING B EAN开发规范 (4)5JSP编码规范..................................................................................................................... - 6 -5.1文件命名规范 (6)5.2编码整体风格 (6)5.3JSP开发规范 (6)6配置文件规范 .................................................................................................................... - 8 -6.1T ILES配置文件 (8)文件名称及存放路径规范 (8)配置文件继承层数规范 (8)模板J SP文件与TILES配置文件的引用 (8)6.2导航规则文件配置 (9)文件名称及存放路径 (9)6.3B EAN配置文件 (9)文件名称及存放路径规范 (9)6.4资源文件配置 (10)文件名称及存放路径规范 (10)7CSS规范.......................................................................................................................... - 11 -7.1CSS文件名称及存放路径 (11)7.2CSS模板 (11)附录1:JSP界面代码示例 (12)1引言1.1文档目的该文档旨在规范JSF开发过程;规范界面开发的各个步骤;规范界面开发的提交件。
为界面开发工程化实施提供技术规范和指导。
1.2文档适用人员本文档适用人员包括:●界面开发小组●技术经理●JSF技术研究人员●各项目组开发人员1.3文档内容范围本文档列出界面开发小组在开发过程中必须遵守的JSF编程规范,包括:●界面需求快速描述规范●标签使用规范●BackingBean编码规范●JSP编码规范●配置文件规范●CSS使用规范1.4相关文档Lib\ccb.jar 厦门开发中心标签库Lib\myfaces1.1.1.jar myfaces的标签库和JSF核心cn\ccb\foundation\common\web\BaseBackingBean.java 所有BackingBean需要继承的《JSF开发指南》《Java编码规范与指南》- 1 -2界面需求快速描述规范2.1描述方式界面需求快速描述是指在完成需求分析后,由项目组以Excel格式快速描述界面的需求,做为需求和界面原型之间的接口,交由界面小组完成系统JSF 界面原型开发工作。
2.2描述规范快速描述模板的布局、色彩、交互、样式按照《BS架构系统用户界面规范》规定进行描述。
描述模板所使用的控件采用界面需求模板所提供的控件,如果不能满足需求,需由界面小组提供新控件。
2.3描述模板参照《BS架构界面需求模板》。
BS架构界面需求模板.xls3标签使用规范3.1标签选择原则该文档讨论的JSF标签包括标准的JSF标签和MyFaces中扩展的所有标签。
标签的选择原则是:在满足需求的前提下,优先选择标准JSF标签。
各个项目组必须采用中心确定的控件(包括SUN,myfaces,xmdc),如果不能满足需求,需要由JSF界面小组统一提供。
3.2标签编码风格标签编码应该遵循子标签层层缩进原则,即如果一个标签A包含另一个标签B,则称标签B是标签A的子标签。
在编码中B标签的位置相对标签A缩进一个Tab的位置(Tab的宽度以Java编码规范为准)。
在开发中不要使用Tab 符,而应该使用空格替换。
3.3标签使用参考手册JSF所涉及到的所有标签使用说明请参考JSF演示站点http://128.64.191.6/demo。
3.4标签库引用规范对JSF标准标签库引用的标准语法如下:<%@ taglib uri="/jsf/core" prefix="f" %><%@ taglib uri="/jsf/html" prefix="h" %> 对Myfaces标签库应用的标准语法如下:<%@ taglib uri="/extensions" prefix="x" %> 对于HTML标签的使用,标签库的标准语法如下:<%@ taglib uri="/htmLib" prefix="htm"%> 对于自定义标签的使用,标签库的标准语法如下:<%@ taglib uri="/xmdc" prefix="xmdc"%>4BackingBean编码规范4.1BackingBean命名规范BackingBean命名规范以《Java编码规范与指南》中2.2.4节内容所规定的类命名规范为标准,。
4.2属性命名规范BackingBean属性命名以《Java编码规范与指南》中2.2.8节内容所规定的变量命名规范为准。
4.3方法命名规范BackingBean方法命名规范以《Java编码规范与指南》中2.2.6节内容所规定的方法命名规范为准。
4.4编码风格BackingBean编码风格以《Java编码规范与指南》中2.3规定的格式规范为准。
4.5BackingBean开发规范Session使用原则为了避免session带来的集群问题,除保存数据的公共Backingbean外,其他BackingBean的scope必须设置为request。
需要参数传递的请参考《JSF开发指南》BackingBean参数传递部分继承BaseBackingBean每一个BackingBean必须继承mon.web.BaseBackingBean,该基类将会在本文档的附件中提供。
异常处理在BackingBean的方法体中,必须对Exception类型的异常进行捕获,同时结合ExceptionMsg做异常处理,具体方法可参照《JSF开发指南》。
文件下载继承BaseBackingBean的downLoadFile方法实现文件下载功能。
Session清除对于Scope为Session的BackingBean,为了减轻服务器负担,同时为了避免业务混淆,在流程完成以后必须使用BaseBacking里面的removeBB方法把此当前BackingBean从系统session中删除。
依赖注入BackingBean必须采用依赖注入的方式来注入数据日志BackingBean日志依托Apache的Log4j工具管理。
BackingBean中的下列情况必须输出日志:1.所有业务方法的出口和入口处;2.捕获异常时,必须将异常信息,这种情况已经托管ExceptionMsg管理,用户可以不必关心。
程序调试的日志输出时严禁使用System.out机制,调试信息使用info级别的日志。
5JSP编码规范5.1文件命名规范JSP文件命名规范参照《Java编码规范与指南》2.2中规定的命名规范,按照功能英文名称命名,文件名超长50个字符的,可以适当采用简拼。
5.2编码整体风格具体请参照本文附录1《JSP界面代码示例》。
●HTML标签的使用1.原则上在JSF中禁止使用HTML标签2.JSF标签难于实现的功能,使用JSF封装的HTML标签●编码排版风格JSP编码排版风格遵循层层缩进原则●注释注释的标准语法如下:<%-- 注释的内容 --%>5.3JSP开发规范整个jsp表示层应当尽可能的瘦和简单化。
大多数的JSP都是只读的视图,由页面BackingBean来提供模型。
jsp不应该直接去访问请求参数,BackingBean应当执行这样的处理过程并且输出所处理的模型数据。
在jsp中避免代码重复。
把重复的功能放在一个jsp中,使得它能够被重用。
每个jsp文件中不需要使用messages来显示异常,由myfaces框架统一的异常处理方法来显示异常。
在JSP中尽量慎用JAVASCRIPT,如果BaseBackingBean或标签中已经提供的公共方法必须采用公共方法来解决。
界面校验项必须使用xmdc:commonsValidator,保证界面和BackingBean校验同步。
所有JSP文件必须继承模版文件,并在tiles中配置路径。
JSP不负责页面跳转,由导航和BackingBean来管理。
JSP文件头部统一格式如下(如果是tiles的子文件可以不同)<%@ page contentType="text/html; charset=GBK" %><%@ taglib prefix="f" uri="/jsf/core" %><%@ taglib prefix="h" uri="/jsf/html" %><%@ taglib uri="/extensions" prefix="x"%> <%@ taglib uri="/xmdc" prefix="xmdc"%><%@ taglib prefix="tiles" uri="/tags-tiles"%><html><f:view><f:loadBundle basename="mon.web.public" var="msgs"/><head><META HTTP-EQUIV="Pragma" CONTENT="no-cache"><META HTTP-EQUIV="Cache-Control" CONTENT="no-cache"><META HTTP-EQUIV="Expires" CONTENT="0"><meta http-equiv="Content-Type" content="text/html" /><title><h:outputText value="#{msgs.title}"/></title><link rel="stylesheet" type="text/css" href="<%=request.getContextPath()%>/css/public.css"/><link rel="stylesheet" type="text/css" href="<%=request.getContextPath()%>/css/ext.css" /></head><body>日期格式统一采用建行标准:YYYYMMDD6配置文件规范6.1Tiles配置文件文件名称及存放路径规范tiles配置文件的名称为tiles.xml,存放在Web应用下面的WEB-INF下。