开发经验分享
一、 编码
1. 约束自己,规范编码习惯
充足的代码注释、标准缩进的格式、注意命名规范。参考《开发管理规范》
"看上去"专业能促进代码质量。越是难看的代码,在它的演化过程中会越来越差。因为当你看到你要bugfix的代码很乱,那么在bugfix的时候一般也会草草了事。一个方法有400行,在修改这个方法的时候大家不会在意再加上几十行代码。因为它看起来很差,它就是很差,我没必要美化它。反过来说,如果待改的代码很整洁很规范,那么修改者也会比较小心。
2. 避免冗长的方法和类
应将方法设计成简要的、功能性单元,用它描述和实现一个不连续的类接口部分。理想情况下,方法应简明扼要。若长度很大,可考虑通过某种方式将其分割成较短的几个方法。这样做也便于类内代码的重复使用(有些时候,方法必须非常大,但它们仍应只做同样的一件事情)。
3. 不要向标准输出写无用数据
System.out.println(); 此语句在程序中随处可见,都是在调试时使用的,在程序正式运行时也没有将其去掉,结果就是日志中有大量的无用数据,不仅使得日志不易分析,也增加了系统的开销。
如要调试可用LogWriter,将WEB-INF/ini/merpserver.ini中loglevel设为4
4. 调用方法前注意参数校验,判断参数是否为空或无意义的值
5. 使用对象前,检查对象是否为空
if(names!=null&&names.length>0){
String[] nameArray = names.split(‘,’);
}
if(userEn!=null){
String name = userEn.getName();
}
6. 避免过多过常的创建java对象
尽量避免在经常调用的方法、循环中new对象,由于系统不仅要花费时间来创建对象,而且还要花时间对这些对象进行垃圾回收和处理,在我们可以控制的范围内,最大限度的重用对象,最好能用基本的数据类型或数组来替代对象。
7. 尽量避免随意使用类成员变量
当某个对象被定义为stataic变量所引用,那么gc通常是不会回收这个对象所占有的内存的。此时类成员变量的生命周期与类同步,如果类不卸载,那么该对象会常驻内存,直到程序终止
8. 减少对变量的重复计算
如
for(int i=0;i<list.size();i++)
应该改为
for(int i=0,len=list.size();i<len;i++)
并且在循环中应该避免使用复杂的表达式,在循环中,循环条件会被反复计算,如果不使用复杂表达式,而使循环条件值不变的话,程序将会运行的更快
9. 避免不必要的创建对象
如
A a = new A();
if(i==1){
list.add(a);
}
应该改为
if(i==1){
A a = new A();
list.add(a);
}
10. 原则上循环里面不要声明对象,一律在循环外面声明
for(int i=0;i<size;i++){
String title = “标题”;
}
改为
String title = null;
for(int i=0;i<size;i++){
title = “标题”;
}
11. 尽量在finally块中释放资源
程序中使用到的资源应当被释放,以避免资源泄漏。这最好在finally块中去做。不管程序执行的结果如何,finally块总是会执行的,以确保资源的正确关闭。
12. 使用StringBuilder和StringBuffer进行字符串连接
StringBuffer提供了同步机制,所以并发线程访问是线程安全的,适合多线程。
StringBuilder没有提同步机制,所以线程不安全,适合单线程,但如果是单线程的话,要比StringBuffer快。
13. 遍历HashMap使用entrySet
当需要遍历HashMap的时候,请尽量使用entrySet,而不要用keySet,entrySet的效率要比keySet高,实际上使用entrySet是只需要遍历一次hash,即将key和value的映射关系放入到entry中,再取之;而keySet需要两次遍历hash,第一次取所有的key,第二次用key去取出对应的value。
Iterator iter = hashMap.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry entry = (Map.Entry) iter.next();
String key = String.valueOf(entry.getKey());
String val = String.valueOf(entry.getValue());
}
14. 尽量缓存经常使用的对象
尽可能将经常使用的对象进行缓存,可以使用数组,或HashMap的容器来进行缓存,但这种方式可能导致系统占用过多的缓存,性能下降。
推荐参考《开发指南》,使用EHCache
15. 使用统一的工具类
使用hanwebcommon.jar中的通用方法,具体参考《开发指南》
使用项目中已经存在的工具类,不要重复创造功能近似的类和方法,如果必要可进行扩展
如:接收参数使用Convert.getParameter(request, 参数名);
16. 减少不必要的空格和空行,参考《开发管理规范》
17. java代码中不要出现黄色警告。注释或删除未使用的变量;保存时去掉多余的import;…
18. 前台接收Stirng类型参数,要进行跨站脚本和sql注入过滤
Convert.getParameter(request,"keyword","",true,true);
19. 不要在jsp中实现业务逻辑,放到类中去完成
分层设计实现了软件之间的解耦;便于进行分工;便于维护;提高软件组件的重用;便于替换某种产品,比如持久层用的是hibernate,需要更换产品用toplink,就不用改其他业务代码,直接把配置一改;便于产品功能的扩展;便于适用用户需求的不断变化。
20. 避免在循环体中使用try-catch 块,最好在循环体外使用try--catch 块以提高系统性
21. oracle大字段操作
先插入一个空的clob类型 empty_clob(),然后再单独更新clob字段
InsertSql insql = new InsertSql( strTableName );
insql.addString("vc_name", name);
if (("oracle").equals(SysInit.getM_strDB_Type())){
insql.addClob("vc_adress");
insql.addClob("vc_path");
}else{
insql.addString("vc_adress", address);
insql.addString("vc_path", path);
}
boolean bl = Manager.doExcute(strAppID , insql.getSql());
if(bl){
if (("oracle").equals(SysInit.getM_strDB_Type())){
String[] strFieldValue = {address, path};
String[] strFieldName ={"vc_adress","vc_path"};
Manager.doClob(strAppID, strFieldName, strFieldValue, strTableName, " WHERE i_id = " + getMaxId());
}
}
22. 使用统一的<!DOCTYPE>,保证不同浏览器下的页面兼容
建议使用:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
23. HTML结构要完整、正确
标准的HTML文档结构:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Insert title here</title>
……
</head>
<body>
……
</body>
</html>
其它:
<ul>
<li>……</li>
<li>……</li>
</ul>
<table>
<tr>
<td>……</td>
</tr>
</table>
24. HTML标签要完整
标签名称及属性统一使用小写,标签要成对出现,如:
<div id=”search”>………</div>
不用于包含内容的标签,可在标签结尾使用“/”标记结束,如:
<input type=”text” name=”username” value=”tony” />
<br/>
25. 标签属性值必须用双引号包住
26. HTML代码使用标准缩进
27. 脚本每一条语句都要以分号结尾
28. 具有独特性、不需要重复使用的样式,使用内嵌样式:
<div style=”title”>标题<div>
能够重复使用的样式,在样式表中定义:
<li class=”menu”>菜单</li>
页面内使用的样式,使用内嵌样式表:
<style type="text/css">
.menu{
color:black;
font-size:13px;
}
</style>
多个页面公用的样式使用链入外部样式表:
<link href="../global.css" rel="stylesheet" type="text/css" />
29. 页面内使用的脚本函数,在head中定义:
<script type=”text/javascript”>
function checkForm(){
……
}
</script>
重复使用的脚本函数或代码较多的脚本,写到外本脚本文件中,在head中链接:
<script type=”text/javascript” src=”../checkform.js” />
不影响页面本身展示的脚本可考虑放在body结束的位置调用,如广告代码:
……
<script type=”text/javascript” src=”../adv.js” />
</body>
30. 风格统一,保存时要对代码进行格式化,Ctrl+Shift+F
31. 养成程序优化的意识
现在我们经常遇到的一个问题是,程序在开发阶段,执行的完全正常,找测试人员测试也没问题,但是一到上线后,性能马上出问题了,运行速度像蜗牛,客户不堪忍受,为什么?简单的说,开发人员自测,估计也就几条数据,测试人员测试,估计也就几十上百条数据,一般的程序代码,在这个数量级,性能瓶颈根本就表现不出来。但是上线后,客户的数据一般都上升到10000级别的,如果程序代码中没有做到细微之处都很严谨的话,问题就马上暴露出来了。
二、 数据库
1. SQL语句中保留字、函数名要大写,表明、字段名全部小写
如:SELECT vc_name,vc_sex,i_age FROM user WHERE i_id = 100 AND i_type = 2
2. 使用标准SQL语句,防止数据库兼容问题
3. 循环里面(包括循环调用方法内)避免过多操作数据库
4. 选择最有效率的表名顺序
ORACLE 的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,必须选择记录条数最少的表作为基础表。如果有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是指那个被其他表所引用的表
5. 注意WHERE子句中的连接顺序
ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾
6. SELECT子句中避免使用*
ORACLE在解析的过程中, 会将'*' 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间
7. 减少访问数据库的次数,尽量批量操作数据库,如批量删除
ORACLE在内部执行了许多工作: 解析SQL语句, 估算索引的利用率, 绑定变量 , 读数据块等
8. 避免在WHERE子句中使用in,not in,or 或者having
可以使用 exist 和not exist代替 in和not in
9. 用WHERE子句替换HAVING子句
避免使用HAVING子句, HAVING 只会在检索出所有记录之后才对结果集进行过滤. 这个处理需要排序,总计等操作. 如果能通过WHERE子句限制记录的数目,那就能减少这方面的开销。
10. 用好数据库事务
事务是指作为单个逻辑工作单元执行的一系列操作。通过将一组相关操作组合为一个要么全部成功要么全部失败的单元,可以简化错误恢复并使应用程序更加可靠。
Transaction ts = null;
try{
ts = new Transaction(appId);
…
…
boolean bl = ts.execute(sql);
if(bl){
bl = ts.commit();
}
if(!bl){
throw new Exception();
}
}catch(Exception e){
if(ts!=null)
ts.roolback();
bl = false;
}
11. 注意SQL执行效率,考虑单表记录10W以上的运行效果
setup中,日志显示级别为警告以上时,执行时间超过300ms的SQL语句,会在日志中输出warning
12. 索引
参考《开发管理规范》
三、 项目开发
1. 需求:
1) 需求最终需要开发人员在产品中实现,开发不合理的设计会浪费时间,开发技术无法实现的设计带来最大的痛苦:失败。所以,开发人员要重视需求以及需求评审,提出自己能够想到的所有异议;
2) 开发人员不但要做好需求分析,还要做出精确的估计。因为编码工作保质保量的按时完成需要多方的准备工作,技术难点需要进行充分的技术预言,不熟悉的依赖平台或类库要进行熟悉;
2. 计划:一栋楼很难估算重量,但是一块砖头可以精确估算重量。一个项目的时间很难准确的估计,但把项目开发划分为不能再进行分割的模块功能点,对每个点的估计是可以更精准的估时的,由此由上至下,由下至上,可以得出近乎准确的开发时间。
3. 设计:
1) 一图胜万言,模块结构以及流程等很难用用文字描述,即使用文字描述出来也很难看懂,所以在设计中,要善用用图;
2) 详细设计过程中有思考的痛苦,繁琐的痛苦,但是绕过这些痛苦,编码期间将会面临更大的痛苦,要以快乐的心态面对。
4. 编码:
1) 对于一个实现可以有很多解决方案,花些时间精力选取你认为最好的解决方案可以总体上提高工作成效,往往还可以得到用户更好的体验效果;
2) 细致认真严谨的工作即是对工作负责,更是对自己负责,让这些成为习惯。任何一次,任何时候所进行的编码工作,在逻辑、风格、简单有效等方面都尽可能的做到最好,既能更好为公司实现价值,同时更有利自己在技能,岗位的进步;
3) 简单是美,在有效的前提下,越是简单的处理方法越是珍贵的,代码编写也是,简单的代码便于理解维护,同时不容易产生错误
4) 慎做改动,当然不是说不做改动或不鼓励改动,而是不做仓促、草率的代码改动。没有洞察全局,考虑全面,而仓促进行的改动往往没有达到改动的目的却带来了其他问题
5) 模块的性能不是减少一行或几行执行代码所能提高的,性能的优化首先是从算法上考虑,降低时间复杂度,然后从执行逻辑入手,减少循环执行代码的执行次数
6) 关键地方要打印日志输出到文件中,在运行过程中不断检查日志,发现任何异常都要检查原因并修改
5. 测试:
1) 事出有因,任何bug都是由于代码的疏漏造成的,利用排除法或跟踪调试代码等方法找到疏漏所在;
2) 遇到自身模块相关问题首先检查自己,相互推诿只会浪费时间以及减弱在其他同事对你的信任;
3) 站的高看得远,不同的视角有不同的风景。遇到比较难解决的问题而苦苦没有思路时,转换思路或把问题的考虑范围放的更广一点,往往可以找到解决方案
4) 功能提交测试前或bug修复提交验证前,开发人员都要自己详细的测试一下,验证无误再提交。(参考附录2--测试常见问题)
6. 其它:
1) 善于及时的沟通。在项目的整个流程过程中,遇到他人的问题或自己解决不了的问题,切忌堆在自己心里,要及时找问题解决方进行沟通,寻求解决方案
2) 善于发现并学习别人的长处。作为开发人员,我们在追求接近完美的同时,也需要学会欣赏别人的长处,发现别人的优点,并学习别人的优点,转化为自己的潜质,这样,我们才可以进步的更快,更全面
3) 善于帮助他人解决问题以及进行知识经验的分享,更有利于自己的提高,同时还可以获得他人的尊重
四、 关于测试
1. 在整个项目计划中,测试时间安排的合理性,对测试阶段的情况应作充分预计,不可为了赶发布点而忽略质量。
2. 务必清楚产品包、更新包、bug包的提交规范。具体请参照《开发规范手册》。不要出现测试过程中提交多个bug包,或者提交安装包给测试人员更新的情况。
3. 提包时请先检查,路径是否正确、文件是否完整、配置文件是否应该提交,源代码修改记录描述是否完善。之前经常出现,提包不检查就直接提交来测试,导致出错后环境不断地还原或者重建新的环境。CVS使用不熟悉,提交文件反复出错。
4. 产品质量需要严格控制,自己承认是问题的情况下,请不要试图和测试商谈希望可以不被追究。
5. 请注意提高修改bug的质量,目前,修改一个bug而引发更多的bug的情况特别多。
6. bug修改完成后,在提交测试前请自己先验证通过后再提交,请不要修改完成后不验证就直接提交给测试人员,防止导致bug被反复reopen的情况。
7. 原则上不允许不通过CVS而直接提交文件给测试人员调试问题、寻找原因。如果确有必要,测试人员可以协助调试,但次数不宜过多,防止测试环境版本难以控制。
8. bug是否存在的衡量标准以测试环境为准,不建议出现“我这边是好的”这样的解释。
9. 修改bug时请修改完整,可能会有多个小问题提交在一个BUG里面,BUG修改时多个小问题的地方均需修改。
10. 更新文件必须通过配置发布,无论是否经过测试都不允许直接发给项目或直接更新客户服务器
五、 开发环境
1. Eclipse内存溢出、崩溃、无响应、启动慢
1) 建立多个workspace
2) 将workspace中暂时不用的工程close
3) 修改eclipse配置文件eclipse.ini,参考知识库:
-Xms512m
-Xmx512m
-XX:PermSize=96m
-XX:MaxPermSize=96m
2. Eclipse统一字符集为UTF-8
1) 进入Eclipse->Window->Preferences->General->Workspace界面,在“Text file encoding”中选择“other”并在下拉列表中选择“UTF-8”,并点击【Apply】后,点击【OK】确认保存
2) 修改jsp文件头部
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
将字符集改为“UTF-8”
3) 进入Eclipse->Window->Preferences->Web->JSP Files界面,将“Encoding”属性修改为“ISO 10646/Unicode(UTF-8)”
4) 已建立的项目,右键点击项目名称,进入Properties->Resource界面,选择“Text file encoding”编码为“UTF-8”
3. 打开Eclipse内存监视及回收插件
进入Eclipse->Window->Preferences->General界面,勾选“Show heap status”,点击【Apply】后,点击【OK】确认保存。Eclipse右下角,会显示JVM内存使用情况。
点击垃圾桶图标,可进行手动回收
4. 设置断点,进行调试
1) 行断点
行断点是最普通的断点。只要在Eclipse Java 编辑区的行头双击就会得到一个断点,代码会运行到此处时停止
2) 条件断点
条件断点,顾名思义就是一个有一定条件的断点,只有满足了用户设置的条件,代码才会在运行到断点处时停止。
在断点处点击鼠标右键,选择最后一个"Breakpoint Properties"
断点的属性界面及各个选项的意思如下图,
3) 变量断点
断点不仅能打在语句上,变量也可以接受断点
下图就是一个变量的打的断点,在变量的值初始化,或是变量值改变时可以停止,当然变量断点上也是可以加条件的,和条件断点的设置是一样的
4) 方法断点
方法断点就是将断点打在方法的入口处,方法断点的特别之处在于它可以打在 JDK的源码里,由于 JDK 在编译时去掉了调试信息,所以普通断点是不能打到里面的,但是方法断点却可以,可以通过这种方法查看方法的调用栈
5) 类型载入断点
可以查看什么时候载入的类
6) 异常断点
当异常发生时,代码会停在异常发生处,定位问题时应该比较有帮助
打开Breakpoints视图,点击按钮,增加异常断点
5. 修改代码字体
进入Eclipse->Window->Preferences->General->Appearance->Colors and Fonts界面,选择Basic->Text Font,点击右侧【Edit…】,选择。点击【Apply】后,点击【OK】确认保存
6. Eclipse快捷键,见“附录1—Eclipse快捷键”
六、 Linux
见《Linux_命令详解》
常用命令:
cd 变换工作目录
cd / 返回根目录 cd ../ 返回上层目录
ls 显示指定工作目录下的内容
mv 将一个档案移至另一个档案,或将数个档案移至另一个目录
mv /data/m3 /root 将/data/m3转移到/root目录下
mkdir 创建指定的目录名
mkdir /root/temp 在root目录下创建temp目录
rm 删除档案及目录
rm –rf 文件/文件夹 彻底删除文件/文件夹
rmdir 删除空的目录
kill 终止进程
kill -9 2342 杀掉进程标识号PID为2342的进程
ps 报告进程状况
ps –ef|grep java 查看java进程
tail 从指定点开始将指定的文件写到标准输出
tail –f nohup.out 实时读取日志nohup.out的更新内容
su 变更为其它使用者的身份
su – user1 切换到用户user1
cp 复制
cp config.xml /data/ 将config.xml文件复制到/data/目录下
reboot 重启服务器
halt 关闭服务器
top 显示目前正在系统中执行的程序
free 显示系统内存与swap使用的情况
java –version 查看JDK版本
chromd 777 /temp/runthread.sh 赋予用户/temp/runthread.sh最大权限
cat /dev/null > nohup.out 清空日志nohup.out文件内容
df –hl 查看磁盘空间与使用情况
du 显示目录下所有文件并列出文件大小
pwd 查看当前所在路径
export lang=zh_CN 修改环境变量lang值,解决linux乱码
./startup.sh tomcat启动
nohup ./startWeblogic.sh & weblogic启动(不挂断运行,防止注销后weblogic停止)
./startServer.sh server1 websphere启动
七、 常见问题
1. jsp出现getOutputStream() has already been called for this response
jsp中出现此错误一般都是在jsp中使用了输出流(如输出图片验证码,文件下载等),没有妥善处理好造成的。
jsp编译成servlet之后在函数_jspService(HttpServletRequest request, HttpServletResponse response)的最后有一段这样的代码
finally {
if (_jspxFactory != null) _jspxFactory.releasePageContext(_jspx_page_context);
}
这里是在释放在jsp中使用的对象,会调用response.getWriter(),因为这个方法是和response.getOutputStream()相冲突的!所以会出现以上这个异常。
out.clear();
out = pageContext.pushBody();
2. xml加载错误
1) weblogic下,xml没有以xml文档方式加载,而是按照文本方式展现,导致出错,例如高级编辑器或树会出现加载错误
解决方法:在web.xml文件中增加
<mime-mapping>
<extension>xml</extension>
<mime-type>text/xml</mime-type>
</mime-mapping>
2) 网络问题,导致无法访问DTD(文档类型定义,作用是定义 XML 文档的合法构建模块)
解决方法:删除DTD声明,或者指向服务器本地DTD
3) XML 声明通常在 XML 文档的第一行出现。XML 声明不是必选项,但是如果使用 XML 声明,必须在文档的第一行,前面不得包含任何其他内容或空白。动态产生的xml文档,开头产生了空白行,造成错误。
解决方法:输出xml内容之前,用 out.clear(); 清空缓存
3. 中文乱码
1) jsp页面乱码,头部指定字符集为UTF-8
<%@page language="java" contentType="text/xml; charset=utf-8"%>
2) 数据库乱码,指定数据库字符集为UTF-8,同时dbconfig.xml的连接字符串中设置字符集为UTF-8
3) 中文参数乱码。tomcat下修改server.xml中HTTP的Connector的URIEncoding属性为UTF-8;js传递中文参数,用encodeURI() 进行编码
4. jPage脚本错误,检查proxyUrl指定的jsp页面的输出内容。输出的内容为脚本片段,要符合javascript语法。
dataStore为字符串数组,需要过滤dataStore中元素里的单引号
replaceAll("\'","\\\\'").replaceAll("\r\n","");
输出形式如下:
dataStore = ['第一条\'记录\'内容', '第二条”记录”内容', '第三条记录内容'];
5. Apache与Tomcat整合,session丢失
参考知识库:
http://km.hanweb.com/viewthread.php?tid=1515&highlight=tomcat%2B%E5%80%AA%E7%87%95%E9%9C%9E
http://km.hanweb.com/viewthread.php?tid=978&highlight=tomcat
http://km.hanweb.com/viewthread.php?tid=1127&highlight=%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98
6. zip文件解压错误,提示找不到方法
应用中的ant.jar同中间件自带的文件冲突,将/WEB-INF/lib/ant-1.7.0.jar改名为ant.jar 覆盖到中间件的目录下
weblogic:weblogic/bea/weblogic81/server/lib/ant
websphere:WebSphere/AppServer/lib
7. 脚本错误,使用浏览器调试工具
IE8及以上版本,使用浏览器自带的开发人员工具,按F12进行脚本调试
FireFox使用Firebug插件进行调试,按F12进行脚本调试
8. 中间件报错如下:java.sql.SQLException: IO异常:The Network Adapter could not establish the connection,先后重启数据库和中间件无效
1) 用“telnet 数据库IP 数据库端口”命令检查网络是否畅通
2) 检查是否超过了数据库最大连接数
参考http://km.hanweb.com/viewthread.php?tid=1448&highlight=%E8%BF%9E%E6%8E%A5%E6%95%B0
3) 检查是否有防火墙
4) 数据库监听日志大小是否超过2G(/data/oracle/product/版本号/network/log/listener.ora)
9. 日志中报too many open files错误
linux默认打开文件的最大数是1024,解决方法:
用cat /proc/sys/fs/file-max 命令查看打开文件的最大限制数
用echo 65536 > /proc/sys/fs/file-max 命令修改
编辑/etc/sysctl.conf文件,编辑行fs.file-max=65536
编辑/etc/security/limits.conf,增加行* - nofile 65536
10. 导入XML文件失败
Editplus检查xml文件是否是UTF-8编码
八、 附录1(Eclipse快捷键)
快捷键 |
功能 |
Ctrl+1 |
快速修复 |
Ctrl+D |
删除当前行 |
Ctrl+Alt+↓ |
复制当前行到下一行(复制增加) |
Ctrl+Alt+↑ |
复制当前行到上一行(复制增加) |
Alt+↓ |
当前行和下面一行交换位置 |
Alt+↑ |
当前行和上面一行交换位置 |
Alt+← |
前一个编辑的页面 |
Alt+→ |
下一个编辑的页面 |
Alt+Enter |
显示当前选择资源的属性 |
Shift+Enter |
在当前行的下一行插入空行 |
Shift+Ctrl+Enter |
在当前行插入空行 |
Ctrl+Q |
定位到最后编辑的地方 |
Ctrl+L |
定位到某行 |
Ctrl+M |
最大化当前的Edit或View |
Ctrl+/ |
注释当前行,再按则取消注释 |
Ctrl+O |
快速显示 OutLine |
Ctrl+T |
快速显示当前类的继承结构 |
Ctrl+W |
关闭当前Editer |
Ctrl+K |
参照选中的Word快速定位到下一个 |
Ctrl+E |
快速显示当前Editer的下拉列表 |
Ctrl+/(小键盘) |
折叠当前类中的所有代码 |
Ctrl+×(小键盘) |
展开当前类中的所有代码 |
Ctrl+Space |
代码助手完成一些代码的插入(但一般和输入法有冲突,可以修改输入法的热键,也可以暂用Alt+/来代替) |
Ctrl+Shift+E |
显示管理当前打开的所有的View的管理器 |
Ctrl+J |
正向增量查找(按下Ctrl+J后,你所输入的每个字母编辑器都提供快速匹配定位到某个单词,如果没有,则在stutes line中显示没有找到了,查一个单词时,特别实用,这个功能Idea两年前就有了) |
Ctrl+Shift+J |
反向增量查找 |
Ctrl+Shift+F4 |
关闭所有打开的Editer |
Ctrl+Shift+X |
把当前选中的文本全部变为大写 |
Ctrl+Shift+Y |
把当前选中的文本全部变为小写 |
Ctrl+Shift+F |
格式化当前代码 |
Ctrl+Shift+P |
定位到对应的匹配符(譬如{}) (从前面定位后面时,光标要在匹配符里面,后面到前面,则反之) |
Alt+Shift+R |
重命名 |
Alt+Shift+M |
抽取方法 |
Alt+Shift+C |
修改函数结构 |
Alt+Shift+L |
抽取本地变量(可以直接把一些魔法数字和字符串抽取成一个变量,尤其是多处调用的时候) |
Alt+Shift+F |
把Class中的local变量变为field变量 |
Alt+Shift+I |
合并变量 |
Alt+Shift+V |
移动函数和变量 |
Alt+Shift+Z |
重构的后悔药 |
编辑
快捷键 |
功能 |
作用域 |
Ctrl+F |
查找并替换 |
全局 |
Ctrl+Shift+K |
查找上一个 |
文本编辑器 |
Ctrl+K |
查找下一个 |
文本编辑器 |
Ctrl+Z |
撤销 |
全局 |
Ctrl+C |
复制 |
全局 |
Alt+Shift+↓ |
恢复上一个选择 |
全局 |
Ctrl+X |
剪切 |
全局 |
Ctrl1+1 |
快速修正 |
全局 |
Alt+/ |
内容辅助 |
全局 |
Ctrl+A |
全部选中 |
全局 |
Delete |
删除 |
全局 |
Alt+? Alt+Shift+? Ctrl+Shift+Space |
上下文信息 |
全局 |
F2 |
显示工具提示描述 |
Java编辑器 |
Alt+Shift+↑ |
选择封装元素 |
Java编辑器 |
Alt+Shift+← |
选择上一个元素 |
Java编辑器 |
Alt+Shift+→ |
选择下一个元素 |
Java编辑器 |
Ctrl+J |
增量查找 |
文本编辑器 |
Ctrl+Shift+J |
增量逆向查找 |
文本编辑器 |
Ctrl+V |
粘贴 |
全局 |
Ctrl+Y |
重做 |
全局 |
查看
快捷键 |
功能 |
作用域 |
Ctrl+= |
放大 |
全局 |
Ctrl+- |
缩小 |
全局 |
窗口
快捷键 |
功能 |
作用域 |
F12 |
激活编辑器 |
全局 |
Ctrl+Shift+W |
切换编辑器 |
全局 |
Ctrl+Shift+F6 |
上一个编辑器 |
全局 |
Ctrl+Shift+F7 |
上一个视图 |
全局 |
Ctrl+Shift+F8 |
上一个透视图 |
全局 |
Ctrl+F6 |
下一个编辑器 |
全局 |
Ctrl+F7 |
下一个视图 |
全局 |
Ctrl+F8 |
下一个透视图 |
全局 |
Ctrl+W |
显示标尺上下文菜单 |
文本编辑器 |
Ctrl+F10 |
显示视图菜单 |
全局 |
Alt+- |
显示系统菜单 |
全局 |
导航
快捷键 |
功能 |
作用域 |
Ctrl+F3 |
打开结构 |
Java编辑器 |
Ctrl+Shift+T |
打开类型 |
全局 |
F4 |
打开类型层次结构 |
全局 |
F3 |
打开声明 |
全局 |
Shift+F2 |
打开外部javadoc |
全局 |
Ctrl+Shift+R |
打开资源 |
全局 |
Alt+← |
后退历史记录 |
全局 |
Alt+→ |
前进历史记录 |
全局 |
Ctrl+, |
上一个 |
全局 |
Ctrl+. |
下一个 |
全局 |
Ctrl+O |
显示大纲(在Java类,或JS中找方法) |
Java编辑器 |
Ctrl+Shift+H |
在层次结构中打开类型 |
全局 |
Ctrl+Shift+P |
转至匹配的括号 |
全局 |
Ctrl+Q |
转至上一个编辑位置 |
全局 |
Ctrl+Shift+↑ |
转至上一个成员 |
Java编辑器 |
Ctrl+Shift+↓ |
转至下一个成员 |
Java编辑器 |
Ctrl+L |
转至行 |
文本编辑器 |
搜索
快捷键 |
功能 |
作用域 |
Ctrl+Shift+U |
出现在文件中 |
全局 |
Ctrl+H |
打开搜索对话框 |
全局 |
Ctrl+G |
工作区中的声明 |
全局 |
Ctrl+Shift+G |
工作区中的引用 |
全局 |
文本编辑
快捷键 |
功能 |
作用域 |
Insert |
改写切换 |
文本编辑器 |
Ctrl+↑ |
上滚行 |
文本编辑器 |
Ctrl+↓ |
下滚行 |
文本编辑器 |
文件
快捷键 |
功能 |
作用域 |
Ctrl+S |
保存 |
全局 |
Ctrl+P |
打印 |
全局 |
Ctrl+F4 |
关闭 |
全局 |
Ctrl+Shift+S |
全部保存 |
全局 |
Ctrl+Shift+F4 |
全部关闭 |
全局 |
Alt+Enter |
属性 |
全局 |
Ctrl+N |
新建 |
全局 |
项目
快捷键 |
功能 |
作用域 |
Ctrl+B |
全部构建 |
全局 |
源代码
快捷键 |
功能 |
作用域 |
Ctrl+Shift+F |
格式化 |
Java编辑器 |
Ctrl+\ |
取消注释 |
Java编辑器 |
Ctrl+/ |
注释 |
Java编辑器 |
Ctrl+Shift+M |
添加导入 |
Java编辑器 |
Ctrl+Shift+O |
组织导入 |
Java编辑器 |
运行
快捷键 |
功能 |
作用域 |
F7 |
单步返回 |
全局 |
F6 |
单步跳过 |
全局 |
F5 |
单步跳入 |
全局 |
Ctrl+F5 |
单步跳入选择 |
全局 |
F11 |
调试上次启动 |
全局 |
F8 |
继续 |
全局 |
Shift+F5 |
使用过滤器单步执行 |
全局 |
Ctrl+Shift+B |
添加/去除断点 |
全局 |
Ctrl+D |
显示 |
全局 |
Ctrl+F11 |
运行上次启动 |
全局 |
Ctrl+R |
运行至行 |
全局 |
Ctrl+U |
执行 |
全局 |
重构
快捷键 |
功能 |
作用域 |
Alt+Shift+Z |
撤销重构 |
全局 |
Alt+Shift+M |
抽取方法 |
全局 |
Alt+Shift+L |
抽取局部变量 |
全局 |
Alt+Shift+I |
内联 |
全局 |
Alt+Shift+V |
移动 |
全局 |
Alt+Shift+R |
重命名 |
全局 |
Alt+Shift+Y |
重做 |
全局 |
九、 附录2(测试常见问题)
1. 表和触发器的创建等sql语句更新执行问题,即sql语句不正确;
2. 新增、编辑信息时,对字段输入的类型(数字、字母、日期等)、长度、范围不作校验,如果校验不对需要在处理之前要有相关的提示信息;
3. 新增、编辑信息时,当某一字段输入有问题,提交时,系统作出错误提示,但是其他正确的字段信息均被清空;
4. 新增和编辑修改信息的要求不一致;例如添加要求必填的项,修改也应该必填;添加规定为整型的项,修改也必须为整型.
5. 对新建完成的信息记录打开编辑时显示不正确;
6. 新建信息时新增的空记录错误地保存成功;
7. 新增信息列表后,信息列表排序没有规律,如正序或者倒序,而是无序地插入;
8. 录入后自动计算的字段要随着别的字段修改更新(如单科成绩变后,总成绩也变);
9. 输入较长的信息后,导致界面变形,浏览器分辨率大小撑大或者内容被遮挡
10. 信息输入开头、结尾的空格、null值判断显示;
11. 删除信息时,勾选部分信息记录进行删除时,系统错误删除了其他未勾选的信息记录;选择性删除一条信息记录和删除所有信息记录效果一样;
12. 删除信息时,没有“删除确认”对话框直接删除了所有信息记录;
13. 没有选择记录直接点击删除/修改按钮需要提示“请先选择记录”;
14. 需要考虑删除的关联性,即删除某一个内容需要同时删除其关联的某些内容;
15. 高级检索中的条件检索无论什么条件均可以检索出所有信息列表;
16. 高级检索完成后条件仍然存在,影响了外面的空检索不能正确检索出所有信息;
17. 查询条件名称与信息列表及信息编辑页面相应的字段名称完全统一;
18. 一个模块的excel表格错误地被导入另一个模块;
19. 新增和导入的文件内容字段判断不一致,或者导入时不作判断;
20. 功能实现时,隐性需求未能实现,例如:用户输入四科成绩后,总成绩还是需要用户手动输入;
21. 返回按钮不能实现返回功能;
22. 信息保存提交后系统给出“保存/提交成功”提示信息,但是系统不能自动更新列表显示;
23. 上传图片、文件系统未正确更新;
24. 上传文件、图片时,对文件、图片的类型、大小系统没有正确作控制;
25. 对于范围的查询应该采用全闭的形式,例如选择范围是1-3,应该表示大于等于1并且小于等于3;
26. 操作完成后系统没有正确提示,不知道是成功了还是失败了,不知道操作完成的情况;
27. 系统显示的提示信息描述不正确、与实际结果不一致;例如系统弹出错误提示信息但是操作成功;
28. 信息列表中如果某个字段显示过长用“…”或者分行显示;
29. 大文本框输入应该可以自动换行显示、控制字数等;
30. 界面只读的时候(查询、统计、导入)等,应当不能编辑;
31. 对于添加的时间控件,未根据实际情况作出控制,即选择的时间应当符合实际条件;并且从**至**时间控件选择时没有先后顺序;
32. 文本框等控件的控制禁止了键盘的输入,但是没有阻止鼠标及快捷键的操作,例如测试的时候可以将一段代码或非法输入使用鼠标操作进行复制粘贴操作;
33. 用户注销或者cookie失效后,有页面正常显示导致的错误操作;
34. 与实际常识逻辑上不符合;例如:大小月、二月各自的实际天数;
35. 多种条件冲突而导致结果矛盾,例如:考勤系统中出现过的,又缺勤又迟到的情况;
36. 调试信息遗留(后台打印与文件开发环境配置,多余文件等)
37. 用户、机构与角色的关联关系没有控制正确,例如系统没有给用户a分配相应角色权限时,但是此用户a在系统中错误地有操作权限;
38. 用户登录后自己可以错误地删除自己的账号;
39. 时间控件需作判断时以服务器时间为基准界面显示,字体样式、对齐方式、按钮风格和布局,和公司其他产品统一;
40. 界面风格、布局和公司其他产品保持统一,遵守以下规则:易用性、规范性、帮助设施、合理性、美观与协调性、菜单位置、快捷键组合、安全性考虑,例如:
1) 按钮风格、对齐方式不一致;
2) 文本框的样式、对齐方式不整齐;
3) 界面排版上下不对齐、左右按钮大小不一致;
4) “当前位置”界面中显示的模块名称和实际模块名称不一致;
5) 界面中信息列表新增、删除、排序后,左侧栏目树不能自动刷新;
6) “当前位置”界面中显示的当前模块位置不正确,模块层次丢失,表示上下层关系的箭头多个界面不一致;
7) 界面风格、样式不一致;
8) 界面完全展现后,滚动条使用的不恰当;
41. 功能按钮名称与其页面中的导航要一致,如图8-1中这种显示是错误的,应该两处的叫法一致。
42. 弹出对话框的背景色不能是白色,如图8-2中这种显示是错误的。
43. 滚动条的显示,如图8-3所示,有横着的滚动条,却没有竖着的滚动条,是错误的。
44. 页面样式显示,如图8-4所示,是错误的录入日期列所占宽度应该减小,标题列加宽,录入日期只需显示日期不需显示时间,显示内容与实际描述不一致。
45. 页面折行显示,如图8-5所示,。是错误的
46. 边框线条粗细一致,如图8-6所示,是错误的,整体效果中线条有粗有细。
47. 页面中的空行过多,如图8-7所示,错误的。
48. 页面中的中英文状态下的符号混用,如图8-8所示,是错误的。
49. 页面中的文本框尽量对齐显示,文字部分尽量对齐显示,如图8-8所示,是错误的。
50. 两行内容不要靠太紧凑,如图8-9所示,是错误的。
51. 前台固定必须要显示的图片,当后台未上传图片时,需要默认给一个图片显示。
52. 随着分辨率不同页面不折行显示。
53. 表格框上下要对齐,如图8-10所示,是不正确的。
54. 页面按钮显示名称,与鼠标放在按钮上显示的名称要一致。
55. 按钮位置要对齐,如图8-11所示,是错误的。
56. 必填项要用红色的*标注。
57. tab键对文本框有效。
58. 查询结果为空时,如图8-12显示是错误的。建议有友好提示信息。
59. 页面文字描述,如图*.zip文件描述不准确。正确描述为: zip压缩文件
60. 两层滚动条,如图8-14所示,是错误的
61. 如图8-15的表现方式是正确的。