仓酷云

标题: JAVA编程:提拔JSP使用程序七年夜尽招 [打印本页]

作者: 海妖    时间: 2015-1-18 11:14
标题: JAVA编程:提拔JSP使用程序七年夜尽招
其实你不用Struts,spring这些工具,直接用jsp,servlet能够很方便地写出来,而且,可以根据个人的水平、爱好,有很多方案。而struts,spring这些工具的出来。js|程序你经常被客户埋怨JSP页面呼应速率很慢吗?你想过当客户会见次数剧增时,你的WEB使用能接受日趋增添的会见量吗?本文报告了调剂JSP和servlet的一些十分有用的办法,它可以使你的servlet和JSP页面呼应更快,扩大性更强。并且在用户数增添的情形下,体系负载会出现出光滑上长的趋向。在本文中,我将经由过程一些实践例子和设置办法使得你的使用程序的功能有出人意表的提拔。个中,某些调优手艺是在你的编程事情中完成的。而另外一些手艺是与使用服务器的设置相干的。在本文中,我们将具体地形貌如何经由过程调剂servlet和JSP页面,来进步你的使用程序的整体功能。在浏览本文之前,假定你有基础的servlet和JSP的常识。
办法一:在servlet的init()办法中缓存数据
当使用服务器初始化servlet实例以后,为客户端哀求供应服务之前,它会挪用这个servlet的init()办法。在一个servlet的性命周期中,init()办法只会被挪用一次。经由过程在init()办法中缓存一些静态的数据或完成一些只必要实行一次的、耗时的操纵,便可年夜年夜地进步体系功能。
比方,经由过程在init()办法中创建一个JDBC毗连池是一个最好例子,假定我们是用jdbc2.0的DataSource接口来获得数据库毗连,在一般的情形下,我们必要经由过程JNDI来获得详细的数据源。我们能够设想在一个详细的使用中,假如每次SQL哀求都要实行一次JNDI查询的话,那体系功能将会急剧下落。办理办法是以下代码,它经由过程缓存DataSource,使得下一次SQL挪用时仍旧能够持续使用它:
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主动重载(auto-reloading)
Servlet/JSP供应了一个有用的手艺,即主动重载手艺,它为开辟职员供应了一个好的开辟情况,当你改动servlet和JSP页面后而不用重启使用服务器。但是,这类手艺在产物运转阶段对体系的资本是一个极年夜的消耗,由于它会给JSP引擎的类装载器(classloader)带来极年夜的包袱。因而封闭主动重载功效对体系功能的提拔是一个极年夜的匡助。
办法3:不要滥用HttpSession

在良多使用中,我们的程序必要坚持客户真个形态,以便页面之间能够互相接洽。但不幸的是因为HTTP具有生成无形态性,从而没法保留客户真个形态。因而一样平常的使用服务器都供应了session来保留客户的形态。在JSP使用服务器中,是经由过程HttpSession对像来完成session的功效的,但在便利的同时,它也给体系带来了不小的包袱。由于每当你取得或更新session时,体系者要对它举行费时的序列化操纵。你能够经由过程对HttpSession的以下几种处置体例来提拔体系的功能:
?假如没有需要,就应当封闭JSP页面中对HttpSession的缺省设置:假如你没有明白指定的话,每一个JSP页面城市缺省地创立一个HttpSession。假如你的JSP中不必要利用session的话,那能够经由过程以下的JSP页面唆使符来克制它:
<%@pagesession="false"%>
?不要在HttpSession中寄存年夜的数据对像:假如你在HttpSession中寄存年夜的数据对像的话,每当对它举行读写时,使用服务器都将对其举行序列化,从而增添了体系的分外包袱。你在HttpSession中寄存的数据对像越年夜,那体系的功能就下落得越快。
?当你不必要HttpSession时,尽快地开释它:当你不再必要session时,你能够经由过程挪用HttpSession.invalidate()办法来开释它。
?只管将session的超不时间设得短一点:在JSP使用服务器中,有一个缺省的session的超不时间。当客户在这个工夫以后没有举行任何操纵的话,体系会将相干的session主动从内存中开释。超不时间设得越年夜,体系的功能就会越低,因而最好的办法就是只管使得它的值坚持在一个较低的程度。
办法4:将页面输入举行紧缩
紧缩是办理数据冗余的一个好的办法,出格是在收集带宽不敷兴旺的明天。有的扫瞄器撑持gzip(GNUzip)举行来对HTML文件举行紧缩,这类办法能够戏剧性地削减HTML文件的下载工夫。因而,假如你将servlet或JSP页面熟成的HTML页面举行紧缩的话,那用户就会以为页面扫瞄速率会十分快。但不幸的是,不是一切的扫瞄器都撑持gzip紧缩,但你能够经由过程在你的程序中反省客户的扫瞄器是不是撑持它。上面就是关于这类办法完成的一个代码片断:
publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)
throwsIOException,ServletException
{
OutputStreamout=null
Stringencoding=request.getHeader("Accept-Encoding");
if(encoding!=null&&encoding.indexOf("gzip")!=-1)
{
request.setHeader("Content-Encoding","gzip");
out=newGZIPOutputStream(request.getOutputStream());
}
elseif(encoding!=null&&encoding.indexOf("compress")!=-1)
{
request.setHeader("Content-Encoding","compress");
out=newZIPOutputStream(request.getOutputStream());
}
else
{
out=request.getOutputStream();
}
...
...
}
办法5:利用线程池
使用服务器缺省地为每一个分歧的客户端哀求创立一个线程举行处置,并为它们分拨service()办法,当service()办法挪用完成后,与之响应的线程也随之取消。因为创立和取消线程会泯灭必定的体系资本,这类缺省形式下降了体系的功能。但所幸的是我们能够经由过程创立一个线程池来改动这类情况。别的,我们还要为这个线程池设置一个最小线程数和一个最年夜线程数。在使用服务器启动时,它会创立数目即是最小线程数的一个线程池,当客户有哀求时,响应地从池从掏出一个线程来举行处置,当处置完成后,再将线程从头放进到池中。假如池中的线程不敷地话,体系会主动地增添池中线程的数目,但总量不克不及凌驾最年夜线程数。经由过程利用线程池,当客户端哀求急剧增添时,体系的负载就会出现的光滑的上升曲线,从而进步的体系的可伸缩性。
办法6:选择准确的页面包括机制
在JSP中有两种办法能够用来包括另外一个页面:1、利用include唆使符(<%@includeefile=”test.jsp”%>)。2、利用jsp唆使符(<jsp:includeepage=”test.jsp”flush=”true”/>)。在实践中我发明,假如利用第一种办法的话,可使得体系功能更高。
办法7:准确地断定javabean的性命周期
JSP的一个壮大的中央就是对javabean的撑持。经由过程在JSP页面中利用<jsp:useBean>标签,能够将javabean间接拔出到一个JSP页面中。它的利用办法以下:
<jsp:useBeanid="name"scope="page|request|session|application"class=
"package.className"type="typeName">
</jsp:useBean>
个中scope属性指出了这个bean的性命周期。缺省的性命周期为page。假如你没有准确地选择bean的性命周期的话,它将影响体系的功能。
举例来讲,假如你只想在一次哀求中利用某个bean,但你却将这个bean的性命周期设置成了session,那当此次哀求停止后,这个bean将仍旧保存在内存中,除非session超时或用户封闭扫瞄器。如许会泯灭必定的内存,并没有谓的增添了JVM渣滓搜集器的事情量。因而为bean设置准确的性命周期,并在bean的任务停止后尽快地清算它们,会利用体系功能有一个进步。
别的一些有效的办法
?在字符串联接操纵中只管不利用“+”操纵符:在java编程中,我们经常利用“+”操纵符来将几个字符串联接起来,但你也许历来没有想到过它竟然会对体系功能形成影响吧?因为字符串是常量,因而JVM会发生一些一时的对像。你利用的“+”越多,天生的一时对像就越多,如许也会给体系功能带来一些影响。办理的办法是用StringBuffer对像来取代“+”操纵符。
?制止利用System.out.println()办法:因为System.out.println()是一种同步伐用,即在挪用它时,磁盘I/O操纵必需守候它的完成,因而我们要只管制止对它的挪用。但我们在调试程序时它又是一个必不成少的便利工具,为懂得决这个冲突,我倡议你最好利用Log4j工具(http://Jakarta.apache.org),它既能够便利调试,而不会发生System.out.println()如许的办法。
?ServletOutputStream与PrintWriter的衡量:利用PrintWriter大概会带来一些小的开支,由于它将一切的原始输入都转换为字符流来输入,因而假如利用它来作为页面输入的话,体系要包袱一个转换历程。而利用ServletOutputStream作为页面输入的话就不存在一个成绩,但它是以二进制举行输入的。因而在实践使用中要衡量二者的利害。
总结
本文的目标是经由过程对servlet和JSP的一些调优手艺来极年夜地进步你的使用程序的功能,并因而提拔全部J2EE使用的功能。经由过程这些调优手艺,你能够发明实在并非某种手艺平台(好比J2EE和.NET之争)决意了你的使用程序的功能,主要是你要对这类平台有一个较为深切的懂得,如许你才干从基本上对本人的使用程序做一个优化!

再举这样一个例子:如果你想对一个数字取绝对值,你会怎么做呢?java的做法是intc=Math.abs(-166);而ruby的做法是:c=-166.abs。呵呵,这就看出了java与ruby的区别。
作者: 因胸联盟    时间: 2015-1-20 18:27
Java是一种计算机编程语言,拥有跨平台、面向对java
作者: 海妖    时间: 2015-1-29 14:21
Java 不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将源代码编译成二进制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码。从而实现了“一次编译、到处执行”的跨平台特性。
作者: 再见西城    时间: 2015-2-6 01:47
多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。在 Java 1.5 版本中,Java 又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。
作者: 冷月葬花魂    时间: 2015-2-6 11:09
应用在电视机、电话、闹钟、烤面包机等家用电器的控制和通信。由于这些智能化家电的市场需求没有预期的高,Sun公司放弃了该项计划。随着1990年代互联网的发展
作者: 小魔女    时间: 2015-2-16 00:49
另外编写和运行Java程序需要JDK(包括JRE),在sun的官方网站上有下载,thinking in java第三版用的JDK版本是1.4,现在流行的版本1.5(sun称作J2SE 5.0,汗),不过听说Bruce的TIJ第四版国外已经出来了,是专门为J2SE 5.0而写的。
作者: 小女巫    时间: 2015-2-16 23:52
科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。
作者: 愤怒的大鸟    时间: 2015-2-28 21:15
让你能够真正掌握接口或抽象类的应用,从而在原来的Java语言基础上跃进一步,更重要的是,设计模式反复向你强调一个宗旨:要让你的程序尽可能的可重用。
作者: 精灵巫婆    时间: 2015-3-7 08:12
不过,每次的执行编译后的字节码需要消耗一定的时间,这同时也在一定程度上降低了 Java 程序的运行效率。
作者: 简单生活    时间: 2015-3-11 18:48
如果要向java web方向发展也要吧看看《Java web从入门到精通》学完再到《Struts2.0入门到精通》这样你差不多就把代码给学完了。有兴趣可以看一些设计模块和框架的包等等。
作者: 不帅    时间: 2015-3-19 07:48
其实说这种话的人就如当年小日本号称“三个月拿下中国”一样大言不惭。不是Tomjava泼你冷水,你现在只是学到了Java的骨架,却还没有学到Java的精髓。接下来你得研究设计模式了。
作者: 只想知道    时间: 2015-3-27 14:09
有时间再研究一下MVC结构(把Model-View-Control分离开的设计思想)




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