仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1581|回复: 19
打印 上一主题 下一主题

[学习教程] JAVA网站制作之JSP/Servlet使用程序优化八法

[复制链接]
萌萌妈妈 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:39:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
大型的应用一般不会用这些框架(因为性能考虑);开发人员根据需要选择用一些框架,也可以不选用框架;不用框架并不代表要自己写框架;修改框架的可能性更小。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读取。你能够经由过程利用上面的手艺来进步功能:
l在JSP页面中不要创立默许的HttpSession:默许情形下,JSP页面创立HttpSession。假如你在JSP页面中不必HttpSession,为了节俭功能开支,利用下边的页面指令能够制止主动创立HttpSession对象:
<%@pagesession="false"%>
  1)不要将年夜的对象图存储在HttpSession中:假如你将数据看成一个年夜的对象图存储在HttpSession中,使用服务器每次将不能不处置全部HttpSession对象。这将迫使Java序列化和增添盘算开支。因为序列化的开支,跟着存储在HttpSession对象中数据对象的增年夜,体系的吞吐量将会下落。
  2)用完后开释HttpSession:当不在利用HttpSession时,利用HttpSession.invalidate()办法使sesion生效。
  3)设置超时价:一个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超时。假如你没有选择准确的局限属性,因为内存和渣滓搜集的开支将会影响功能。因而为对象设置符合的局限并在用完它们以后当即删除。
  杂项手艺
  1)制止字符串联接:因为String对象是不成变对象,利用“+”操纵符将会招致创立大批的零时对象。你利用的“+”越多,产出的零时对象就越多,这将影响功能。当你必要毗连字符串时,利用StringBuffer替换“+”操纵。
  2)制止利用System.out.println:System.out.println同步处置磁盘输出/输入,这年夜年夜地下降了体系吞吐量。尽量地制止利用System.out.println。只管有良多成熟的调试工具能够用,但偶然System.out.println为了跟踪、或调试的情形下仍然很有效。你应当设置System.out.println仅在毛病和调试阶段翻开它。利用finalBoolean型的变量,当设置成false时,在编译阶段完成优化反省和实行跟踪输入。
  3)ServletOutputStream与PrintWriter对照:因为字符输入流和把数据编码成字节,利用PrintWriter引进了小的功能开支。因而,PrintWriter应当用在一切的字符集都准确地转换做完以后。另外一方面,当你晓得你的servlet仅前往二进制数据,利用ServletOutputStream,由于servlet容器不编码二进制数据,如许你就可以打消字符集转换开支。
  总结
  本文的目标是展现给你一些理论的和已证明的用于进步servlet和JSP功能的功能优化手艺,这些将进步你的J2EE使用的全体功能。下一步应当察看其他相干手艺的功能调剂,如EJB、JMS和JDBC等。


诸如RMI,EJB等一些技术并不是你说的那么复杂,而是它们把一些复杂的工具封装成不复杂的工具了,理解这些工具是需要些时间。我问你,.net里有这些工具吗?要简单多少?。
山那边是海 该用户已被删除
沙发
发表于 2015-1-21 12:27:45 | 只看该作者
Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。
飘飘悠悠 该用户已被删除
板凳
发表于 2015-1-30 18:16:32 | 只看该作者
你一定会高兴地说,哈哈,原来成为Java高手就这么简单啊!记得Tomjava也曾碰到过一个项目经理,号称Java很简单,只要三个月就可以学会。
萌萌妈妈 该用户已被删除
地板
 楼主| 发表于 2015-2-1 09:30:49 | 只看该作者
你可以去承接一些项目做了,一开始可能有些困难,可是你有技术积累,又考虑周全,接下项目来可以迅速作完,相信大家以后都会来找你的,所以Money就哗啦啦的。。。。。。
再见西城 该用户已被删除
5#
发表于 2015-2-5 19:25:53 | 只看该作者
在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。
小妖女 该用户已被删除
6#
发表于 2015-2-22 19:37:28 | 只看该作者
是一种使网页(Web Page)由静态(Static)转变为动态(Dynamic)的语言
愤怒的大鸟 该用户已被删除
7#
发表于 2015-3-4 11:08:49 | 只看该作者
是一种将安全性(Security)列为第一优先考虑的语言
透明 该用户已被删除
8#
发表于 2015-3-7 05:51:22 | 只看该作者
你可以去承接一些项目做了,一开始可能有些困难,可是你有技术积累,又考虑周全,接下项目来可以迅速作完,相信大家以后都会来找你的,所以Money就哗啦啦的。。。。。。
兰色精灵 该用户已被删除
9#
发表于 2015-3-14 11:41:00 | 只看该作者
Jive的资料在很多网站上都有,大家可以找来研究一下。相信你读完代码后,会有脱胎换骨的感觉。遗憾的是Jive从2.5以后就不再无条件的开放源代码,同时有licence限制。不过幸好还有中国一流的Java程序员关注它,外国人不开源了,中国人就不能开源吗?这里向大家推荐一个汉化的Jive版本—J道。Jive(J道版)是由中国Java界大名 鼎鼎的banq在Jive 2.1版本基础上改编而成, 全中文,增加了一些实用功能,如贴图,用户头像和用户资料查询等,而且有一个开发团队在不断升级。你可以访问banq的网站
柔情似水 该用户已被删除
10#
发表于 2015-3-17 21:13:43 | 只看该作者
Java自面世后就非常流行,发展迅速,对C++语言形成了有力冲击。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台
海妖 该用户已被删除
11#
发表于 2015-3-25 02:50:15 | 只看该作者
吧,现在很流行的Structs就是它的一种实现方式,不过Structs用起来实在是很繁,我们只要学习其精髓即可,我们完全可以设计自己的MVC结构。然后你再研究一下软件Refactoring (重构)和极限XP编程,相信你又会上一个台阶。 做完这些,你不如整理一下你的Java代码,把那些经典的程序和常见的应用整理出来,再精心打造一番,提高其重用性和可扩展性。你再找几个志同道合的朋友成立一个工作室吧
爱飞 该用户已被删除
12#
发表于 2015-4-1 00:12:06 | 只看该作者
让你能够真正掌握接口或抽象类的应用,从而在原来的Java语言基础上跃进一步,更重要的是,设计模式反复向你强调一个宗旨:要让你的程序尽可能的可重用。
第二个灵魂 该用户已被删除
13#
发表于 2015-4-5 13:38:49 | 只看该作者
是一种突破用户端机器环境和CPU
只想知道 该用户已被删除
14#
发表于 2015-4-13 02:37:29 | 只看该作者
学Java必读的两个开源程序就是Jive和Pet Store.。 Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。
简单生活 该用户已被删除
15#
发表于 2015-4-26 16:47:27 | 只看该作者
Java 编程语言的风格十分接近C、C++语言。
小魔女 该用户已被删除
16#
发表于 2015-5-1 16:11:45 | 只看该作者
不过,每次的执行编译后的字节码需要消耗一定的时间,这同时也在一定程度上降低了 Java 程序的运行效率。
小女巫 该用户已被删除
17#
发表于 2015-5-1 21:09:28 | 只看该作者
在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。
不帅 该用户已被删除
18#
发表于 2015-5-4 02:36:33 | 只看该作者
如果你学过HTML,那么事情要好办的多,如果没有,那你快去补一补HTML基础吧。其实JSP中的Java语法也不多,它更象一个脚本语言,有点象ASP。
莫相离 该用户已被删除
19#
发表于 2015-5-12 05:46:37 | 只看该作者
我大二,Java也只学了一年,觉得还是看thinking in java好,有能力的话看英文原版(中文版翻的不怎么好),还能提高英文文档阅读能力。
活着的死人 该用户已被删除
20#
发表于 2015-7-10 15:05:03 | 只看该作者
多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。在 Java 1.5 版本中,Java 又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-29 07:43

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表