springMvc参数获取
直接把表单的参数写在Controller相应的方法的形参中,适用于get方式提交,不适用于post方式提交。
1 |
|
url形式:http://localhost/SSMDemo/demo/addUser1?username=lixiaoxi&password=111111 提交的参数需要和Controller方法中的入参名称一致。
通过HttpServletRequest接收,post方式和get方式都可以。
1 | /** |
通过一个bean来接收,post方式和get方式都可以。
1 |
|
通过@PathVariable获取路径中的参数
1 | /** |
例如,访问http://localhost/SSMDemo/demo/addUser4/lixiaoxi/111111 路径时,则自动将URL中模板变量{username}和{password}绑定到通过@PathVariable注解的同名参数上,即入参后username=lixiaoxi、password=111111。
使用@ModelAttribute注解获取POST请求的FORM表单数据
1 |
|
用注解@RequestParam绑定请求参数到方法入参
当请求参数username不存在时会有异常发生,可以通过设置属性required=false解决,例如: @RequestParam(value=”username”, required=false)
1 | /** |
创业常用到的工具
网上找的资源,大概一些都是快速开发的开源项目,看了看大部分都是微信公众号的开源集成代码,可以把我自己封装的项目源码开源出去,顺便测测性能,有时间看下。
反馈问题板块:
1 | 资源1: JEECG 微云快速开发平台( JEECG 3.6.5 云插件开发版) |
1 | 资源2: Jeecg-p3 微服务框架( 1.0 版本) |
1 | 资源3: JeeWx 捷微管家平台( 2.4.1 版本) |
1 | 资源4: H5微信活动平台(P3-weixin-2.0.0) |
1 | 资源5: MiniDao-pe 持久层(1.6 版本) |
1 | 资源6: MiniDao 持久层(1.5.1 版本 - 停止更新) |
1 | 资源7:Jeewx-api 微信接口封装SDK(1.0.1 版本) |
1 | 资源8:Jeewx-qywx-api 微信企业号接口封装SDK(1.0 版本) |
1 | 资源9: JEEWX微信企业号开源平台(1.1 版本) |
1 | 资源10:EasyPOI 简易EXCEL工具类 (2.1.4) |
1 | 资源11:Jeecg-mybatis 参考学习版本(停止更新) |
1 | 资源12:Jeecg-activiti工作流 参考学习版本(非商业版) |
解决浏览器回退表单重复提交问题
暂时没有别的什么好办法,在网上搜索到用sessionStorage+ajax形式请求数据来避免浏览器回退表单重复提交.
首先页面展示为订单列表,分为三个tab,为未支付订单,已支付订单,过期订单,在列表里点击一个item时进入订单详情页,回退后要求效果为还停留在原来的tab,列表位置也要在选中位置。
1 | <div class="mainBody" style="height: auto"> |
原来的实现方式时直接在waitPayId,hasPayId,overdateId三个div中填充数据,现在要修改为用ajax请求的方式进行填充。
ajax请求的部分代码为:
1 | function getOrderListData() { |
页面加载自动调用的js代码为
1 | //当前切换的tab值 |
大概就是浏览器回退再次调用ajax请求的时候判断是否已经调用过,标记保存在sessionStorage里面,这里说下sessionStorage,了解到sessionStorage用于存储一个会话(session)中的数据,这些数据只有在同一个会话中的页面才能访问并且当会话结束后数据也随之销毁。所以sessionStorage不是一种持久化的本地存储,仅仅是会话级存储方式。
而localStorage用于持久化的本地存储,除非主动删除数据,否则数据是永远不会过期的。
Web Storage的概念和cookie相似,区别是它是为了更大容量存储设计的。Cookie的大小是受限的,并且每次你请求一个新的页面的时候Cookie都会被发送过去,这样无形中浪费了带宽,另外cookie还需要指定作用域,不可以跨域调用。
除此之外,Web Storage拥有setItem,getItem,removeItem,clear等方法,不像cookie需要前端开发者自己封装setCookie,getCookie。
但是Cookie也是不可以或缺的:Cookie的作用是与服务器进行交互,作为HTTP规范的一部分而存在 ,而Web Storage仅仅是为了在本地“存储”数据而生。
localStorage和sessionStorage都具有相同的操作方法,例如setItem、getItem,removeItem,clear等.
之前的做法是把这个标志位存储到服务器端,比如存入redis在记录,但是比较来说存储到redis的形势不仅对服务器压力大,而且会影响到业务逻辑实现等等,这样单页面session会话级别存储更清晰一些。
Android编码规范
Android开发的一些编码规范
- 1.java代码中不出现中文,最多注释中可以出现中文,中文统一写在strings.xml中。
- 2.常量命名只能包含字母和,字母全部大写,单词之间用隔开。
- 3.局部变量命名、静态成员变量命名 只能包含字母,单词首字母大写,其他字母均为小写。
- 4.图片要处理,图片尽量分拆成多个可重用的图片。
- 5.引用第三方库要慎重,避免应用大容量的第三方库,导致客户端包非常大。
- 6.布局文件中的id命名:
命名模式为:view缩写_模块名称_view的逻辑名称
常用控件的缩写如下
LayoutView:lv
RelativeView : rv
TextView : tv
ImageView : iv
ImageButton : im
Button : btn - 7.Layout中的id命名:
命名模式为:view缩写_模块名称_view的逻辑名称
view的缩写详情如下
LinearLayout:ll
RelativeLayout : rl
TextView : tv
ImageView : iv
ImageButton : ib
Button:btn - 8.String.xml中的id命名:
命名模式为:activity名称功能模块名称逻辑名称/activity名称逻辑名称/common逻辑名称
strings.xml中,使用activity名称注释,将文件内容区分开来。另外,strings.xml中使用%1$s实现字符串的通配。 - 9.activity中的view变量命名:
命名模式为:view缩写+逻辑名称
如果layout文件很复杂,建议将layout分成多个模块,每个模块定义一个moduleViewHolder,其成员变量包含所属view。
另外,activity中在一个View.OnClickListener中处理所有的逻辑 - 10.drawable中的图片命名:
命名模式为:activity名称逻辑名称/common逻辑名称 - 11.styles.xml:将layout中不断重现的style提炼出通用的style通用组件,放到styles.xml中。
- 12.不要重用父类的handler,对应一个类的handler也不应该让其子类用到,否则会导致message.what冲突。
- 13.服务端可以实现的,就不要放在客户端。
- 14.使用button+activitgroup实现tab效果时,使用Button.setSelected(true),确保按钮处于选择状态,并使activitygroup的当前activity与该button对应。
- 15.如果多个Activity中包含共同的UI处理,那么可以提炼一个CommonActivity,把通用部分叫由它来处理,其他activity只要继承它即可。
- 16.如果所开发的为通用组件,为避免冲突,将drawable/layout/menu/values目录下的文件名增加前缀。
- 17.activity中在一个View.OnClickListener中处理所有的逻辑。
(转载)《Effective java》-----读书笔记
2015年进步很小,看的书也不是很多,感觉自己都要废了,2016是沉淀的一年,在这一年中要不断学习、看书,努力提升自己!预计在2016年要看12本书,主要涉及java基础、Spring研究、java并发、JVM、分布式之类的。在今年面试的时候深受打击,到处都是问分布式、集群的?难道现在工作两三年的都这么牛逼了?都在搞分布式、集群之类的?
2016书单如下:
1、深入理解Java虚拟机:JVM高级特性与最佳实践—(已看,预计今年看三遍)
2、Oracle查询优化改写技巧与案例—(已看)
3、Effective Java—(已看)
4、Spring3.x企业应用开发实战
5、Spring技术内幕:深入解析Spring架构与设计原理—(这本书在去年已经看了一遍了,今年在好好研究下)
6、Java并发编程的艺术
7、Java并发编程实战—(这本书在去年已经看了一遍了,今年在好好研究下)
8、型网站系统与Java中间件实践
9、分布式服务框架原理与实践
10、大型分布式网站架构设计与实践
11、从Paxos到Zookeeper分布式一致性原理与实践
12、高性能mysql
目前已经看完了三本书:深入理解Java虚拟机:JVM高级特性与最佳实践、Oracle查询优化改写技巧与案例、Effective Java。其中深入理解jvm这本书确实是一本神书,看完之后真的有种豁然开朗的感觉,期待三遍之后给我醍醐灌顶的感觉。Oracle查询优化,感觉一般般。Effective java,四大圣经之一不做解释。
各位,有什么好书,麻烦推荐下,LZ不胜感激!
LZ没看一本书,都会做一些笔记,当然这些仅仅只是笔记而已!刚刚开始有点儿简陋,不要介意,如果对你还有点儿帮助,LZ一心满意足了!
二、:创建和销毁对象
2.1.考虑用静态工厂方法替换构造器
1.2.用私有构造器或者枚举类型强化Singleton属性
1.4.通过私有构造器强化不可实例化的能力。
1.5.避免创建不必要的对象。
优先使用基本类型而不是装箱基本类型,要当心无意识的自动装箱。
1.6.消除过期的对象引用
如果一个栈先是增长,再是收缩,那么,从栈中弹出来的对象将不会被当做垃圾回收,即使使用栈的程序不再引用这些对象,他们也不会被回收。这是因为,栈内部维护这对这些对象的过期引用。所谓过期引用则是指永远也不会再被解除的引用。
一般来说,对于过期引用我们都是清空这些引用即可(也就是set null),但是这样势必会导致程序变得异常混乱,最好的办法则是让包含该引用的变量结束生命周期。
出现内存溢出常见的来源有:1、过期引用,2、缓存,3、监听器和其他回调。对于缓存我们通常的做法则是定时地清除一些没有用的项,想想缓存里面保存了几年了无用的项是不是都觉得恶心?回调则是只保存他们的弱引用,例如只将他们保存成WeakHashMap的键。
可以借助Heap剖析工具分析内存泄漏的问题
四、类和接口
4.1、使类和成员的可访问行最小化
良好的模块设计可以将所有的实现细节隐藏,把他的API与具体的实现清晰地隔离开来,模块与模块之间只通过他们的API进行通信,一个模块不需要知道其他模块的内部工作情况—信息隐藏。
4.2、使可变性最小化
1)为了使类不可变,需要遵循如下规则:
1.不要提供任何会修改对象状态的方法
2.保证类不会被扩展
3.所有域都要是final,且为私有
4.确保对于任何可变组件的互斥访问。
2)不可变类的好处
1.不可变对象本质是线程安全的,不要求同步
2.不可变对象为其他对象提供了大量的构件
3)缺点在于需要为每一个不同的值提供不同的对象。如果创建的对象比较大,那么所产生的代价就有点高了。
为了不可变性,类是绝对不允许被子类化,我们首先想到的就是“final”修饰,其实除了这点还有一个比较好的办法:让类的所有构造器全部变为私有,并且提供一个公有的静态工厂。
4.3、组合、继承
优先使用组合,慎用继承。
组 合 关 系 继 承 关 系
优点:不破坏封装,整体类与局部类之间松耦合,彼此相对独立 缺点:破坏封装,子类与父类之间紧密耦合,子类依赖于父类的实现,子类缺乏独立性
优点:具有较好的可扩展性 缺点:支持扩展,但是往往以增加系统结构的复杂度为代价
优点:支持动态组合。在运行时,整体对象可以选择不同类型的局部对象 缺点:不支持动态继承。在运行时,子类无法选择不同的父类
优点:整体类可以对局部类进行包装,封装局部类的接口,提供新的接口 缺点:子类不能改变父类的接口
缺点:整体类不能自动获得和局部类同样的接口 优点:子类能自动继承父类的接口
缺点:创建整体类的对象时,需要创建所有局部类的对象 优点:创建子类的对象时,无须创建父类的对象
请记住下面两句话:
继承要慎用,其使用场合仅限于你确信使用该技术有效的情况。一个判断方法是,问一问自己是否需要从新类向基类进行向上转型。如果是必须的,则继承是必要的。反之则应该好好考虑是否需要继承。《Java编程思想》
只有当子类真正是超类的子类型时,才适合用继承。换句话说,对于两个类A和B,只有当两者之间确实存在is-a关系的时候,类B才应该继续类A。《Effective Java》
4.4、接口、抽象类
1.接口是定义mixin的理想选择
2.接口允许我们构造非层次接口的类型框架
3.骨架实现类
通过对你导出的每一个重要接口都提供一个抽象的骨架实现类,把接口和抽象类的优点结合起来。这个时候接口的作用仍然是定义类型,但是骨架实现类接管了所有域接口实现相关的工作。骨架实现被称之为AbstractInterface。
骨架实现的美妙之处在于,它们为抽象类提供了实现上的帮助,但是又不会强加“抽象类被用做定义类型时”所特有的严格限制。同时在编写骨架实现时一般都需要经过认真研究接口,并确定那些方法是最为基础的,其他方法则可以根据他们来实现。这些基本的方法将成为骨架实现类中的抽象方法(这里是模板方法模式??)。
4.接口只用于定义类型。
5.常量接口不值得效仿,接口应该只被用来定义类型,不应该被用来导出常量。
6.对于常量的使用我们应该遵循如下规则:如果常量与某个现有的类或者接口紧密相关,就应该把这些常量添加到这个类或者接口中;如果常量最好被看做枚举类型的成员,则应该用枚举类型来导出这些常量;否则应该使用不可实例化的工具类来导出这些常量。
4.5内部类
内部类的主要作用应该只为他的外围类提供服务。内部类主要有四种:静态成员类、非静态成员类、匿名类、局部类。
静态成员类常用作为公有的辅助类,仅当与它的外部类一起使用时才有意义。私有静态成员类一种常用的方法是用来代表外围类所代表的对象的组件,他它不需要依赖外围类。
匿名内部类没有名称,它并不是外围类的一个成员,它并不与其他的成员一起被声明,而是在使用的同时被声明和实例化。在使用的过程中,除了在他们被声明的时候之外,是无法将他们实例化的。匿名类有三种常用的用法:动态创建函数对象,创建过程对象(Runable、Thread、TimeTask)、静态工厂方法的内部。
五、泛型
推荐使用泛型,虽然他在运行时会被擦除。
尽可能地消除每一个非受检警告。如果无法消除警告,同时可以证明引起警告的代码是类型安全的,则可以使用@SuppressWarnings(“unchecked”)注解来禁止这条警告,同时我们必须要竟可能小的范围使用该注解,禁止在整个类上使用该注解。
七、方法
7.1必要时,对不可变对象的构造器和访问方法进行检查性保护。
7.2、谨慎设计方法签名
1.谨慎地选择方法的名称:方法名称应该始终遵循标准的命名习惯。
2.不要过于追求提供便利的方法,每个方法应该极尽其所能。
3.避免过长的参数列表,一边提供四个参数或者更少。
避免参数过长一般有三种方法:1).将该方法分解成多个方法 2).创建辅助类,用来保护参数的分组 3).从对象构建到方法的调用都采用Builder模式。
4.优先使用接口而不是实现类来作为参数类型。你应该不会把HashMap作为一个参数的!!
7.3、慎用重载
1.方法重载是在编译时做出决定的。
2.永远都不要导出两个具有相同参数数目的重载方法,这是一个安全保守的方法。
3.任何一组给定的实际参数将应用于那个重载方法上。
4.同一组参数只需要经过类型转换就可以被传递给不同的重载方法,如果不能避免这种情况,就应该保证:当传递同样的参数是,所有重载方法的行为必须一致。
7.4、慎用可变参数
可变参数接受0个或者多个指定类型的参数。其机制是先创建一个数组,数组的大小为在调用位置所传递参数的数量,然后将参数值传递给数组,最后将数组传递给方法。
7.5、返回零长度的数组或者集合,而不应该是null。不重要但是值得注意。
八、通用程序设计
8.1局部变量作用域最小化
将局部变量的作用域最小化,可以增强代码的可读性和可维护性,并降低出错的可能性。
要是局部变量的作用域最小化,最有力的方法就是在第一次使用它的地方声明。一般来说每个局部变量都应该有一个初始化,如果没有足够的信息来对该变量进行有意义的初始化,则需要推迟该变量的声明,直到可以被初始化为止。
对于方法而言,应该尽可能地使方法小而集中,这样就可以将局部变量的作用域尽可能地小化。
8.2、优先使用for-each循环
for循环相比于while循环它可以使局部变量更小化,同时程序更加简短增强了可读性。
for-each循环在简洁性和预防bug方面有着传统for循环无法比拟的优势,并且没有性能损失,所以我们应该尽可能使用for-each循环,但是在以下三种情况是否无法使用for-each循环的:
1.过滤:如果需要遍历某个集合,删除特定的元素,则需要使用显示的迭代器。
2.转换:如果需要遍历列表或者数组,并取代它部分或者全部元素值,这时就需要迭代器来进行设置元素的值。
3.平行迭代
8.3、优先使用基本类型
基本类型相当于其引用类型有如下几个区别:1.)基本类型只有值,而引用类型则具有他们值不同的同一性,也就说new Integer(1) != new Integer(1);2).基本类型具有功能完备的值,而引用还有一个null值 3).基本类型通常比引用类型更加节省空间和时间。
当在一项操作中混合使用基本类型和其引用类型时,其引用类型会自动进行拆箱动作。
在进行迭代时需要格外注意拆箱装箱机制,因为频繁的拆箱装箱会导致性能的下降。
其他
1.如果需要精确的答案,请使用BigDecimal而不是double和float。
2.如果有合适的接口类型存在,那么对于参数、返回值、变量和域来说,就都应该使用接口类型进行声明。
九、异常
异常应该只用于异常的情况下,他们永远不应该用于正常的控制流。
异常机制设计是用于不正常的情况,所以很少会有JVM会对他进行优化,所以异常一般运行都比较慢。
我们应该尽量让异常代码块小,因为try..catch会阻碍JVM实现本来可能要执行的某些特定的优化。
Android应用安装
一、关键词解释:
1. SQLite:
SQLite是android系统自带的一款轻量级数据库,可以存储一些临时文件
2. 签名:
就像一些重大决定和文件需要我们手动签名一样,实际上在Android的世界里,签名起着一个应用的识别和告知其作者身份的作用,自己应用的无缝升级,ContentProvider的使用,都依赖签名
3. SharePreference(share prefs):
存储数据类型:SharePreference是一个轻量级的存储机制。只能存储一些基本类型,boolean,int,float,long,String
路径:路径为data/data/包名/share_prefs/文件名.xml。
存储形式:以xml为载体,存储时类似于Map,key-value键值对。
4. 静默安装:
静默安装顾名思义,就是静静的,默默的装上一个应用,在安装的过程当中用户是不知情的
5. ContentProvider:
Android四大组件,可以允许两个独立应用互相暴露、使用数据
二、 Android的安装方式
1. 系统应用安装:
PackageManagerService处理各种应用的安装,卸载,管理等工作,开机时由systemServer启动此服务
(源文件路径:android\frameworks\base\services\java\com\android\server\PackageManagerService.java)
PackageManagerService服务启动的流程:
a. 首先扫描安装“system\framework”目录下的jar包
scanDirLI(mFrameworkDir,PackageParser.PARSE_IS_SYSTEM scanMode | SCAN_NO_DEX);
b. 第二步扫描安装“system\app”目录下的各个系统应用
scanDirLI(mSystemAppDir,PackageParser.PARSE_IS_SYSTEM, scanMode);
c. 第三步扫描“data\app”目录,即用户安装的第三方应用 scanDirLI(mAppInstallDir, 0, scanMode);
d. 第四步扫描” data\app-private”目录,即安装DRM保护的APK文件(目前没有遇到过此类的应用)
2. 从market上下载应用:
a. 当应用在手机市场下载完成之后,会自动调用接口
public void install Package(final Uri packageURI, final IPackageInstallObserver observer,final int flags)
b. 将apk文件复制到临时目录下,解析临时文件,获取应用包名
c. 判断如果带有参数
INSTALL_REPLACE_EXISTING
d. 之后则与开机应用安装流程相同
- adb工具安装:
与market安装调用的接口相同 静默安装:
a. apk签名必须与系统签名一致
b. 必须root
请注意:以上两项满足其一,然后编辑android工程中的Manifest.XML文件,添加权限android.permission.INSTALL_PACKAGES
- 系统应用安装和第三方安装(adb安装)区别:
实际上系统应用安装和第三方安装没有办法去做比较,只是阶段不一罢了,实际上第三方安装最后也是要走到系统安装这一步的,只不过当我们在使用第三方安装的 时 候,先走第三方安装阶段,然后是系统应用安装阶段,只有一点例外,就是系统应用不会走第三方安装,例如:系统版本更新,摄像头、计算器,键盘升级等
三、 Android覆盖安装与安装区别
Android覆盖安装与安装区别
正常安装(删除旧版本APK之后重新进行安装) 覆盖安装(不删除之前的旧版本包,直接安装)
SQLite的数据也会被删除 SQLite的数据不会丢失
shared_prefs中的数据会被删除 shared_prefs中的数据不会丢失
4.4之前的版本不会比较apk的Version_code 4.4以上版本比较apk的Version_code
四、测试需要注意的点以及会引发的问题 - 容易引发的问题
a. SQLite数据不会丢失,当覆盖安装时,会对比SQLite数据库信息,但是没有比对上不会在界面上提示报错
b. Shared prefs中的数据有保存,那么之前用户设置的一些东西都会保存
c. Android版本比较多,而且比较复杂,市场持有度又都非常高,导致版本的更新和对低版本的支持成为问题,例如:android4.4之后覆盖安装会对比Version_code - 测试人员需要注意的点
a. SQLite数据库更新后,如果没有对比成功则覆盖安装失败且用户无感知,这个是个很大的问题,所以在之后的测试当中,需要关注是否有public voidonUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)的逻辑来更新SQLite
b. Shared prefs中的数据保存会保存之前用户的一些设置历史,那么新的版本和旧的版本之间的功能更新,减去,如果恰巧历史数据保存的正好是功能改动的部分,那么就可能会出现问题
c. Android的版本问题一直都是BUG出现最多的地方,覆盖安装的问题在与Android4.4之前,覆盖安装不会判断version_code,所以安装可以不考虑,但是在4.4之后会判断version_code,如果比之前的小,是不可以安装的 - 解决方式
a.查看代码当中的是否有void onUpdate()方法,可以使用静态代码扫描的方式来解决
b.查看代码中是否有使用到sharePreference对象,如果有,是否有逻辑使得sharePreference正常更新
c.查看Android的系统版本,如果>4.4,那么使用adb命令:adb install apk路径,查看是否会报错,同时也可以加入静态代码扫描的规则中。
五、iOS的安装与覆盖安装:
iOS的安装和升级同一都走AppleStore,所以具有非常好的封装性,而且是闭源的,所以覆盖安装和正常的安装都是在APPleStore的监督之下完成的,基本相同
兴趣视频教程
陶笛视频
1 | http://www.56.com/w88/play_album-aid-11700818_vid-OTExNTk5OTU.html |
魔方
1 | 魔方小站 |
吉他
1 | http://list.youku.com/albumlist/show?id=3128888&ascending=1&page=1 |
篮球
阿里纳斯
1 | http://www.56.com/w86/album-aid-4636263.html |
Idea快捷键
常用的快捷键
代码补全Ctrl + space
删除行Command + D
注释Command + /
导入包Command + shift + O
格式化代码Command + shift + F
运行Ctrl + Alt + R
Incremental SearchCommand + J 在编辑器中实现快速查找功能,通过上下箭头进行上下文搜索
Quick Definition Command + Y 它会弹窗显示建议列表中的方法定义的内容,如果你不确定要使用哪个方法
Find NextCommand + K
Find PreviousCommand + shift + K
详细方法、类Ctrl + 点击类名、方法
Ctrl+Alt+ left/right 返回至上次浏览的位置
Command + F12 类似eclipse 的ctrl + O的功能outline
调整界面为酷酷的黑色
Preferences=>Appearance=>theme=>Darcula
设置快捷键
Preferences=>keymaps
自动补全:
Mac下默认是clt+space,可以使用keymaps=>Main menu=>Code=>Competion设置。比Eclipse好的地方是Spring、Maven的xml,乃至freemarker模板以及iBatis的sqlmap都支持高亮和自动补全。
去除自动补全的大小写敏感:
不知道多少童鞋和我一样被Eclipse惯坏了,使用自动补全完全不注意大小写的,IntelliJ默认区分大小写,很是让人难过。不过在Editor=>Code Completion里把Case sensitive completion设置为None就可以了。
自动展开目录
Eclipse有个打开文件就自动展开目录的功能,在IntelliJ里从Project左边栏的齿轮上选择Autoscroll to Source和Autoscroll from Source都勾选上即可。
自动编译
IntelliJ默认是不会自动编译项目的,所以在run之前会有个make的过程,习惯自动编译项目的可以在这里打开:Compiler=>make project automatically。因为IntelliJ项目空间不大,所以开启之后也不会像Eclipse一样出现build workspace很久的情况。
另外一个 intelliJ 的快捷键 http://www.ituring.com.cn/article/37792
自己整理的idea快捷键
studio/idea
command+shift+o 查找文件
shift+f6 重命名类
commond+ e 最近打开的文件
ctrl+enter 构造方法 实现抽象方法
option+shift+t 创建tasklist
command+option+t try-catch if-else
command+shift+r 文件重命名
option+ f7 查找引用
command+alt+f7 这个是查找选中的字符在工程中出现的地方,可以不是方法变量类等,这个和上面的有区别的
lsof -i:1099 查看端口号
ctrl+alt +o 自动导入
command+alt+L 格式化代码
command+t 更新项目
alt+f7查找在哪里使用 相当于eclipse的ctrl+shift+G
ctrl+enter 出现生成get,set方法的界面
command+N 查找类
command+shift+N 查找文件
command+R 替换
ctrl+shift+R 可以在整个工程或着某个目录下面替换变量
command+Y 删除行
command+D复制一行
command+G定位
ctrl+shift+F 可以在整个工程或着某个目录下面查找变量 相当于eclipse里的ctrl+H
command+alt+I 自动缩进,不用多次使用tab或着backspace键,也是比较方便的
ctrl+shift+space代码补全,这个会判断可能用到的,这个代码补全和代码提示是不一样的
command+/ 注释一行或着多行 //
ctrl+shift+/ 注释/…/
command+alt+左右箭头 返回上次编辑的位置
command+shift+上下箭头 把代码上移或着下移
shift + command + u 大小写转换
command + alt + t 环绕注释
command+alt+f7 这个是查找选中的字符在工程中出现的地方,可以不是方法变量类等,这个和上面的有区别的
command+F7可以查询当前元素在当前文件中的引用,然后按F3可以选择 ,功能基本同上
选中文本,按command+shift+F7 ,高亮显示所有该文本,按Esc高亮消失
选中文本,按Alt+F3 ,逐个往下查找相同文本,并高亮显示。shift+f3就是往上找
shift+enter 换到下一行
ctrl+shift+J 把多行连接成一行,会去掉空格的行
command+J 可以生成一些自动代码,比如for循环
command+B 找变量的来源 同F4 查找变量来源
ctrl+shift+B 找变量所属的类
command+F 在当前文件里查找文本 f3向下看,shift+f3向上看
alt+shift+C 最近修改的文件
command+E最近打开的文件
command+P 方法参数提示
command+alt+T 把选中的代码放在 TRY{} IF{} ELSE{} 里
command+X剪切删除行
command+shift+V 可以复制多个文本
command+shift+U 大小写转换
alt+f1查找文件所在目录位置
command+[或] 可以跳到大括号的开头结尾
command+f12可以显示当前文件的结构
command+alt+B 可以导航到一个抽象方法的实现代码
command+shift+小键盘的* 列编辑
alt+f8 debug时选中查看值
f8相当于eclipse的f6跳到下一步
shift+f8相当于eclipse的f8跳到下一个断点,也相当于eclipse的f7跳出函数
f7相当于eclipse的f5就是进入到代码
alt+shift+f7这个是强制进入代码
ctrl+shift+f9 debug运行java类
ctrl+shift+f10正常运行java类
command+f2停止运行
command+f12 跳转到上次编辑的位置
command+e 最近修改的文件