开发过程需要注意的问题有下面这些:1. 服务器端必须提供输入数据正确性的验证,客户端的Javascript验证可以没有。
这是基于安全性的考虑,因为Javascript是很容易被绕过的,增加客户端验证只是为了减少服务器压力、界面更加容易使用。 2. 适度使用Session,尽量不要在Session里放很大的集合对象,以免内存消耗过大,因为很多用户访问的时候会产生很多的Session。
参数传递应该尽量通过Request。熟悉HTTP有助于更好的理解Session、Cookie、Request等的机制。
3. 在带有分页的查询界面,尽量不要使用POST方法来传递参数,POST传递的参数在地址栏里是看不到的,刷新后会有重新提交表单的提示。使用GET方法传递参数要注意URL的长度不能超过1K。
4. 分层应该清晰,一般目前我们分为View(Jsp或FreeMarker加上Action)、Bean(Service)、DAO这么三层,即显示层、业务层、数据层。记录集ResultSet这种只能出现在DAO层中的对象不能出现在Bean(Service)层中,同样HttpServletRequest这种只能出现在View层的对象也不应出现在Bean(Service)层中。
这并不是绝对的。 5. 尽量使用简单SQL,避免两表以及多表联查。
多表联查会导致数据库压力大幅增加,而且不利于在内存中对部分记录进行缓存,代码的重用性也难以提高。 6. 避免在循环里执行findXXById这样的方法,不如执行一个findXXByIds这样的方法一次性把记录取到Map里。
大部分有实际对象对应的表应该提供这样一个方法。 7. 如果使用最原始的jdbc编程的话需要注意资源的正确释放,在循环里new出来的Statement或者ResultSet就要在循环里关闭。
8. 在编写SQL进行查询的时候,需要能够判断这个SQL是否已经使用了索引,避免全表扫描,必要的时候增加索引。 9. 在写一个方法前,首先查看有没有相同功能或者很类似功能的方法已经有了,尤其是工具类方法,往往已经写过了,避免重复代码的产生,发现重复代码及时进行处理。
如果一段代码被重复使用两遍或以上,那么可以考虑专门写个方法来放这段代码,同样多次使用的常量也应该专门定义出来。 10. 在一个方法里并不一定只能有一个return,如果已经有结果了尽早return,没必要增加嵌套的层次,那样会导致代码可读性不佳,但也不能return太多,代码看起来比较舒服就可以了。
11. 不要满足于能够熟练的编写DAO和Bean(Service)的代码,相比较而言,后台如果在成熟框架的支持下,编码是没有太大难度的,也不值得沾沾自喜,因为这是对Java研发工程师基本的要求。适当的培养一下前台的编码能力,学会使用Dreamweaver。
不要轻视界面,也别认为这是界面设计的事情,界面对用户来说就是软件,学会编写CSS和调整界面对你没有坏处。 12. 非常明确Java和javascript作用的范围,明确它们能做的事情。
13. 一般很奇怪的现象都是由一些低级错误引起的,如果你查了一段时间也没有结果,那么让别人来查吧。 14. 不要用可能被修改的字段来做主键,那样会让相关记录的更新成为一个大麻烦。
15. 如果被迫使用Hibernate和jdbc混合操作数据库的话,不要用Hibernate来做复杂查询和统计。Hibernate用的不好的话,带来的便利是非常有限的。
16. 数据库中经常被读取,但是很少修改的话,应该把这样的数据读到内存中用OSCache之类的缓存起来,然后定期或者触发的去更新,有助于减少读数据库次数,提升性能。 17. 编码的时候应该注意部署环境带来的影响,这种影响包括操作系统不同带来路径的差异;应用服务器和数据库服务器之间时间的差异;外网可能部署在多台服务器上,放到Session里的对象因为需要复制所以要实现java.io.Serializable接口等。
18. 尽量不要在jsp上编写太多代码,保持jsp的整洁很重要,用Dreamweaver打开不至于一塌糊涂,根本看不出来这是个什么界面。 19. 目前我们的项目一般都使用Spring来管理数据库事务,而且一般都配置在Bean(Service)即业务层这一层,应该注意要保持事务的完整性,不要把一些应该放在一起的操作分散在Action这一层。
相关的更新操作可以认为是一个事务,比如:增加一个家长,同时更新学生是否有家长的字段。 20. 在Spring的配置中,对于有些需要保持独立事务的方法操作,比如生成主键等,应该声明该方法为独立事务ROPAGATION_REQUIRES_NEW。
Bean(Service)里如果抛出checked exception,事务默认是不会回滚的,需要加以声明,比如PROPAGATION_REQUIRED,-PassportException。 21. 在一个Bean(Service)中引用其他Bean(Service)的时候尽量引用Bean(Service),而不是DAO。
因为其他的Bean(Service)往往封装DAO的操作后,又做了进一步的完善,比如增加校验等,所以应该重用这些方法,而不必要去引用DAO的方法来重写这些操作。 22. 至少在Bean(Service)的接口定义上增加注释,方便他人引用你写的方法。
23. 好好利用集合框架里的Map、List、Set。尤其是HashMap、ArrayList、HashSet用的最多,这些类是多条数据操作的基础,它们都不是线程安全的。
24. 现在跑的快的页面,随着数据量的增加,可能会变的很慢,所以应该意识到页面可能变慢的原因。
自己和别人思路的差异。
2。初学者请不要看太多太多的书那会误人子弟的,先找本系统的学,很多人用了很久都是只对部分功能熟悉而已,不系统还是不够的。
3。看帮助,不要因为很难而自己是初学者所以就不看;帮助永远是最好的参考手册,虽然帮助的文字有时候很难看懂,总觉得不够直观。
4。不要被对象、属性、方法等词汇所迷惑;最根本的是先了解最基础知识。
5。不要放过任何一个看上去很简单的小问题--他们往往并不那么简单,或者可以引伸出很多知识点;不会举一反三你就永远学不会。
6。知道一点东西,并不能说明你会写脚本,脚本是需要经验积累的。
7。学脚本并不难,JSP、ASP、PHP等等也不过如此--难的是长期坚持实践和不遗余力的博览群书; 8。
看再多的书是学不全脚本的,要多实践 9。把时髦的技术挂在嘴边,还不如把过时的技术记在心里; 10。
学习脚本最好的方法之一就是多练习; 11。 在任何时刻都不要认为自己手中的书已经足够了; 12。
看得懂的书,请仔细看;看不懂的书,请硬着头皮看; 13。别指望看第一遍书就能记住和掌握什么——请看第二遍、第三遍; 14。
请把书上的例子亲手到电脑上实践,即使配套光盘中有源文件; 15。 把在书中看到的有意义的例子扩充;并将其切实的运用到自己的工作中; 16。
不要漏掉书中任何一个练习——请全部做完并记录下思路; 17。当你用脚本到一半却发现自己用的方法很拙劣时,请不要马上停手;请尽快将余下的部分粗略的完成以保证这个代码的完整性,然后分析自己的错误并重新编写和工作。
18。别心急,写脚本确实不容易;水平是在不断的实践中完善和发展的; 19。
每学到一个脚本难点的时候,尝试着对别人讲解这个知识点并让他理解----你能讲清楚才说明你真的理解了; 20。记录下在和别人交流时发现的自己忽视或不理解的知识点; 21。
保存好你做过的所有的源文件----那是你最好的积累之一; 22。对于网络,还是希望大家能多利用一下,很多问题不是非要到论坛来问的,首先你要学会自己找答案,比如google、百度都是很好的搜索引擎,你只要输入关键字就能找到很多相关资料,别老是等待别人给你希望,看的出你平时一定也很懒! 23,到一个论坛,你学会去看以前的帖子,不要什么都不看就发帖子问,也许你的问题早就有人问过了,你再问,别人已经不想再重复了,做为初学者,谁也不希望自己的帖子没人回的。
24,虽然不是打击初学者,但是这句话还是要说:论坛论坛,就是大家讨论的地方,如果你总期望有高手总无偿指点你,除非他是你亲戚!!讨论者,起码是水平相当的才有讨论的说法,如果水平真差距太远了,连基本操作都需要别人给解答,谁还跟你讨论呢。 浮躁的人容易问:我到底该学什么;----别问,学就对了; 浮躁的人容易问:Js有钱途吗;----建议你去抢银行; 浮躁的人容易说:我要中文版!我英文不行!----不行?学呀! 浮躁的人分两种:只观望而不学的人;只学而不坚持的人; 浮躁的人永远不是一个高手。
一、J2ME中需要的Java基础知识 现在有大部分人,都是从零开始学J2ME的,学习J2ME的时候,总是从Java基础开始学习,而且现在讲Java基础的书籍中都是以J2SE来讲基础,这就给学习造成了一些不必要的麻烦,下面将J2ME中用到的和不需要的Java基础知识做一个简单的说明。
J2ME中使用到的Java基础知识: 1、Java语法基础:包括基本数据类型、关键字、运算符等等 2、面向对象的思想:类和对象的概念,继承和多态等等。 3、异常处理 4、多线程 J2ME中没有用到的Java基础知识: 1、JDK中javac和java命令的使用 2、Java基础中的很多类在J2ME中没有,或者类中的方法做了大量的精简。
所以建议在J2ME中熟悉类库。 3、Applet、AWT、Swing这些知识在J2ME中根本使用不到。
简单说这么多,希望学J2ME的朋友们能少走一些弯路,不足之处希望大家积极指正和补充。 二、J2ME中暂时无法完成的功能 列一些J2ME中暂时无法完成的功能,希望大家能积极补充: 1、在手机中不更改代码实现移植,主要指游戏。
2、动态修改按钮文字。 3、在Canvas上接受中文输入。
4、操作本地资源、例如地址本、已收短信息等。 5、制作破坏性的手机病毒。
6、其他等待大家来补充。
Java的线程编程非常简单。
但有时会看到一些关于线程的错误用法。下面列出一些应该注意的问题。
1.同步对象的恒定性 All java objects are references。 对于局部变量和参数来说,java里面的int, float, double, boolean等基本数据类型,都在栈上。
这些基本类型是无法同步的;java里面的对象(根对象是Object),全都在堆里,指向对象的reference在栈上。 java中的同步对象,实际上是对于reference所指的“对象地址”进行同步。
需要注意的问题是,千万不要对同步对象重新赋值。 举个例子。
class A implements Runnable { Object lock = new Object(); void run() { for(。
) { synchronized(lock) { // do something 。
lock = new Object(); } } } } run函数里面的这段同步代码实际上是毫无意义的。因为每一次lock都给重新分配了新的对象的reference,每个线程都在新的reference同步。
大家可能觉得奇怪,怎么会举这么一个例子。 因为我见过这样的代码,同步对象在其它的函数里被重新赋了新值。
这种问题很难查出来。所以,一般应该把同步对象声明为final。
final Object lock = new Object(); 使用Singleton Pattern 设计模式来获取同步对象,也是一种很好的选择。 2.如何放置共享数据 实现线程,有两种方法,一种是继承Thread类,一种是实现Runnable接口。
上面举的例子,采用实现Runnable接口的方法。本文推荐这种方法。
首先,把需要共享的数据放在一个实现Runnable接口的类里面,然后,把这个类的实例传给多个Thread的构造方法。 这样,新创建的多个Thread,都共同拥有一个Runnable实例,共享同一份数据。
如果采用继承Thread类的方法,就只好使用static静态成员了。如果共享的数据比较多,就需要大量的static静态成员,令程序数据结构混乱,难以扩展。
这种情况应该尽量避免。 编写一段多线程代码,处理一个稍微复杂点的问题。
两种方法的优劣,一试便知。 3.同步的粒度 线程同步的粒度越小越好,即,线程同步的代码块越小越好。
尽量避免用synchronized修饰符来声明方法。尽量使用synchronized(anObject)的方式,如果不想引入新的同步对象,使用synchronized(this)的方式。
而且,synchronized代码块越小越好。 4.线程之间的通知 这里使用“通知”这个词,而不用“通信”这个词,是为了避免词义的扩大化。
线程之间的通知,通过Object对象的wait()和notify() 或notifyAll() 方法实现。 下面用一个例子,来说明其工作原理: 假设有两个线程,A和B。
共同拥有一个同步对象,lock。 1.首先,线程A通过synchronized(lock) 获得lock同步对象,然后调用lock。
wait()函数,放弃lock同步对象,线程A停止运行,进入等待队列。 2.线程B通过synchronized(lock) 获得线程A放弃的lock同步对象,做完一定的处理,然后调用 lock。
notify() 或者lock。notifyAll() 通知等待队列里面的线程A。
3.线程A从等待队列里面出来,进入ready队列,等待调度。 4.线程B继续处理,出了synchronized(lock)块之后,放弃lock同步对象。
5.线程A获得lock同步对象,继续运行。
1、不要排斥新技术和新工具。
Android Studio 1.0 之后的版本,基本已经稳定到可以支持正常的工作开发的程度了。单纯就书写效率而言,Android Studio 带来的好处绝对大于它和Gradle的学习成本。
JetBrains的IDE,用过都说好。还有就是适当的提升targetSdkVer… 显示全部 1、不要排斥新技术和新工具。
Android Studio 1.0 之后的版本,基本已经稳定到可以支持正常的工作开发的程度了。单纯就书写效率而言,Android Studio 带来的好处绝对大于它和Gradle的学习成本。
JetBrains的IDE,用过都说好。 还有就是适当的提升targetSdkVersion到新版本。
2、代码设计方面的问题,大部分都能在Android系统源码里找到解决方案。 当你想设计一个新模块,或者实现一个新ui组件的时候,应该采用哪些设计模式、应该以哪种形式给外界提供接口之类的问题,大部分都可以参考Android系统的源码,找到实现方式。
Google为安卓程序员提供了一座现成的宝库。 3、理解Android和Java内存管理方式,至少要理解垃圾回收和Java的引用。
就好比学OC就要先理解黄金法则一样,而java的内存管理,其实比OC要好理解多了。 这可能会帮助你大大减少程序异步操作产生的空指针崩溃。
也会帮助你理解为什么滥用单例模式会导致内存的臃肿。还会帮助你养成不用“+”去连接超大字符串的好习惯。
4、ContentProvider并不是只有在跨进程共享数据的才有用,把数据库表映射到一个独立的uri是Google鼓励的实现方式。 从设计上讲,用uri(统一资源标识符)去描述数据,肯定比sql语句要理想。
从效果上讲,用CursorLoader读取数据是让iOS程序员都羡慕不已的事情,作为android程序员,何苦不用呢。 5、理解Activity任务栈。
非Activity的Context对象如果直接启动Activity会报错,这只是一个表面现象,真正起作用的其实是Activity任务栈机制。 理解Activity任务栈机制以及Activity的各种启动方式,会帮助解决大部分页面关系错乱问题,以及应用互相掉起、任务栏进入应用、后台弹窗引起的各种问题。
6、对于一些奇葩的第三方ROM,调用其非主流api的时候,可以使用反射。 在适配一些第三方ROM的的时候,调用一些在开发环境中没有,但在运行环境中有的方法时,可以使用反射。
比方说,华为双卡手机可能会提供获取第二块SIM卡信息的api,如果直接调用,在开发环境可能无法通过正常编译,用反射就没问题。这属于不得已而用反射的一种情况。
7、SQLite的锁,是数据库级别的锁,也就是说同一个数据库的写操作无法并发执行。 所以,在数据库设计的时候,如果表太多,尽量将没有关联的表拆到多个数据库文件中。
8、Bitmap的内存占用问题。 这是一个困扰2.X时代android程序员的问题。
2.X时代Bitmap对象虽然存储在堆内存中,但是用了一个byte数组存储其像素信息。通过计数器来记录该像素信息被引用的个数。
有人认为这个byte数组在native堆中,但事实上它也在堆中。 只有在使用者调用recycle()后,Bitmap对象才会释放像素信息,才会在失去引用后,被垃圾回收机制销毁。
再加上DVM的heap size有严格的阀值,所以在使用大量图片资源的时候,及其容易发生OOM。 解决办法一般都是,用一个哈希表存储Bitmap对象的软引用,作为内存缓存,并在适当时机掉用其recycle()。
3.0以上版本Bitmap对象可以通过垃圾回收机制完全销毁,理论上不用再调用recycle()。
用java进行移动端后台开发方法:
第一种:可以选择用Java EE的编程结构去编写,需要把HTML的界面转换成其他的数据,例如json、xml,二者选择其中一个即可。
第二种:通过tomact的网络服务器使用httpurlconnection,客户端与后台建立通讯,直接用socket进行连接。
第三种:全能型的编程人员可以用前端经常使用的HTML5、css、JavaScript相结合进行开发。
注意点:
Java web后台开发跟手机app后台开发原理相同,主要不同点在于app的后台开发和web的传输数据格式有差异。
安装后需要配置好环境变量~安装MyEclipse的话,自带的有JDK。
这里我说说怎么自己配置环境吧,步骤如下(举例你把JDK安装在D:/jdk1.6里面):右击我的电脑,选择“属性”;选择“高级”选项卡,点击“环境变量”;在系统变量里面添加“JAVA_HOME”这个变量,变量值为JDK安装路径,此路径下包括lib,bin,jre等文件夹,如“D:/jdk1.6”;添加Path这个变量,使得系统可以在任何路径下识别java命令,变量值设为:%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin添加CLASSPATH这个变量,这个变量为java加载类(classorlib)路径,只有类在classpath中,java命令才能识别,变量值设为:.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar(注意前面要加“.”,表示当前路径)。
1. 为Activity声明系统配置变更事件系统配置变更事件是指转屏,区域语言发生变化,屏幕尺寸发生变化等等,如果Activity没有声明处理这些事件,发生事件时,系统会把Activity杀掉然后重启,并尝试恢复状态,Activity有机会通过onSaveInstanceState()保存一些基本数据到Bundle中,然后此Bundle会在Activity的onCreate()中传递过去。
虽然这貌似正常,但是这会引发问题,因为很多其他的东西比如Dialog等是要依赖于具体Activity实例的。所以这种系统默认行为通常都不是我们想要的。
为了避免这些系统默认行为,就需要为Activity声明这些配置,如下二个是每个Activity必须声明的:几乎所有的Activity都要声明如上,为什么Android不把它们变成Default的呢?2. 尽量使用Android的API这好像是废话,在Android上面开发不用Android API用什么?因为Android几乎支持Java SE所有的API,所以有很多地方Android API与Java SE的API会有重复的地方,比如说对于文件的操作最好使用Android里面Context封装的API,而不要直接使用File对象:Context.openFileOutput(String); // no File file = new File(String)原因就是API里面会考虑到Android平台本身的特性;再如,少用Thread,而多使用AsyncTask等。3. 要考虑到Activity和进程被杀掉的情况如了通常情况退出Activity外,还有Activity因其他原因被杀的情况,比如系统内存过低,系统配置变更,有异常等等,要考虑和测试这种情况,特别是Activity处理重要的数据时,做好的数据的保存。
4. 小心多语言有些语言真的很啰嗦,中文或英文很简短就能表达的事情到了其他语言就变的死长死长的,所以如果是wrap_content就可能把其他控制挤出可视范围; 如果是指定长度就可能显示不全。也要注意特殊语言比如那些从右向左读的语言。
5. 不要用四大组件去实现接口一是组件的对象都比较大,实现接口比较浪费,而且让代码更不易读和理解; 另外更重要的是导致多方引用,可能会引发内存泄露。6. 用getApplication()来取Context当参数对于需要使用Context对象作为参数的函数,要使用getApplication()获取Context对象当参数,而不要使用this,除非你需要特定的组件实例!getApplication()返回的Context是属于Application的,它会在整个应用的生命周期内存在,远大于某个组件的生命周期,所以即使某个引用长期持有Context对象也不会引发内存泄露。
7. 主线程只做UI控制和Frameworks回调相关的事。附属线程只做费时的后台操作。
交互只通过Handler。这样就可以避免大量的线程问题。
8. Frameworks的回调不要做太多事情仅做必要的初始化,其他不是很重要的事情可以放到其他线程中去做,或者用Handler Schedule到稍后再做。9. 要考虑多分辨率至少为hdpi, mdpi, ldpi准备图片和布局。
元素的单位也尽可能的使用dip而不要用px。10. 利用Android手机的硬键几乎所有的Android手机都有BACK和MENU,它们的作用是返回和弹出菜单,所以就不要再在UI中设计返回按扭和菜单按扭。
很多优秀的应用如随手记和微信都有返回键,他们之所以有是因为他们都是从iOS上移植过来的,为了保存体验的一致,所以也有了返回和菜单。但这不够Android化,一个纯正的Android是没有必须重复硬键的功能的。
首先否认你上述的这几点:
1.打字速度:
每分钟写多少字母。 不代表开发效率呢。 开发工作是需要结合需求的、不是一通乱写、写代码不像打字员、基础包都是有联想功能的.. 比如String 只需要st。 后面的就给你联想出来了,等。
2、不会所谓的数据结构和算法能立足吗?
既然是JAVA小白、基础数据结构还是要清楚的、比如(string,int,object。)深层次无需知道了、这种级别也接触不到。算法。 对逻辑实现还是很有帮助的。常用简单的比如排序算法。 不过简单点的,数组都提供了排序的方法。其它看实际情况分析了。
总结下:新入职的java小白需要注意的点(开发层面的)
1、代码整洁
2、注释清晰
3、按照java开发规范进行开发(比如命名规范。 如果公司有明确规定就安装公司规定执行,如果没有就按照行业规范)
4、理解OOP面向对象编程概念、围绕OOP思想开发。(其实框架都给你搭建好了、只是补逻辑代码也不需要注意太多)
声明:本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
蜀ICP备2020033479号-4 Copyright © 2016 学习鸟. 页面生成时间:4.107秒