仓酷云

标题: JAVA编程:Servlet、Jsp功能优化 [打印本页]

作者: 莫相离    时间: 2015-1-18 11:08
标题: JAVA编程:Servlet、Jsp功能优化
java比较简单,没有C++的烦琐,但学习时最好有C++为基础.与JSP和SQL起应用,功能强大.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并缓存它以便以后的重用:
  1. 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紧缩内容到扫瞄器是很简单的事变。下边的代码段申明了怎样发送紧缩的内容。
  1. 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"%>)和包含举措()。包含指令在编译阶段包含一个指定文件的内容;比方,当一个页面编译成一个servlet时。包含举措是指在哀求阶段包含文件内容;比方,当一个用户哀求一个页面时。包含指令要比包含举措快些。因而除非被包含的文件常常变化,不然利用包含指令将会取得更好的功能。

手艺8:在useBean举措中利用符合的局限

利用JSP页面最壮大体例之一是和JavaBean组件协同事情。JavaBean利用标签能够嵌进到JSP页面中。语法以下:
  1. <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等。

作者Email:gagaghost@yahoo.com.cn
Java伴随着互联网的迅猛发展而发展,逐渐成为重要的网络编程语言。Oracle收购Sun后Java前途未卜。
作者: 深爱那片海    时间: 2015-1-20 14:56
在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。
作者: admin    时间: 2015-1-21 16:42
是一种使网页(Web Page)产生生动活泼画面的语言
作者: 因胸联盟    时间: 2015-1-30 21:16
在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。
作者: 冷月葬花魂    时间: 2015-2-6 16:01
如果要向java web方向发展也要吧看看《Java web从入门到精通》学完再到《Struts2.0入门到精通》这样你差不多就把代码给学完了。有兴趣可以看一些设计模块和框架的包等等。
作者: 第二个灵魂    时间: 2015-2-16 23:58
学Java必读的两个开源程序就是Jive和Pet Store.。 Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。
作者: 变相怪杰    时间: 2015-3-5 12:52
一般学编程语言都是从C语开始学的,我也不例外,但还是可能不学过程语言而直接学面向对象语言的,你是刚接触语言,还是从C开始学比较好,基础会很深点,如果你直接学习JAVA也能上手,一般大家在学语言的时候都记一些语言的关键词,常有的包和接口等。再去做逻辑代码的编写,以后的学习过程都是从逻辑代码编写中提升的,所以这方面都是经验积累的。你要开始学习就从
作者: 蒙在股里    时间: 2015-3-12 06:59
Jive的资料在很多网站上都有,大家可以找来研究一下。相信你读完代码后,会有脱胎换骨的感觉。遗憾的是Jive从2.5以后就不再无条件的开放源代码,同时有licence限制。不过幸好还有中国一流的Java程序员关注它,外国人不开源了,中国人就不能开源吗?这里向大家推荐一个汉化的Jive版本—J道。Jive(J道版)是由中国Java界大名 鼎鼎的banq在Jive 2.1版本基础上改编而成, 全中文,增加了一些实用功能,如贴图,用户头像和用户资料查询等,而且有一个开发团队在不断升级。你可以访问banq的网站
作者: 若天明    时间: 2015-3-19 18:34
是一种突破用户端机器环境和CPU




欢迎光临 仓酷云 (http://ckuyun.com/) Powered by Discuz! X3.2