-
Java并发编程--线程安全问题与解决方案
用多线程开发的人都知道,在多线程的开发过程中有可能会出现线程安全问题(专业术语叫内存可见性问题),但并不一定每次都会出现。出现这样的情况,也会另开发者头皮发麻,无从下手,接下来我们会慢慢深入,揭开多线程的神秘面纱。本文主要介绍了Java多线程开发的优势,使用该技术可能会出现的一些内存不可见问题以及相应的解决措施。通过本文,读者将学习到如下几块知识:为什么需要多线程技术(多线程的优势)使用多线程技术带来的一些问题产生内存不可见问题的条件产生内存不可见问题的原因我们该如何分析会不会产生内存可见问题及出现问题之后的解决方式下面进入正文为什么需要多线程技术(多线程的优势)线程是Java语言中不可或缺的重要部分,它们能使复杂的异步代码变得简单,简化复杂系统的开发;能充分发挥多处理器系统的强大计算能力。充分利用硬件资源。由于线程是CPU的基本调度单位,所以如果是单线程,那么最多只能同时在一个处理器上运行,意味着其他的CPU资源都将被浪费。而多线程可以同时在多个处理器上运行,只要各个线程间的通信设计正确,那么多线程将能充分利用处理器的资源。结构优雅。多线程程序能将代码量巨大,复杂的程序分成一个个简单的功能模块,每块实现复杂程序的一部分单一功能,这将会使得程序的建模,测试更加方便,结构更加清晰,更加优雅。简化异步处理。为了避免阻塞,单线程应用程序必须使用非阻塞I/O,这样的I/O复杂性远远高于同步I/O,并且容易出错。使用多线程技术带来的一些问题线程安全(内存可见性问题):由于统一进程下的多个线程是共享同样的地址空间和数据的,又由于线程执行顺序的不可预知性,一个线程可能会修改其他线程正在使用的变量,这一方面是给数据共享带来了便利;另一方面,如果处理不当,会产生脏读,幻读等问题,好在Java提供了一系列的同步机制来帮助解决这一问题,例如内置锁。活跃性问题。可能会发生长时间的等待锁,甚至是死锁。性能问题。线程的频繁调度切换会浪费资源,同步机制会导致内存缓冲区的数据无效,以及增加同步流量。产生内存不可见问题(线程安全问题)的条件产生内存不可见的条件有俩个1.多个线程2.存在共享变量当多个线程操作了共享变量时,就有可能会产生线程安全问题(内存不可见问题)。产生内存不可见问题的原因产生内存不可见的问题有三个原因1.没有保证代码的原子性2.没有保证代码的可见性3.没有保证代码的有序性1.1没有保证原子性产生内存不可见的究极原因?由于现代的CPU是多核的,可以实现并行,所以读书的时候我一直带着这样的疑问?多核会不会同时操作同一内存下的数据:举例代码i++;多核处理器会不会同时执行这行代码?答案是不会同时执行。请参考1.2没有保证代码的可见性产生内存不可见的究极原因?可见性定义:一个线程的写对另一个线程立即可知。现代的处理器都有读写缓冲区,读缓冲区异步从主存中读取数据,写缓冲区临时保存向内存写入的数据。有了写缓冲区可以保证指令流水线持续进行,它可以避免由于处理器停顿下来等待向内存写入数据而产生的延迟。同时以异步的方式刷新写缓冲区,以及合并写缓冲区中对同一个地址的多次写,减少对内存总线的占用。假设线程A,B,分别在俩个处理器上执行,初始时a=0,线程A先执行a=1,线程B再执行a=2,线程3去读变量a,最后a会是几呢?答案012都有可能。产生0的原因:线程A先执行a=1,然后放到写缓冲区,线程B再执行a=2,然后又放到写缓冲区,假设俩个写缓冲区还没又刷新的时候线程3去读变量a,此时线程3读取到变量a就为0。产生1的原因:线程A先执行a=1,然后放到写缓冲区,线程B再执行a=2,然后又放到写缓冲区,假设线程A所在处理器的写缓冲区已刷新,线程B还没又刷新的时候,线程3去读变量a,此时线程3读取到变量a就为1。产生2的原因:线程A先执行a=1,然后放到写缓冲区,线程B再执行a=2,然后又放到写缓冲区,假设线程B所在处理器的写缓冲区已刷新,线程A还没又刷新的时候,线程3去读变量a,此时线程3读取到变量a就为2。综上所诉,没有保证代码的可见性产生内存不可见的究极原因是:写缓冲区的存在,且以异步的方式刷新缓冲。1.3没有保证代码的有序性产生内存不可见的究极原因?编译器和处理器为了优化程序的性能会进行从排序,所以有序性会产生内存不可见问题。我们该如何分析会不会产生内存可见问题及出现问题之后的解决方式如何分析我们的代码会不会产生内存可见性问题Java虚拟机提供了Java内存模型来分析会不会产生内存可见性问题,Java内存模型也提供了一系列规则(happens-before等等)来辅助程序员更好的分析会不会产生内存可见行问题。出现问题之后的解决方式产生线程安全问题的原因有三个,解决方式无非就是1.保证代码的原子性2.保证代码的可见性3.保证代码的有序性。JVM提供了synchronized和volatile关键字来解决问线程安全问题Synchronized可以保证代码的原子性、保证代码的可见性、保证代码的有序性。volatile可以保证代码的可见性、保证代码的有序性但不能保证代码的原子性。所以Synchronized可以完全解决线程安全问题,而volatile不可以。总结为什么本篇要这么写呢?因为读完Java并发编程书籍之后,我觉得非常的混乱,读完之后感觉没有收获,就想写点东西做个总结,可是又无从下手,不知道如何引入到Java内存模型和synchronized、volatile关键字。为什么无从下手呢,后来发现是对Java内存模型和synchronized、volatile理解不够到位。Java内存模型可以帮助我们理解我们的代码会不会存在内存可见性问题。synchronized、volatile可以帮助我们解决内存可见性问题。前者是分析会不会产生问题,后者是产生问题之后的解决。既然理清了俩者的区别,那么该如何过渡到这呢,LZ想从本篇引入到并发学习中。
-
JSP内置对象/EL/JSTL
一:MVC设计模式MVC是一个设计模式,它强制的使应用层的输入,处理和输出分开。使用MVC设计模式被分为三个核心层:模型层,视图层,控制层。它们各自处理自己的任务。显示层(View):此层主要是负责将内容显式给用户。比如:JSP控制层(Controller):负责判断所有的用户请求参数是否合法,根据请求的类型调用模型层执行操作,再讲处理结果交给显示层显示。eg:servlet模型层(Model):操作数据库的独立的操作组件,或使用lavaBean(POJO)保存数据。二:JSP内置对象JSP中提供了九个内置对象,这些内置对象由容器为用户进行实例化,用户直接使用即可。eg:[html]viewplaincopy(1):>response内置对象title>head>3秒之后跳转到index页面h3>body>html>[html]viewplaincopy(2):>index.jsptitle>head>跳转过来了h3>body>html>[html]viewplaincopy(3):>处理错误的页面title>head>body>html>[html]viewplaincopy(4):JSPProjectdisplay-name>index.htmlwelcome-file>index.htmwelcome-file>index.jspwelcome-file>default.htmlwelcome-file>default.htmwelcome-file>default.jspwelcome-file>welcome-file-list>ctxparam-name>ContextParamValueparam-value>context-param>http://www.mycompany.comtaglib-uri>/WEB-INF/c.tldtaglib-location>taglib>jsp-config>web-app>三:EL表达式语言使用表达式语言(EL)可以在JSP页面进行方便的输出内容:EL语法:${表达式}EL有自己的内置对象:PageContext,pageScope,requestScope,sessionScope,applicationScope,param,paramValues,header,headerValues,cookie,initParam1.使用EL访问不同的属性范围:${pageScope.属性名},${requestScope.属性名},${sessionScope.属性名},${applicationScope.属性名},这四种属性访问范围由小到大。Eg:[html]viewplaincopy>EL访问不同属性范围的值title>head>page===>${pageScope.info}h3>request===>${requestScope.info}h3>session===>${sessionScope.info}h3>application===>${applicationScope.info}h3>${info}=====>${info}h3>body>html>2.EL访问JSP内置对象使用EL的pageContext内置对象访问JSP的内置对象:${pageContext.对应的jsp内置对象}Eg:EL获取上下文路径:特殊:${pageContext.servletContext.contextPath}EL访问session的ID:${pageContext.session.id}Eg::[html]viewplaincopy>EL访问jsp内置对象title>head>直接通过JSP内置对象获取上下文路径:h3>通过EL获取上下文路径:${pageContext.servletContext.contextPath}h3>通过EL获取sessionID:${pageContext.session.id}h3>通过EL判断当前的请求方式:${pageContext.request.method}h3>body>html>3.EL访问参数(访问客户端发送的参数。全局参数,一组参数)用途1:使用EL的param内置对象访问客户端发送的参数${param.参数名}eg:[html]viewplaincopy>EL访问客户端发送的请求参数title>head>客户端发送来的username参数是:${param.username}h3>客户端发送来的pwd参数是:${param.pwd}h3>body>html>用途2:使用EL的initParam内置对象访问上下文参数(全局参数),在web.xml中配置上下文参数:adminObamaeg:[html]viewplaincopy>EL访问全局参数(上下文参数)title>head>全局参数为ctx的值是:${initParam.ctx}h3>body>html>用途3:使用EL的paramValues内置对象访问一组参数${paramValues.参数名[0]}访问一组参数值${paramValues.参数名[n]}访问n+1组参数值eg:[html]viewplaincopy>兴趣爱好页面title>head>运动:电影:读书:音乐:form>body>html>[html]viewplaincopy>EL访问一组参数title>head>爱好是:h3>${paramValues.hobby[0]}h3>${paramValues.hobby[1]}h3>${paramValues.hobby[2]}h3>${paramValues.hobby[3]}h3>body>html>4.访问cookie通过EL的cookie内置对象访问JSESSIONID名称的cookie的语法:${cookie[“JSESSIONID”].name},${cookie[“JSESSIONID”].value}[html]viewplaincopy>EL的cookie内置对象访问Cookietitle>head>Cookie名为JSESSIONID的值为:${cookie["JSESSIONID"].value}h3>sessionID为:${pageContext.session.id}h3>body>html>5.访问header${header[“cookie”]}EL的运算符1.算数运算符+-*/(div)%(mod)eg:${param.num1+param.num2}参数相加2.关系运算符<(lt)>(gt)==(eq)!=(ne)>=(ge)EL运算符title>head>num1+num2=${param.num1+param.num2}h3>num1/num2=${param.num1/param.num2}也可以div${param.num1divparam.num2}h3>num1是否等于num2:${param.num1==param.num2}h3>true&&true:${true&&true}h3>true||false:${true||false}h3>${emptyparam.abc}h3>三目运算符:${param.num1>param.num2?"num1真的大于num2":"num1不大于num2"}h3>body>html>四:JSTL(JSPStandardTagLibraries)引入JSTL的步骤:第一步:将jstl-xx.jar导入/WEB-INF/lib文件夹下。第二步:将jstl-xx.jar解压后的META-INF文件夹下的xxx.tld文件拷贝到/WEB-INF/的某目录下第三步:在JSP页面使用taglib指令引入xxx.tld文件。JSP页面使用taglib指令引入xxx.tld文件注意:uri中指向xxx.tld文件的路径有两种写法:第一种:直接指向xxx.tld文件的路径第二种:在web.xml中配置taglib的urihttp://www.xxx.com/WEB-INF/c.tld1.输出标签2.设置标签设置属性范围的属性值设置对象的属性值3.捕获异常标签//有可能发生异常的代码4.判断标签//判断结果为true,执行此处5.forEach标签(遍历list集合或Map集合)${msg}6.choose标签=90}">优秀=80}">良好不及格,要加油!
-
JavaScript使用技巧精选
(一).确认删除用法:1.BtnDel.Attributes.Add("onclick","returnconfirm('"+"确认删除?"+"')");2.linktempDelete.Attributes["onclick"]="nojavascript...returnconfirm('"+"确认删除?"+"');";3.privatevoidgrdProject_ItemDataBound(objectsender,DataGridItemEventArgse)4.{if((e.Item.ItemType==ListItemType.Item)|(e.Item.ItemType==ListItemType.AlternatingItem)){//?除按怙上的提示部分e.Item.Cells[10].Attributes.Add("onclick","returnconfirm('确定删除吗?');");}}5.(二).跨语言字符串替换System.Text.RegularExpressions.Regex.Replace(str1,@"{1}","").Replace("","").Replace("","").Replace("-","-").Replace("&","&").Replace("").Replace("br","n");(三).关闭窗体1.this.btnClose.Attributes.Add("onclick","window.close();returnfalse;");2.关闭本窗体间跳转到另一个页面this.HyperLink1.NavigateUrl="nojavascript...onclick=window.opener.location.assign('"+"index.aspx"+"?&Func=Edit&AutoID="+intAutoid+');window.close();";3.关闭父窗体:
(四).WebMessageBox1.Response.Write("");2.Response.Write("");3.this.Page.RegisterStartupScript("ChiName","");(五).DataGrid中加CheckBox控件模板列.请看:http://blog.csdn.net/chengking/archive/2005/10/08/497520.aspx(六).window.open()方法语法:window.open(pageurl,name,parameters);window对象的open()方法用于创建一个新的窗口实例,新创建的窗口的外观由参数:parameters指定。新窗口中打开的文档由参数:pageurl指定。系统能够根据参数:name确定的名称访问该窗口。下表为parameters参数表:参数衩始值说明alwaysLoweredyes/no指定窗口隐藏在所有窗口之下。alwaysRaisedyes/no指定窗口浮在所有窗口之上。dependentyes/no指定打开的窗口为父窗口的一个了窗口。并随父窗口的关闭而关闭。directionsyes/no指定Navigator2和3的目录栏是否在新窗口中可见。heightpixelvalue设定新窗口的像素高度。hotkeysyes/no在没有菜单栏的新窗口设置安全退出热键。innerHeightpixelvalue设置新窗口中文档的像素高度。innerWidthpixelvalue设置新窗口中文档的像素宽度。locationyes/no指明位置栏在新窗口中是否可见。menubaryes/no指明菜单栏在新窗口中是否可见。outerHeightpixelvalue设定窗口(包括装饰边框)的像素高度。outerWidthpixelvalue设定窗口(包括装饰边框)的像素宽度。resizableyes/no指明新窗口是否可以调整。screenXpixelvalue设定新窗口离屏幕边界的像素长度。screenYpixelvalue设定新窗口离屏幕上边界的像素长度。scrollbarsyes/no指明滚动栏在新窗口中是否可见。titlebaryes/no指明菜单题目栏在新窗口是否可见。toolbaryes/no指明工具栏在新窗口中是否可见。Widthpixelvalue设定窗口的像素宽度。z-lookyes/no在文档中包含各个标签的数组。fullscreenyes/no打开的窗体是否进行全屏显示leftpixelvalue设定新窗口距屏幕左方的距离toppixelvalue设定新窗口距屏幕上方的距离例子:(七).location对象href整个URL字符串.protocol含有URL第一部分的字符串,如http:host包含有URL中主机名:端口号部分的字符串.如//www.cenpok.net/server/hostname包含URL中主机名的字符串.如http://www.cenpok.netport包含URL中可能存在的端口号字符串.pathnameURL中"/"以后的部分.如~list/index.htmhash"#"号(CGI参数)之后的字符串.search"?"号(CGI参数)之后的字符串.(八).按键捕捉1.Ctrl+Enter按键捕捉方法2.Alt加快捷键:Alt+A Alt+A(九).控制输入,非法字符不能输入到TextBox.onkeypress="if(event.keyCode<48||event.keyCode>57)event.returnValue=false;"id="txtY_Revenue"style="TEXT-ALIGN:right"runat="server"Width="90%"MaxLength="12">说明:此方法控制TextBox只收数字:0~9,也自可以定义其它可输入字符,如改成:65~123,只允许输入:a~z和A~Z等. -
网页制作常用Javascript语句
1.document.write("");输出语句2.JS中的注释为//3.传统的HTML文档顺序是:document->html->(head,body)4.一个浏览器窗口中的DOM顺序是:window->(navigator,screen,history,location,document)5.得到表单中元素的名称和值:document.getElementById("表单中元素的ID?").name(或value)6.一个小写转大写的JS:document.getElementById("output").value=document.getElementById("input").value.toUpperCase();7.JS中的值类型:String,Number,Boolean,Null,Object,Function8.JS中的字符型转换成数值型:parseInt(),parseFloat()9.JS中的数字转换成字符型:(""变量)10.JS中的取字符串长度是:(length)11.JS中的字符与字符相连接使用?.12.JS中的比较操作符有:==等于,!=不等于,>,>=,
-
实现DIV圆角的JavaScript代码
这个程序是个用来制作P圆角的开源javascript代码实现,效果和图像制作圆角一样的.它简单,易用,不用修改任何图像就能做到不同半径圆角....用这个代码你可以自由定制自己的DIV,不再是方形了.完全可以实现圆形个性DIV用法说明:以下说明将以一个半径为20像素圆角的DIV为例.实现div圆角的JavaScript代码.rar解压您下载的文件,上传到您的站点。然后复制代码如下和黏贴它入您的网页的顶头部分。如果您保存了文件到该网页目录外的任何地方,修正代码中的src值.===代码:
------------------------------B然后创造一个div。如果您已有div使用圆角,只要给这个div一个id就可以.===代码: ------------------------------C最后我们需要添加一段javascript来预载。在您的网页的顶头部分增加以下代码:以下是引用片段:========其中,radius表示半径,数值越大,圆角就越大.------------------------------------D现在可以运行了.呵呵-----------------------------------PS:*********如果你想搞成奇形怪状的圆角,你可以设置每个角都不同的半径.例如:以下是引用片段:settings={tl:{radius:20},tr:{radius:40},bl:{radius:60},br:{radius:80},antiAlias:true,autoPad:false}或者:settings={tl:{radius:20},tr:false,bl:false,br:{radius:80},antiAlias:true,autoPad:false}提示:tl-左上角tr=右上角bl=左下角br=右下角 -
网页常用Javascript
document.write("最后更新时间:"+document.lastModified+"")</script><!--setTimeout('window.close();',5000);--></script>functionbookmarkit(){window.external.addFavorite('http://你的网址','你的网站名称')}if(document.all)document.write('<ahref="#"onClick="bookmarkit()">加入收藏夹</a>')</script>functionclick(){if(event.button==2||event.button==3){alert('禁止鼠标右键');}document.onmousedown=click//--></script>vartimedate=newDate("December25,2003");vartimes="圣诞节";varnow=newDate();vardate=timedate.getTime()-now.getTime();vartime=Math.floor(date/(1000*60*60*24));if(time>=0)document.write("现在离"+times+"还有:"+time+"天")</script><!--Beginif(window.print){document.write('<form>'+'<inputtype=buttonname=printvalue="打印本页"'+'onClick="nojavascript...window.print()"></form>');}//End--></script>today=newDate();functiondate(){this.length=date.arguments.lengthfor(vari=0;i<this.length;i++)this[i+1]=date.arguments}vard=newdate("星期日","星期一","星期二","星期三","星期四","星期五","星期六");document.write("<fontcolor=##000000style='font-size:9pt;font-family:宋体'>",today.getYear(),"年",today.getMonth()+1,"月",today.getDate(),"日",d[today.getDay()+1],"</font>");</script><!--vartext="";day=newDate();time=day.getHours();if((time>=0)&&(time<7))text="夜猫子,要注意身体哦!"if((time>=7)&&(time<12))text="今天天气……哈哈哈,不去玩吗?"if((time>=12)&&(time<14))text="午休时间哦,朋友一定是不习惯午睡的吧?!"if((time>=14)&&(time<18))text="下午茶的时间到了,休息一下吧!"if((time>=18)&&(time<=22))text="您又来了,可别和MM聊太久哦!"if((time>=22)&&(time<24))text="很晚了哦,注意休息呀!"document.write(text)//---></script>functionf1(){setInterval("mP.filters.wave.phase+=10",100);}if(document.all){document.write('<imgid=mPsrc="'+document.all.reflect.src+'"style="filter:wave(strength=3,freq=3,phase=0,lightstrength=30)blur()flipv()">')window.onload=f1}</script><!--varWindowsheight=100varWindowswidth=100varnumx=5functionopenwindow(thelocation){temploc=thelocationif(!(window.resizeTo&&document.all)&&!(window.resizeTo&&document.getElementById)){window.open(thelocation)return}windowsize=window.open("","","scrollbars")windowsize.moveTo(0,0)windowsize.resizeTo(100,100)tenumxt()}functiontenumxt(){if(Windowsheight>=screen.availHeight-3)numx=0windowsize.resizeBy(5,numx)Windowsheight+=5Windowswidth+=5if(Windowswidth>=screen.width-5){windowsize.location=templocWindowsheight=100Windowswidth=100numx=5return}setTimeout("tenumxt()",50)}//--></script><p><ahref="nojavascript...openwindow(http://www.sj33.cn)">进入</a>17.改变IE地址栏的IE图标我们要先做一个16*16的icon(图标文件),保存为index.ico。把这个图标文件上传到根目录下并在首页<head></head>之间加上如下代码:<linkREL="ShortcutIcon"href="index.ico">
-
JavaScript容易犯错的九个陷阱
以下是JavaScript容易犯错的九个陷阱。虽然不是什么很高深的技术问题,但注意一下,会使您的编程轻松些,即所谓makelifeeasier.笔者对某些陷阱会混杂一些评点。1.最后一个逗号如这段代码,注意最后一个逗号,按语言学角度来说应该是不错的(python的类似数据类型辞典dictionary就允许如此)。IE会报语法错误,但语焉不详,你只能用人眼从几千行代码中扫描。2.this的引用会改变如这段代码:
并不如你所愿,答案并不是”JavaScriptrules”。在执行MyObject.ClickHandler时,代码中红色这行,this的引用实际上指向的是document.getElementById("theText")的引用。可以这么解决: 实质上,这就是JavaScript作用域的问题。如果你看过,你会发现解决方案不止一种。3.标识盗贼在JavaScript中不要使用跟HTML的id一样的变量名。如下代码: IE会报对象未定义的错误。我只能说:IEsucks.4.字符串只替换第一个匹配如下代码:而实际上,结果是”This_isatitle“.在JavaScript中,String.replace的第一个参数应该是正则表达式。所以,正确的做法是这样:varfileName="Thisisatitle".replace(//g,"_");5.mouseout意味着mousein事实上,这是由于事件冒泡导致的。IE中有mouseenter和mouseleave,但不是标准的。作者在此建议大家使用库比如YUI来解决问题。6.parseInt是基于进制体系的这个是常识,可是很多人给忽略了parseInt还有第二个参数,用以指明进制。比如,parseInt("09"),如果你认为答案是9,那就错了。因为,在此,字符串以0开头,parseInt以八进制来处理它,在八进制中,09是非法,返回false,布尔值false转化成数值就是0.因此,正确的做法是parseInt("09",10).7.for...in...会遍历所有的东西有一段这样的代码:vararr=[5,10,15]vartotal=1;for(varxinarr){total=total*arr[x];}运行得好好的,不是吗?但是有一天它不干了,给我返回的值变成了NaN,晕。我只不过引入了一个库而已啊。原来是这个库改写了Array的prototype,这样,我们的arr平白无过多出了一个属性(方法),而for...in...会把它给遍历出来。所以这样做才是比较安全的:for(varx=0;x -
名词解释:JavaScript、Jscript、VBScript、ASP
VBScriptASP这也就是说,VBScript与Jscript两种脚本语言既能应用与客户端,也能应用与服务端。看看下面的例子:
或者://放在服务端页面第一行,表示该页默认使用Javascript脚本,在页面的其他地方使用,解释器就认为这是第一行定义的语言另外,.vbs与.js还能在被WindowScriptHost(WSH)所解释运行-->--> -
JavaScript基本数据结构
一、JavaScript代码的加入JavaScript的脚本包括在HTML中,它成为HTML文档的一部分。与HTML标识相结合,构成了一个功能强大的Internet网上编程语言。可以直接将JavaScript脚本加入文档:
JavaScript语言代码;JavaScript语言代码;....说明:通过标识指明JavaScript脚本源代码将放入其间。通过属性Language="JavaScript"说明标识中是使用的何种语言,这里是JavaScript语言,表示在JavaScript中使用的语言。下面是将JavaScript脚本加入Web文档中的例子:Test2.html document.Write("这是赛迪网互动学校");document.close();在浏览器的窗口中调用test2.html,则显示“这是赛迪网互动学校”字串。说明:Document.write()是文档对象的输出函数,其功能是将括号中的字符或变量值输出到窗口;document.close()是将输出关闭。可将标识放入head>..或...之间。将JavaScript标识放置...在头部之间,使之在主页和其余部分代码之前装载,从而可使代码的功能更强大;可以将JavaScript标识放置在...主体之间以实现某些部分动态地创建文档。二、基本数据类型JavaScript脚本语言同其它语言一样,有它自身的基本数据类型、表达式和算术运算符以及程序的基本框架结构。JavaScript提供了四种基本的数据类型用来处理数字和文字,而变量提供存放信息的地方,表达式则可以完成较复杂的信息处理。1、基本数据类型在JavaScript中四种基本的数据类型:数值(整数和实数)、字符串型(用“”号或‘’括起来的字符或数值)、布尔型(使True或False表示)和空值。在JavaScript的基本类型中的数据可以是常量,也可以变量。由于JavaScript采用弱类型的形式,因而一个数据的变量或常量不必首先作声明,而是在使用或赋值时确定其数据的类型的。当然也可以先声明该数据的类型,它是通过在赋值时自动说明其数据类型的。2、常量整型常量JavaScript的常量通常又称字面常量,它是不能改变的数据。其整型常量可以使用十六进制、八进制和十进制表示其值。实型常量实型常量是由整数部分加小数部分表示,如12.32、193.98。可以使用科学或标准方法表示:5E7、4e5等。布尔值布尔常量只有两种状态:True或False。它主要用来说明或代表一种状态或标志,以说明操作流程。它与C++是不一样的,C++可以用1或0表示其状态,而JavaScript只能用True或False表示其状态。字符型常量使用单引号(‘)或双引号(“)括起来的一个或几个字符。如"ThisisabookofJavaScript"、"3245"、"ewrt234234"等。空值JavaScript中有一个空值null,表示什么也没有。如试图引用没有定义的变量,则返回一个Null值。特殊字符同C语言一样,JavaScript中同样以有些以反斜杠(/)开头的不可显示的特殊字符。通常称为控制字符。3、变量变量的主要作用是存取数据、提供存放信息的容器。对于变量必须明确变量的命名、变量的类型、变量的声明及其变量的作用域。变量的命名JavaScript中的变量命名同其计算机语言非常相似,这里要注意以下两点:A、必须是一个有效的变量,即变量以字母开头,中间可以出现数字如test1、text2等。除下划线(-)作为连字符外,变量名称不能有空格、(+)、(-)、(,)或其它符号。B、不能使用JavaScript中的关键字作为变量。在JavaScript中定义了40多个类键字,这些关键是JavaScript内部使用的,不能作为变量的名称。如Var、int、double、true不能作为变量的名称。在对变量命名时,最好把变量的意义与其代表的意思对应起来,以免出现错误。变量的类型在JavaScript中,变量可以用命令Var作声明:varmytest;该例子定义了一个mytest变量。但没有赋予它的值。Varmytest=”Thisisabook”该例子定义了一个mytest变量,同时赋予了它的值。在JavaScript中,变量以可以不作声明,而在使用时再根据数据的类型来确其变量的类型。如:x=100y="125"xy=Truecost=19.5等。其中x整数,y为字符串,xy为布尔型,cost为实型。变量的声明及其作用域JavaScript变量可以在使用前先作声明,并可赋值。通过使用var关键字对变量作声明。对变量作声明的最大好处就是能及时发现代码中的错误;因为JavaScript是采用动态编译的,而动态编译是不易发现代码中的错误,特别是变量命名的方面。对于变量还有一个重要性──那就是变量的作用域。在JavaScript中同样有全局变量和局部变量。全局变量是定义在所有函数体之外,其作用范围是整个函数;而局部变量是定义在函数体之内,只对其该函数是可见的,而对其它函数则是不可见的。三、表达式和运算符1、表达式在定义完变量后,就可以对它们进行赋值、改变、计算等一系列操作,这一过程通常又叫称一个叫表达式来完成,可以说它是变量、常量、布尔及运算符的集合,因此表达式可以分为算术表述式、字串表达式、赋值表达式以及布尔表达式等。2、运算符运算符完成操作的一系列符号,在JavaScript中有算术运算符,如+、-、*、/等;有比较运算符如!=、==等;有逻辑布尔运算符如!(取反)、|、||;有字串运算如+、+=等。在JavaScript主要有双目运算符和单目运算符。其双目运算符由下列组成:操作数1运算符操作数2即由两个操作数和一个运算符组成。如50+40、"This"+"that"等。单目运算符,只需一个操作数,其运算符可在前或后。(1)算术运算符JavaScript中的算术运算符有单目运算符和双目运算符。双目运算符:+(加)、-(减)、*(乘)、/(除)、%(取模)、|(按位或)、&(按位与)、(右移)、>>>(右移,零填充)。单目运算符:-(取反)、~(取补)、++(递加1)、--(递减1)。(2)比较运算符比较运算符它的基本操作过程是,首先对它的操作数进行比较,尔后再返回一个true或False值,有8个比较运算符:(大于)、=(大于等于)、==(等于)、!=(不等于)。(3)布尔逻辑运算符在JavaScript中增加了几个布尔逻辑运算符:!(取反)、&=(与之后赋值)、&(逻辑与)、|=(或之后赋值)、|(逻辑或)、^=(异或之后赋值)、^(逻辑异或)、?:(三目操作符)、||(或)、==(等于)、|=(不等于)。其中三目操作符主要格式如下:操作数?结果1:结果2若操作数的结果为真,则表述式的结果为结果1,否则为结果2。四、范例下面是一个跑马灯效果的JavaScript文档。Test2_1.html varmsg="这是一个跑马灯效果的JavaScript文档";varinterval=100;varspacelen=120;varspace10="";varseq=0;functionScroll(){len=msg.length;window.status=msg.substring(0,seq+1);seq++;if(seq>=len){seq=spacelen;window.setTimeout("Scroll2();",interval);}elsewindow.setTimeout("Scroll();",interval);}functionScroll2(){varout="";for(i=1;i=len){seq=0;};window.setTimeout("Scroll2();",interval);}Scroll();本文介绍了JavaScript脚本是如何加入Web页面,并学习了JavaScript语言中的基本数据类型、变量、常量、操作运算符等。可以看出,对于已经掌握C++语言的人来说,学习JavaScript真是一件非常轻松愉快的事。 -
JS与Java在网页设计中的区别
在各种网页制作技术论坛中,常常有人询问javascript与Java有什么区别,甚至有人误认为javascript就是Java。javascript与Java确实有一定的联系,但它们并不像我们想象的那样联系紧密,甚至可以肯定地说它们有很大的区别。什么是javascript?javascript是对ECMA262语言规范的一种实现。本教程的目的就是引导您学习使用javascript,所有例子都在InternetExplorer5下通过,本人并没有在Netscape的各版浏览器中测试,所以可能有的例子不能在Netscape的浏览器中顺利运行。易学易用javascript是一种解释型的、基于对象的脚本语言。尽管与诸如C++和Java这样成熟的面向对象的语言相比,javascript的功能要弱一些,但对于它的预期用途而言,javascript的功能已经足够大了。javascript不是任何其他语言的精简版(例如,它只是与Java有点模糊而间接的关系),也不是任何事物的简化。不过,它有其局限性。例如,您不能使用该语言来编写独立运行的应用程序,并且该语言读写文件的功能也很少。此外,javascript脚本只能在某个解释器上运行,该解释器可以是Web服务器,也可以是Web浏览器。javascript是一种宽松类型的语言。这意味着您不必显式定义变量的数据类型。此外,在大多数情况下,javascript将根据需要自动进行转换。例如,如果试图将一个数值添加到由文本组成的某项(一个字符串),该数值将被转换为文本。什么是JAVA?Java是Sun公司推出的一种编程语言。它是一种通过解释方式来执行的语言,语法规则和C++类似。同时,Java也是一种跨平台的程序设计语言。用Java语言编写的程序叫做“Applet”(小应用程序),用编译器将它编译成类文件后,将它存在WWW页面中,并在HTML档上作好相应标记,用户端只要装上Java的客户软件就可以在网上直接运行“Applet”。Java非常适合于企业网络和Internet环境,现在已成为Internet中最受欢迎、最有影响的编程语言之一。Java有许多值得称道的优点,如简单、面向对象、分布式、解释性、可靠、安全、结构中立性、可移植性、高性能、多线程、动态性等。Java摈弃了C++中各种弊大于利的功能和许多很少用到的功能。Jave可以运行与任何微处理器,用Java开发的程序可以在网络上传输,并运行于任何客户机上。javascript与Java的区别主要表现在以下方面:一、javascript与Java是由不同的公司开发的不同产品。javascript是Netscape公司的产品,其目的是为了扩展NetscapeNavigator功能,而开发的一种可以嵌入Web页面中的基于对象和事件驱动的解释性语言;而Java是SUNMicrosystems公司推出的新一代面向对象的程序设计语言,特别适合于Internet应用程序开发。实际上,javascript最初的名字并不是javascript,而是LiveScript,名字中的“Java”是经过SUNMicrosystems公司授权的。二、javascript是基于对象的,它是一种脚本语言,是一种基于对象和事件驱动的编程语言,因而它本身提供了非常丰富的内部对象供设计人员使用。而Java是面向对象的,即Java是一种真正的面向对象的语言,即使是开发简单的程序也必须设计对象。三、javascript与Java嵌入方式不一样。在HTML文档中,两种编程语言的标识不同,javascript使用……来标识,而Java使用来标识。四、javascript与Java在浏览器中所执行的方式不一样。javascript是一种解释性编程语言,其源代码在发往客户端执行之前不需经过编译,而是将文本格式的字符代码发送给客户,即javascript语句本身随Web页面一起下载下来,由浏览器解释执行。而Java的源代码在传递到客户端执行之前,必须经过编译,因而客户端上必须具有相应平台上的仿真器或解释器,它可以通过编译器或解释器实现独立于某个特定的平台编译代码。五、javascript与Java代码格式不一样。javascript的代码是一种谋咀址格式,可以直接嵌入HTML文档中,并且可动态装载,编写HTML文档就像编辑文本文件一样方便,其独立文件的格式为*.js。Java是一种与HTML无关的格式,必须通过像HTML中引用外媒体那么进行装载,其代码以字节代码的形式保存在独立的文档中,其独立文件的格式为*.class。六、javascript与Java所采取的变量是不一样的。javascript中的变量声明采用弱类型,即变量在使用前不需作声明,而是解释器在运行时检查其数据类型。Java采用强类型变量检查,即所有变量在编译之前必须作声明。七、javascript采用动态联编,即javascript的对象引用在运行时进行检查。Java采用静态联编,即Java的对象引用必须在编译时的进行,以使编译器能够实现强类型检查。八、javascript不直接对文本和图形进行操作,它在Web页面中与HTML元素组合一起发挥作用,但它可以控制浏览器,让浏览器直接对文本和图形进行处理。而Java则可以直接对文本和图形进行操作。综上所述,我们可以发现,javascript与Java虽然都可以应用于网页设计,但它们的确有太大的区别,根本就是两种语言。