仓酷云
标题:
JAVA网页设计高功能、高弹性的JSP和Servlet的功能优...
[打印本页]
作者:
不帅
时间:
2015-1-18 11:34
标题:
JAVA网页设计高功能、高弹性的JSP和Servlet的功能优...
Java编译的是字节码,跟C++相反,启动不够快,效率不够高,难以精确控制内存,但是优点是编程比C++容易,代码比较安全但是容易留下性能隐患,跨平台靠字节码在各个平台复制(一处编译到处调试)js|servlet|功能|优化你的J2EE使用是否是运转的很慢?它们能不克不及接受住不休上升的会见量?本文报告了开辟高功能、高弹性的JSP页面和Servlet的功能优化手艺。其意义是创建尽量快的并能顺应数目增加的用户及其哀求。在本文中,我将率领你进修已理论和失掉证明的功能调剂手艺,它将年夜年夜地进步你的servlet和jsp页面的功能,进而提拔J2EE的功能。这些手艺的部分用于开辟阶段,比方,计划和编码阶段。另外一部分手艺则与设置相干。
手艺1:在HttpServletinit()办法中缓存数据
服务器会在创立servlet实例以后和servlet处置任何哀求之前挪用servlet的init()办法。该办法在servlet的性命周期中仅挪用一次。为了进步功能,在init()中缓存静态数据或完成要在初始化时代完成的价值高贵的操纵。比方,一个最好理论是利用完成了javax.sql.DataSource接口的JDBC毗连池。DataSource从JNDI树中取得。每挪用一次SQL就要利用JNDI查找DataSource长短常高贵的事情,并且严峻影响了使用的功能。Servlet的init()办法能够用于猎取DataSource并缓存它以便以后的重用:
publicclassControllerServletextendsHttpServlet
{
privatejavax.sql.DataSourcetestDS=null;
publicvoidinit(ServletConfigconfig)throwsServletException
{
super.init(config);
Contextctx =null;
try
{
ctx=newInitialContext();
testDS=(javax.sql.DataSource)ctx.lookup("jdbc/testDS");
}
catch(NamingExceptionne)
{
ne.printStackTrace();
}
catch(Exceptione)
{
e.printStackTrace();
}
}
publicjavax.sql.DataSourcegetTestDS()
{
returntestDS;
}
...
...
}
手艺2:禁用servlet和Jsp的主动装载功效
当每次修正了Servlet/JSP以后,你将不能不从头启动服务器。因为主动装载功效削减开辟工夫,该功效被以为在开辟阶段长短常有效的。可是,它在运转阶段长短常高贵的;servlet/JSP因为不用要的装载,增添类装载器的包袱而形成很差的功能。一样,这会使你的使用因为已被某品种装载器装载的类不克不及和以后类装载器装载的类不克不及互相合作而呈现奇异的抵触征象。因而,在运转情况中为了失掉更好的功能,封闭servlet/JSP的主动装载功效。
手艺3:把持HttpSession
很多使用必要一系列客户真个哀求,因而他们能相互相干联。因为HTTP协定是无形态的,以是基于Web的使用必要卖力保护如许一个叫做session的形态。为了撑持必需保护形态的使用,Javaservlet手艺供应了办理session和同意多种机制完成session的API。HttpSession对象饰演了session,可是利用它必要本钱。不管什么时候HttpSession被利用和重写,它都由servlet读取。你能够经由过程利用上面的手艺来进步功能:
在JSP页面中不要创立默许的HttpSession:默许情形下,JSP页面创立HttpSession。假如你在JSP页面中不必HttpSession,为了节俭功能开支,利用下边的页面指令能够制止主动创立HttpSession对象:
<%@pagesession="false"%>
不要将年夜的对象图存储在HttpSession中:假如你将数据看成一个年夜的对象图存储在HttpSession中,使用服务器每次将不能不处置全部HttpSession对象。这将迫使Java序列化和增添盘算开支。因为序列化的开支,跟着存储在HttpSession对象中数据对象的增年夜,体系的吞吐量将会下落。
用完后开释HttpSession:当不在利用HttpSession时,利用HttpSession.invalidate()办法使sesion生效。
设置超时价:一个servlet引擎有一个默许的超时价。假如你不删除session大概一向把session用到它超时的时分,servlet引擎将把session从内存中删除。因为在内存和渣滓搜集上的开支,session的超时价越年夜,它对体系弹性和功能的影响也越年夜。试着将session的超时价设置的尽量低。
手艺4:利用gzip紧缩
紧缩是删除冗余信息的作法,用尽量小的空间形貌你的信息。利用gzip(GNUzip)紧缩文档能无效地削减下载HTML文件的工夫。你的信息量越小,它们被送出的速率越快。因而,假如你紧缩了由你web使用发生的内容,它抵达用户并显现在用户屏幕上的速率就越快。不是任何扫瞄器都撑持gzip紧缩的,但反省一个扫瞄器是不是撑持它并发送gzip紧缩内容到扫瞄器是很简单的事变。下边的代码段申明了怎样发送紧缩的内容。
publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)
throwsIOException,ServletException
{
OutputStreamout=null
//ChecktheAccepting-EncodingheaderfromtheHTTPrequest.
//Iftheheaderincludesgzip,chooseGZIP.
//Iftheheaderincludescompress,chooseZIP.
//Otherwisechoosenocompression.
Stringencoding=request.getHeader("Accept-Encoding");
if(encoding!=null&&encoding.indexOf("gzip")!=-1)
{
response.setHeader("Content-Encoding","gzip");
out=newGZIPOutputStream(response.getOutputStream());
}
elseif(encoding!=null&&encoding.indexOf("compress")!=-1)
{
response.setHeader("Content-Encoding","compress");
out=newZIPOutputStream(response.getOutputStream());
}
else
{
out=response.getOutputStream();
}
...
...
}
手艺5:不要利用SingleThreadModel
SingleThreadModel包管servlet一次仅处置一个哀求。假如一个servlet完成了这个接口,servlet引擎将为每一个新的哀求创立一个独自的servlet实例,这将引发大批的体系开支。假如你必要办理线程平安成绩,请利用其他的举措替换这个接口。SingleThreadModel在Servlet2.4中是不再倡始利用。
手艺6:利用线程池
servlet引擎为每一个哀求创立一个独自的线程,将该线程指派给service()办法,然后在service()办法实行完后删除该线程。默许情形下,servlet引擎大概为每一个哀求创立一个新的线程。因为创立和删除线程的开支是很高贵的,因而这类默许举动下降了体系的功能。我们可使用线程池来进步功能。依据预期的并发用户数目,设置一个线程池,设置好线程池里的线程数目的最小和最年夜值和增加的最小和最年夜值。后来,servlet引擎创立一个线程数与设置中的最小线程数目相称的线程池。然后servlet引擎把池中的一个线程指派给一个哀求而不是每次都创立新的线程,完成操纵以后,servlet引擎把线程放回到线程池中。利用线程池,功能能够明显地进步。假如必要,依据线程的最年夜数和增加数,能够创立更多的线程。
手艺7:选择准确的包含机制
在JSP页面中,有两中体例能够包含文件:包含指令(<%@includefile="test.jsp"%>)和包含举措(<jsp:includepage="test.jsp"flush="true"/>)。包含指令在编译阶段包含一个指定文件的内容;比方,当一个页面编译成一个servlet时。包含举措是指在哀求阶段包含文件内容;比方,当一个用户哀求一个页面时。包含指令要比包含举措快些。因而除非被包含的文件常常变化,不然利用包含指令将会取得更好的功能。
手艺8:在useBean举措中利用符合的局限
利用JSP页面最壮大体例之一是和JavaBean组件协同事情。JavaBean利用<jsp:useBean>标签能够嵌进到JSP页面中。语法以下:
<jsp:useBeanid="name"scope="page|request|session|application"class=
"package.className"type="typeName">
</jsp:useBean>
scope属性申明了bean的可见局限。scope属性的默许值是page。你应当依据你使用的需求选择准确的局限,不然它将影呼应用的功能。
比方,假如你必要一个公用于某些哀求的对象,可是你把局限设置成了session,那末谁人对象将在哀求停止以后还保存在内存中。它将一向保存在内存中除非你明白地把它从内存中删除、使session有效或session超时。假如你没有选择准确的局限属性,因为内存和渣滓搜集的开支将会影响功能。因而为对象设置符合的局限并在用完它们以后当即删除。
杂项手艺
制止字符串联接:因为String对象是不成变对象,利用“+”操纵符将会招致创立大批的零时对象。你利用的“+”越多,产出的零时对象就越多,这将影响功能。当你必要毗连字符串时,利用StringBuffer替换“+”操纵。
制止利用System.out.println:System.out.println同步处置磁盘输出/输入,这年夜年夜地下降了体系吞吐量。尽量地制止利用System.out.println。只管有良多成熟的调试工具能够用,但偶然System.out.println为了跟踪、或调试的情形下仍然很有效。你应当设置System.out.println仅在毛病和调试阶段翻开它。利用finalBoolean型的变量,当设置成false时,在编译阶段完成优化反省和实行跟踪输入。
ServletOutputStream与PrintWriter对照:因为字符输入流和把数据编码成字节,利用PrintWriter引进了小的功能开支。因而,PrintWriter应当用在一切的字符集都准确地转换做完以后。另外一方面,当你晓得你的servlet仅前往二进制数据,利用ServletOutputStream,由于servlet容器不编码二进制数据,如许你就可以打消字符集转换开支。
总结
本文的目标是展现给你一些理论的和已证明的用于进步servlet和JSP功能的功能优化手艺,这些将进步你的J2EE使用的全体功能。下一步应当察看其他相干手艺的功能调剂,如EJB、JMS和JDBC等。
对于一个大型项目,如果用java来作,可能需要9个月,并且可能需要翻阅10本以上的书,但如果用ruby来作,3个月,3本书就足够了,而.net也不过3,4本书足以,这就是区别。
作者:
只想知道
时间:
2015-1-21 10:24
接着就是EJB了,EJB就是Enterprise JavaBean, 看名字好象它是Javabean,可是它和Javabean还是有区别的。它是一个体系结构,你可以搭建更安全、更稳定的企业应用。它的大量代码已由中间件(也就是我们常听到的 Weblogic,Websphere这些J2EE服务器)完成了,所以我们要做的程序代码量很少,大部分工作都在设计和配置中间件上。
作者:
admin
时间:
2015-1-25 23:55
是一种使用者不需花费很多时间学习的语言
作者:
若相依
时间:
2015-1-27 23:13
有时间再研究一下MVC结构(把Model-View-Control分离开的设计思想)
作者:
蒙在股里
时间:
2015-2-5 11:01
学Java必读的两个开源程序就是Jive和Pet Store.。 Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。
作者:
小妖女
时间:
2015-2-9 14:19
学Java必读的两个开源程序就是Jive和Pet Store.。 Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。
作者:
柔情似水
时间:
2015-2-27 07:07
多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。在 Java 1.5 版本中,Java 又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。
作者:
海妖
时间:
2015-2-27 07:07
是一种由美国SUN计算机公司(Sun Microsystems, Inc.)所研究而成的语言
作者:
老尸
时间:
2015-3-6 12:58
是一种使用者不需花费很多时间学习的语言
作者:
再现理想
时间:
2015-3-11 00:23
一般学编程语言都是从C语开始学的,我也不例外,但还是可能不学过程语言而直接学面向对象语言的,你是刚接触语言,还是从C开始学比较好,基础会很深点,如果你直接学习JAVA也能上手,一般大家在学语言的时候都记一些语言的关键词,常有的包和接口等。再去做逻辑代码的编写,以后的学习过程都是从逻辑代码编写中提升的,所以这方面都是经验积累的。你要开始学习就从
作者:
飘灵儿
时间:
2015-3-11 16:32
自从Sun推出Java以来,就力图使之无所不包,所以Java发展到现在,按应用来分主要分为三大块:J2SE,J2ME和J2EE,这也就是Sun ONE(Open Net Environment)体系。J2SE就是Java2的标准版,主要用于桌面应用软件的编程;J2ME主要应用于嵌入是系统开发,如手机和PDA的编程;J2EE是Java2的企业版,主要用于分布式的网络程序的开发,如电子商务网站和ERP系统。
作者:
精灵巫婆
时间:
2015-3-17 18:09
其实说这种话的人就如当年小日本号称“三个月拿下中国”一样大言不惭。不是Tomjava泼你冷水,你现在只是学到了Java的骨架,却还没有学到Java的精髓。接下来你得研究设计模式了。
作者:
愤怒的大鸟
时间:
2015-3-27 17:11
任职于太阳微系统的詹姆斯·高斯林等人于1990年代初开发Java语言的雏形,最初被命名为Oak,目标设置在家用电器等小型系统的程序语言
作者:
金色的骷髅
时间:
2015-3-27 20:08
科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。
作者:
因胸联盟
时间:
2015-4-1 11:19
有时间再研究一下MVC结构(把Model-View-Control分离开的设计思想)
作者:
不帅
时间:
2015-4-3 04:22
是一种使网页(Web Page)产生生动活泼画面的语言
作者:
若天明
时间:
2015-4-3 04:27
有时间再研究一下MVC结构(把Model-View-Control分离开的设计思想)
作者:
第二个灵魂
时间:
2015-4-12 16:19
有时间再研究一下MVC结构(把Model-View-Control分离开的设计思想)
作者:
深爱那片海
时间:
2015-4-12 18:16
所以现在应用最广泛又最好学的就是J2EE了。 J2EE又包括许多组件,如Jsp,Servlet,JavaBean,EJB,JDBC,JavaMail等。要学习起来可不是一两天的事。那么又该如何学习J2EE呢?当然Java语法得先看一看的,I/O包,Util包,Lang包你都熟悉了吗?然后再从JSP学起。
作者:
小女巫
时间:
2015-4-14 04:47
多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。在 Java 1.5 版本中,Java 又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。
欢迎光临 仓酷云 (http://ckuyun.com/)
Powered by Discuz! X3.2