java web 开发中各种注意点总结(转)-后期可能会出原创版

来源:互联网 发布:钢琴键盘软件 编辑:程序博客网 时间:2024/05/20 17:38

此篇只是我个人在java web开发中遇到的一些小点的经验总结,如果你也有自己的心得,欢迎也把它们告诉我,让我们一起在技术多多交流共同提高。

        1,三分之一乘以六,你会怎么写?1/3*6 还是 6*1/3?当然,我会选择后者,我不提你也许不会注意,但我提到这儿,想必你一看都知道原因。所以:在计算式编写时,要尽量把除法这种可能会产生精度问题的运算放到最后去做。

        2,开发时,model类和表一般都是对应的,那建立时,如果一个属性是数字,你会使用int还是Integer?我会选择后者,因为在获得表中数据时,用了int,但表中这个字段没有值,会出现什么情况我不清楚,也许各个DAO层的框架会有不同的处理,但int必有一值,你再get这个int,那get出的是你想要的么,你可以想想。但Integer就会有所不同,最起码你可以判null再处理。所以:建立model类时,尽量用封装类型。

        3,如果用的mysql,貌似SQL的sum函数可能返回空值,而count函数则最起码会有个0,所以你得注意了,如果统计数据总数的count语句,你可以在java的那个方法上写成返回long;但是如果是sum函数来做加法统计,你最好还是写成返回Long。

        4,现在的表中和model中,一般定义id时都已经定义的是Long了,所以,如果你用count返回记录条数,也最好写成Long或者long,用int的话,可能出现的问题,你懂的...

        5,程序嘛,肯定离不开字符串操作,所以如果要操作字符串,无论这个字符串来自前台用户输入,还是从后面数据库中取得的,那都请注意了:必须先判null,再判是否是空格串,如果要subSting,那就更要连长短都要判断,不要截到空出去了。

        6,如果要操作有小数点的数字(1.5,2.31)这样的,比如商品价格啥的,某类商品打折信息8折(0.8)啥的。如果数据库支持Bigdecimal,那么这个字段你最好用它,并且对应的model属性也用Bigdecimal,不要贪图float或者double的简单,这玩意儿不小心给你搞出精度问题,钱的问题,估计你要被批死;如果数据库不支持,那就用string字符串,java的model属性也用字符串,这样就有强迫后来者必须转换Bigdecimal来进行计算的意图,避免不必要的精度问题出现,1.0-0.9在double上等于几大家都知道的吧...

        7,java的StringBuffer和StringBuilder,大家都知道一个线程安全,一个非线程安全;一个慢点,一个快点。但是如果你想要提升性能,那么请记住:根据它们本身的快慢来选择哪个并不是加快速度的重点,重点是,new它们的使用,给它们预计一个可能的长度。

        8,spring大家几乎都用吧,struts也用吧,那么action层写一个BaseAction然后其他action来继承它,以达到对公共操作的处理是常有的事情。那么就要记住:BaseAction中set了的protected UserServer userServer ,子类action中就千万别画蛇添足的再去set这个东西了,如果再次注入,spring的IOC注入就会把你埋到坑里去。

        9,struts大家也都用吧,那么必定写了action,然后再写了响应前面调用的action方法。那么请注意:这个业务处理方法的命名,最好不要以set或者get开头。原因很简单,set、get会被struts认为是对action自身属性的操作方法,可咱是想写业务处理的方法,struts的理解和咱的本意不对路啊。这中间就可能产生一些莫名其妙的问题。action出问题,什么都没错时,请看看你得方法命名。

        10,既然web,一般都JSP,肯定得用标签,说下最常用的C标签吧。<c:if test=" ${a==0 }"></c:if>,你觉得这个写法对吗?C标签配合EL表达式,貌似没有任何问题。可是请注意原式其实是: test="空格${a==0空格}",第二个空格不影响什么,直接忽略;可第一个空格出现在这儿,问题就大了,test就会总会是false,而无论你a是否等于0。所以,请注意引号内贴着引号时,别弄出个空格。

        11,用<img src=""/>,要在页面上显示一个图片?请注意:如果暂时还没有图片链接,请写成src="#",莫只留一个双引号在这儿。原因是,貌似留了空的引号,那用户使用时,页面下载完后,浏览器解析页面时,会被引导去再次访问当前地址。那本来访问一次就行的事情,被影响的要访问2次,用户对网站的速度感受会怎样?服务器处理2次白费劲怎么说?

        12,永远不相信数据库中取出的数据的依赖性,完整性。打个比方,在C2C交易平台上,通常理解下一个商品,必有一个发布者,所以你可能会根据商品对象保存的发布者ID到用户表中去找用户,当然你认为这种情况下,用户user对象是肯定存在的。可我得说,千万别相信user肯定存在,如果你获取了user并要使用它,那么请先判null。今天的业务依赖不等于明天的业务依赖,也许明天官方想发布自己的商品,这个字段就可能没有保存用户ID,或者对应的这个用户因为违反用户协议已经被封号或删号处理。所以:从数据库中取出的任何东西,如果使用时有潜在的非null的使用前提,那么都请显式的写出来,先判null,一切只为了哪怕你离开了,业务也变了,你的程序依然不会抛空指针,依然不需要后来者维护的健壮运行。

        13,对String做正则表达式验证时,如果是保存在数据库中的表达式,则应该与直接写成字符串样子的表达式有所区别。直接写的字符串表达式要对“\”进行转义写成“\\”,而数据库中的,因一直从取出到使用都传递的是一个引用,所以要直接写成“\”而不用转义。如直写的表达式“\\d”(对数字验证)数据库中应保存为“\d”。这样传引用不需要转义反斜线的性质也适用于其它情况。


        14, MySQL数据库Date类型的字段必须赋值一个大于1970年1月1日的日期值。否则对此字段进行where条件查询或order by等操作时就会报错。 

        15, Javascript编码时,所有命名均不宜使用常用的完整英文单词。如谷歌浏览器10版本中的某个就对top这个单词已经占用,如果写一个var  top={login: function(){}};这样的对象,然后用top.login()调用,在此款浏览器中就会报js方法找不到的错误。而top这个单词在W3C Javascript标准中并不是已占用的关键字。而其它浏览器也可能存在此现象,所以...To top。 

        16,Spring MVC值注入,在Controller中写的方法,方法参数直接写成@RequestParam(value="arr")String[] arr这样子来接收一个访问传入的数组已经是很常见的写法。但用jquery 1.7的$.getJSON("url",{"arr":arr},function(){});访问时,根据理解应可以取到我们传入的arr数组值,但结果却取不到,此时请写成 @RequestParam(value="arr[]")String[] arr这样的形式试试,问题就可以解决。(其实这和技术无关,只是一个奇怪的经验问题) 

        17,写 Javascript代码,最好每一句结束都加上“;”(分号)来表示一句的结束,这应该成为一种良好的编码习惯,即使是这样的“}”括号后面也应该写上“;”(分号),这样的话,即使以后你写的JS代码被压缩成一行,也不致出错。 

 18,在java EE web开发中,一般项目都离不开apache一些基础包的支持,这些包在项目中的本身存在性,可以为我们的开发带来极大的便利。要进行String字符串,Date日期等类型数据的操作时请不要忘记了借助它们的力量。StringUtils,DateUtils这些现成工具类的使用,能让你在成为高效多产的程序员历程上更进一步。StringUtils.isBank可以立即对字符串判空;DateUtils.addXX可以给日期立即加减小时、天、周、月、年等。要讲的道理很简单: 永远不要忘记使用现成的工具。 

     19,spring管理的Bean都是单例的,即使Controller也如此(与Struts2 Action显著的不同点,需特别谨记)。如果要给一个受管的Bean定义属性,就一定要考虑到这个特性。Controller里最常犯的错误就是把page这样的传入类请求参数定义成Controller整个类的属性。这样做很可能因为没有注意到单例特性而使处理方法取得了一个错误的page值(上次请求传入的,这次请求没传入,但值还在里面)。注意:spring管理的Controller是单例的和Struts管理的Aciton是多例是不同的

 

        20,上个总结提到的(总结2: http://my.oschina.net/sxgkwei/blog/50983),使用DateUtils来处理时间有关的操作,但注意:一般有2个这样的类: 
            a:org.apache.commons.lang.time.DateUtils 
            b:org.apache.http.impl.cookie.DateUtils 

        如果要格式化时间成字符串,或反向操作,千万别错误的使用了b,代码分享中有一个我自己写的DateUtil(http://www.oschina.net/code/snippet_176115_9640),用这个即可。而b,是总是用格林治(GMT)标准时间来转换的,而我国的是东8区,并不是见鬼的格林治,所以如果用它来转换,会在世界上差8小时,so...总结:在Date->String或反之操作时,一定要头脑清醒,注意到GMT与CST的不同。

 

        21,乱码问题。spring json已经可以正常返回中文,可是一接收到中文却总是乱码。即返回正常,接收不正常,这是什么情况呢,明明已经使用了spring的CharacterEncodingFilter类过滤了吖。这是需要考虑你的web服务器,如tomcat,在server.xml中的<Connector>标记内加入URIEncoding="UTF-8"也许就能解决。

 

        22, 使用mybatis时,可能会有where查询条件语句内要直接嵌入在java中拼接好的查询条件的情况。这时 <where>标签内有多个可能条件时需要直接将SQL条件写在首位,如下: 
        <where> 
            <if test="SQL != null"> 
                 ${SQL} 
             </if> 
            <if test="id != null"> 
                AND ID=#{id} 
             </if> 
                ... 
        </where> 
这样写的好处是: 
        a,因为在首位,所以不需要AND关键字链接,继而传入“  ”字符串也不会出错,而不再首位时,你需要先在前面写好AND,别人传入“  ”时就会出错,而作为java中的不明情况的调用者,是完全有可能传给你“  ”字符串的。 
        b,不明情况的调用者自己拼接SQL时,可以在前面拼入AND,也可以不拼。不拼,因为在首位当然不会错;拼了,因为在<where>标签内,这个标签有自动修剪首尾关键字的能耐,经过它的修剪自然也不会错。而如果不在首位,调用者是给最前面拼AND呢还是不拼呢?他是不是要跑来看你的XML文件中是不是提供了AND呢? 

        23,web.xml。一个filter需要filter-mapping来做url或servlet方面的过滤来调用filter类,此时需要特别注意filter-mapping中可以用<url-pattern>和<servlet-name>两种标签来过滤,而它们的意义是完全不同的,url-pattern自然是一般的url来匹配过滤;可servlet-name则是和已经定义的<servlet>标签对应的。网上很多的spring ShallowEtagHeaderFilter相关的过滤器配置都使用的servlet-name,我用了之后达不到效果,找了半天才发现是一个标签的问题。果断改为url-pattern,同时对误人子弟的说句:shit!

 

        24,用户输入的内容在页面显示: <%@taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>标签,然后在显示时${fn:escapeXml(text)}。为什么呢?当然是防止用户输入HTML标签而影响了你这个页面的显示,如果用户写个javascript标签,然后在里面注入点其它地方的JS代码呢?嘿嘿 
原创粉丝点击