仓酷云

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

[学习教程] JAVA教程之调优servlet和JSP的程序功能

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

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

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

x
从一个编程语言的普及程度来将,一个好的IDE是至关中要的,而现在的java的IDE虽然已经很好了,但是和.net比起来还是稍微差一些的,这是个客观事实。java要想普及的更好。DE是必须加以改进的。本文报告了调剂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页面唆使符来克制它:
  不要在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唆使符()。2、利用jsp唆使符()。在实践中我发明,假如利用第一种办法的话,可使得体系功能更高。
  办法7:准确地断定javabean的性命周期
  JSP的一个壮大的中央就是对javabean的撑持。经由过程在JSP页面中利用标签,能够将javabean间接拔出到一个JSP页面中。它的利用办法以下:
  个中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之争)决意了你的使用程序的功能,主要是你要对这类平台有一个较为深切的懂得,如许你才干从基本上对本人的使用程序做一个优化!

如果你学习的是市场营销,是销售,也许参加大课堂的学习会更合适,因为你的工作能力中有个基础就是搭建自己的人脉,
admin 该用户已被删除
沙发
发表于 2015-1-19 22:51:08 | 只看该作者
吧,现在很流行的Structs就是它的一种实现方式,不过Structs用起来实在是很繁,我们只要学习其精髓即可,我们完全可以设计自己的MVC结构。然后你再研究一下软件Refactoring (重构)和极限XP编程,相信你又会上一个台阶。 做完这些,你不如整理一下你的Java代码,把那些经典的程序和常见的应用整理出来,再精心打造一番,提高其重用性和可扩展性。你再找几个志同道合的朋友成立一个工作室吧
海妖 该用户已被删除
板凳
发表于 2015-1-23 07:08:31 | 只看该作者
是一种将安全性(Security)列为第一优先考虑的语言
变相怪杰 该用户已被删除
地板
发表于 2015-1-31 15:20:30 | 只看该作者
Jive的资料在很多网站上都有,大家可以找来研究一下。相信你读完代码后,会有脱胎换骨的感觉。遗憾的是Jive从2.5以后就不再无条件的开放源代码,同时有licence限制。不过幸好还有中国一流的Java程序员关注它,外国人不开源了,中国人就不能开源吗?这里向大家推荐一个汉化的Jive版本—J道。Jive(J道版)是由中国Java界大名 鼎鼎的banq在Jive 2.1版本基础上改编而成, 全中文,增加了一些实用功能,如贴图,用户头像和用户资料查询等,而且有一个开发团队在不断升级。你可以访问banq的网站
精灵巫婆 该用户已被删除
5#
发表于 2015-2-6 19:52:38 | 只看该作者
你一定会高兴地说,哈哈,原来成为Java高手就这么简单啊!记得Tomjava也曾碰到过一个项目经理,号称Java很简单,只要三个月就可以学会。
愤怒的大鸟 该用户已被删除
6#
发表于 2015-2-18 11:43:01 | 只看该作者
设计模式是高级程序员真正掌握面向对象核心思想的必修课。设计模式并不是一种具体"技术",它讲述的是思想,它不仅仅展示了接口或抽象类在实际案例中的灵活应用和智慧
小女巫 该用户已被删除
7#
发表于 2015-3-6 04:59:51 | 只看该作者
科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。
莫相离 该用户已被删除
8#
发表于 2015-3-12 20:53:50 | 只看该作者
关于设计模式的资料,还是向大家推荐banq的网站 [url]http://www.jdon.com/[/url],他把GOF的23种模式以通俗易懂的方式诠释出来,纯Java描述,真是经典中的经典。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-5-10 22:16

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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