1,不要认为Struts已经过时了,也不要盲目的去追随JSF以及更新的MVC框架,在目前Struts仍旧是最为优秀的MVC框架,尤其是后来与Spring、Hibernate (或者Ibatis )的结合,使得Struts的应用得到了进一步的发展,也许你认为Webwork2、SpringMVC 或者JSF更为优秀和实用,那么也没有关系,其实只要对你或你的公司适用,那么就可以了。
2,你知道Javascript中的typeof和instanceof操作吗,如果不知道,劝你还是看看这方面的知识吧,typeof返回的是对象的类型,例如string、number、object等等,而instanceof判断的是一个对象是否是某个类的实例,例如:var arr=new Array();var type=typeof(arr);〃返回objectvar flag=arr instanceof Array;// 返回truevar flag2=arr instanceof Object;// 返回true;在实际使用过程中,你会发现instanceof是更为强大的,当然了许多时候typeof用起来很方便,但是对于复杂的场合typeof就不太适用了,尤其是对于自定义对象以及对象之间有着复杂的继承关系时,使用instanceof可以方便的对这些进行判断。
3,虽然你可能知道javascript中typeof的用法,但是如果你不能做对下面的题,说明你对typeof的理解还是不够的,例如:var a;var rs=typeof(a);〃请问rs的值是什么?(A)object (B)variable (C)undefined (D) string (E)null (F)以上答案全不正确如果你选择A还算对JS有一些了解,如果选择B则基本上是乱猜的,如果选择D什么也说明不了,如果选择E则说明你对于Java和Javascript有些东西还没有分清楚,选择F也是不正确的。
答案是C,记住在Javascript之中,如果一个变量没有初始化,那么该变量的类型为undefined。
4,也许你一直在抱怨Javascript之中没有列表、哈西表以及堆栈、队列等数据结构,如果真的在抱怨,那么也不是你的错,毕竟包括我自己在内,我们对JS的了解太少了,其实在JS之中,数组对象自身完全支持上面的那些数据结构,例如:var list=new Array();〃列表list[O]="a";list[100]="b";var map=new Array();〃哈西表map["001"]="a";map["user name"]="zha ngsa n";var stack=new Array();〃堆栈,即后进先岀stack.push("a");stack.pop();var queue=new Array();〃队列,即先进先岀queue.u nshift("a");queue.shift();可见JS是非常强大的,关键是我们知道的太少了,关于Javascript对于数组的操作,你也可以参考《Javascript对数组的操作》。
5,作为一个web开发人员,我们不能指望美工在完成漂亮的效果图之后,还要为我们将图切分,最后生成html文件后再给我们,然后我们对这些html文件,再修改转换为jsp、asp或者php文件。
我一直认为效果图的切分应该或者最好由我们程序员自己来做,因为美工做的效果图实际上是要应用到我们的产品或者项目中的,而具体的产品和项目对效果图中哪些部分是需要输入文字的,哪些地方是需要背景的,哪些地方是需要可以自动伸缩的,而哪些地方又是必须保证大小的,是有很严格的要求的,尤其是了。
这样并不是说美工不需要懂得html、css等技术,也不是说美工切岀的图,会不符合我们的要求,我们知道,一张效果图,可以有n种切法,但是要能够满足实际的需求,往往只有一种最合适的切法,而这个切法一般来说美工是不太清楚的,开发人员也是不清楚的,只有既是开发人员,又懂得美工切图的人,才能够找到最为合适的切分方法,而这样的人才是非常奇缺的!6,不要过于痴迷Ajax技术,也不要过于追捧web2.0这个时髦的词汇,并不是说什么东西粘上ajax或者web2.0,就能够火起来或者对我们的实际发展有利的,如果你是做公网网站的,那么要注意,不合适的ajax使用,会使得网站被搜索引擎收录的信息大幅度减少,但是ajax或者Flex2等技术对于用户体验而言,还是相当不错的,因此是否使用ajax等技术,一要看对你们的解决方案宣传是否有作用,另外一点就是要看,它是否真正的改进了我们的应用。
7,对于ajax的post提交方式,可能你有些问题要问,例如post的方式是不是只要在open时指定method就可以了,为什么我将大数据放到url后面,而没有被完全传递过去,为什么我后台使用类似jsp 中的request.getParamter 方法接收不到数据,我们通过一个例子看一下ajax发送/接受大数据的方式:1) send.jsp:(我举的例子使用的是Javascript开源框架JsJava的ajax类库,该类库对IE和Firefox 等的XMLHttpRequest 等对象进行了易用性的封装,不像prototype.js默认对传递的数据进行urlencode编码)var ajaxRequest=new AjaxRequest();ajaxRequest.setRequestMethod("post");ajaxRequest.setRequestURL("ajaxresp on se.jsp");ajaxRequest.setAs yn c(true);ajaxRequest.setMethodO nSuccess( on Success,[ajaxRequest]);ajaxRequest.setRequestHeader("C onten t-Type","applicatio n/x-www-form-urle ncoded;charset=utf-8");ajaxRequest.send("content= 这是一篇几千字的文档…在此省略");要注意设置发送方式为post,设置头信息的内容类型为application/x-www-form-urlencoded , charset 是否设置要看内容的编码情况,另外大数据就放到send之中,记住大数据不是放在url的参数之中的。
2) receive.jsp要知道,对于ajax post方式提交的数据,在服务器端如果是jsp不是简单使用getParameter就能取得到的,需要从输入流中去取,这和附件上传有些类似的地方。
当然要注意编码和解码的问题。
8,我们在界面中经常会通过setTimeout方法来实现定时或者异步操作,例如:setTimeout(myfunc,2000);〃两秒后执行myfunc 函数但是要注意setTimeout方法并不能阻止后面js代码逻辑的执行,例如:<script>var a =8;setTimeout(myfu nc,3000);docume nt.write("wait...");</script>上面的代码中,document.write("wait..."); 逻辑并不会等到3秒后才执行,而是立即执行的,其实这一点可能大部分开发人员都知道,但是如果不注意,就很容易犯下面的错误,如下面代码所示:var ajax2HasExecuted=false;var ajaxRequest1;fun cti on ajax1Fu nc(){if(!ajax2HasExecuted){setTimeout(ajax1Fu nc,200);var text=ajaxRequest1.getResp on seText();}var ajaxRequest2;fun cti on ajax2Fu nc(){var text=ajaxRequest2.getResp on seText();ajax2HasExecuted=true;}上面的代码是一个页面中同时发送了两个ajax异步请求,分别有两个对应的接收操作,而业务逻辑要求,这两个操作是要有先后顺序的,其中第一个接收操作,需要等待第二个接收操作完成之后,才能进行处理,于是第一个操作中就采用setTimeout的方式,本意是在执行第一个操作的开始的地方,先判断第二个操作是否已经执行完毕,如果没有执行完毕,则等待200毫秒后,重新执行第二个操作,然后由于setTimeout并不能组织后续的逻辑继续执行,所以实际上不管第二个操作是否完成,第一个操作都会一直往下执行下去,从而导致业务上的错误。
解决方法要么是在if后面加上else,或者在setTimeout之后直接return,例如:if(!ajax2HasExecuted){setTimeout(ajax1Fu nc,200);return;9, window.open 和window.showModalDialog 方法相信你已经用到过许多次了,但是总是岀现这样或那样的问题,问题主要是以下几个方面:1)showModalDialog 这个函数名经常被写错,例如经常被写成showModelDialog ,使得不能执行打开窗口的操作。
2)控制打开窗口的属性,例如尺寸、滚动条、菜单、状态栏等,是我们经常会碰到的情况,但是我们经常会将这两种打开方式的属性名称以及属性之间的分隔符混用,使得属性执行不正确,例如我举下面的例子,要求弹岀一个宽200高300的窗口,你看哪些方式是对的?(A)win dow.ope n("about:bla nk","","width=200,height=300");(B)window.open("about:blank","","width:200,height:300");(C)wi ndow.ope n("about:bla nk","","width=200;height=300");(D)window.open("about:blank","","width:200;height:300");(E)window.showModalDialog("about:blank","","dialogWidth:200px;dialogHeight:300px");(F)window.showModalDialog("about:blank","","dialogWidth=200px;dialogHeight=300px");(G)wi ndow.showModalDialog("about:bla nk","","dialogWidth:200;dialogHeight:300");再多的选项就不写了,正确答案是A和E,通过上面的问题我们需要记住一下几点:•window.open控制属性之间的分隔符是逗号“,”属性和值之间用等于号"=“连接•window.showModalDialog 控制属性之间的分隔符是分号“;”属性之间的用冒号“连接•window.open控制属性中长度和宽度尺寸可以直接写数字,也可以加上度量,例如px,但是对于window.showModalDialog 的长度和宽度则必须带上px,否则尺寸无效,这一点是很重要的。