若天明 发表于 2015-1-18 11:35:22

JAVA教程之把持静态servlet图形处置(2)

因为能用到多少功能就用多少,不能用就不用!总的来说:要简单要性能好,可以不用框架。你说java复杂,就是因为你把java(j2ee)与这些框架混在了一起。servlet|静态|把持|图形编写定制JSP标志

既然分明了Web服务器是怎样处置JSP页面哀求的,那末让我们研讨一下怎样完成定制JSP标志。注:JSP标志既来自尺度库(如JavaStandardTemplateLibrary,JSTL),也来自您本人编写的库(也称为定制标志)。一般,定制标志处置特别的成绩范畴。对本文而言,我们在处置怎样办理图象。今朝,Java2ExtendedEdition(J2EE)V1.2和V1.3利用JSP标准V1.2。在写作本文的时分,Sun已公布了JSP标准V2.0。这个新标准并未对完成定制标志的办法举行严重变动。

经由过程taglib伪指令,能够将尺度和定制标志库导进JSP页面,以下所示:

<%@tagliburi=imagesizer.tldprefix=util%>

这个伪指令指定了标志库形貌符文件的地位,这里指定的是imagesizer.tld,还指定了在页面中利用它时的前缀,这里指定的是util。如后面的标志示例所示,将标志与其前缀及其称号一同利用:

<util:imagesizersrc="http://www.163design.net/j/f/images/LazyDog.jpg"/>

标志库形貌符告知Web容器哪些标志是可用的,和它们怎样发扬感化。清单1显现了如许一个示例。文件利用了XML格局,而且易于读取,而使用程序开辟平台―如IBMWebSphereStudioApplicationDeveloper(ApplicationDeveloper)能够匡助您添补字段,而且考证文件。最主要的信息是tag元素:它界说了定制JSP标志的称号和完成标志的Java类。它还显现了标志承受的任何属性和主体内容。

清单1.标志库形貌符(TagLibraryDescriptor,TLD)摘录

<taglib><tlibversion>1.0</tlibversion><jspversion>1.1</jspversion><tag><name>imagesizer</name><tagclass>tags.ImageSizerTag</tagclass><bodycontent>empty</bodycontent><attribute><name>src</name><required>required</required></attribute><attribute><name>alt</name></attribute><attribute><name>quality</name></attribute></tag></taglib>

在这个示例中,tag有三个属性,个中只要src属性是必须的。可选的alt属性摹拟HTML的imgalt属性。作为实习,您能够扩大该JSP标志以包括别的可选的img属性。(约莫有12种这些属性。)最初,完成供应了一个可选的quality属性,以使页面编写职员能够把持已从头调剂巨细的图象的颗粒度和巨细。
编写定制JSP标志的下一步是完成标志的Java代码。在本文中,标志imagesizer是在tags.ImageSizerTagJava类中完成的。年夜多半J2EE定制标志撑持都位于javax.servlet.jsp.tagext包中。imagesizer类承继了尺度的TagSupport,后者完成不带主体的标志。TagSupport的子代类是BodyTagSupport,它也完成标志,而且带有主体。这两个类际迪至?Tag接口,个中,当第一次读取标志和当Web容器完整读取标志后再次读取标志时,会挪用doStartTag和doEndTag办法。ImageSizer标志只完成了doEndTag,由于一旦一切属性信息都可用时,它必要起感化。

在TagSupport类中,PageContext类供应了对有关JSP页面的主要信息的会见。比方,PageContext供应了对HttpRequest和HttpResponse对象的会见。这些对象关于读取表单值和写呼应是相当主要的。假如您但愿跟踪用户的首选项,而且将表单值从一个页面传送到另外一个页面,该哀求还供应了对HttpSession的会见。PageContext还供应了对ServletContext的会见,后者有助于您查找servlet的路径、称号和别的信息。在ImageSizer代码中(如清单2所示),有很多对PageContext对象及其供应信息的援用。显现了这些类的干系。就象任何尺度类图一样,实心框代表类,而虚线框代表接口。用从派生的类或接口到其父类或接口的一条线来暗示承继。

清单2.ImageSizerTagdoEndTag完成

//Implementthetagoncethecompletetaghasbeenread.publicintdoEndTag()throwsJspException{//Moverequestdatatosession.intoutputSize=0;StringsizeVal=request.getParameter(REQUESTSIZEKEY);if(sizeVal!=null){session.setAttribute(REQUESTSIZEKEY,sizeVal);sizeVal=(String)session.getAttribute(REQUESTSIZEKEY);if(sizeVal!=null){outputSize=Integer.parseInt(sizeVal);}}//Getspecifiedimagelocally.StringcontextPath=getContextPath(request);Imageimage=Toolkit.getDefaultToolkit().getImage(contextPath+src);ImageSizer.waitForImage(image);intimageWidth=image.getWidth(null);intimageHeight=image.getHeight(null);if((imageWidth>0)&&(imageHeight>0)){if((outputSize>0)&&(outputSize!=imageWidth)){//Convertimagetonewsize.ImageoutputImage=ImageSizer.setSize(image,outputSize,-1);ImageSizer.waitForImage(outputImage);intoutputWidth=outputImage.getWidth(null);intoutputHeight=outputImage.getHeight(null);if(outputWidth>0&&outputHeight>0){//Changeimagefilenametoxxxx.size.jpgStringoriginalSrc=src;intlastDot=src.lastIndexOf(.);if(lastDot>-1){src=src.substring(0,lastDot+1);}setSrc(src+outputSize+".jpg");//WritenewsizeimagetoJPEGfile.Filefile=newFile(contextPath+src);if(!file.exists()){out.println("");FileOutputStreamfos=newFileOutputStream(contextPath+src);ImageSizer.encodeJPEG(fos,outputImage,quality);fos.close();}imageWidth=outputWidth;imageHeight=outputHeight;}}//ifoutputSize}//ifimagefound//Produceoutputtag.out.print("<imgsrc=""+src+""");//Addalttext,ifanyif((alt!=null)&&(alt.length()>0)){out.print("alt=""+alt+""");}//Addproperwidth,height.out.print("width=""+imageWidth+""height=""+imageHeight+""");out.println(">");returnEVAL_PAGE;}//doEndTag




<br>


.主要的javax.servlet.jsp.tagext类

清单2显现了ImageSizerTag类的doEndTag办法。这几近是完成定制JSP标志所需的全体Java代码。它是一年夜段代码,可是它将有助于您的了解,以便周全地懂得该办法。起首,任何HTTP哀求参数都保留在HTTP会话中。该哀求带有一个属性,如关于图象巨细的用户首选项,并将其保留在会话中,以便它能够跟从用户从一个页面到另外一个页面。要扩大该标志的功效,能够扩大它,使之可将用户首选项保留在cookie中,如许用户下一次会见站点时便可利用其首选项。

下一步是装进缺省图象,JSP页面利用它来作为基图,一切别的图象都依据基图来调剂巨细。这里,java.awt.Toolkit哀求图象,图象是用ImageSizer.waitForImage装进的,并对其举行了反省,以懂得其是不是举行了准确的缩放。必要举行装进停息,由于Java图象是异步装进的,当哀求它们时并不是一直完整可用。在本示例中,ImageSizer帮助类实行全部图象处置操纵,下一节将对此做进一步先容。假如宽和高婚配,则不必从头调剂图象巨细,并将跳过if这一年夜块代码,并且利用图象称号和以后巨细编写HTML图象标志。这就是JSP完成摹拟HTML图象标志所需做的全体事情。

假如用户哀求新的图象巨细,那末ImageSizer帮助类会从头调剂图象的巨细。利用文件巨细给图象文件指定新的称号,文件是JPEG编码的,并写到文件体系。接着,将在HTML图象标志输入中利用方才从头调剂巨细的文件。该标志的备用完成大概会将文件保留为GIF或PNG格局,大概乃至会经由过程内存来供应图象以节俭磁盘空间。可是,清单2将从头调剂巨细的文件高速缓存到了磁盘,以备未来利用。因而,第一次从头调剂巨细时必要消费一些服务器处置工夫,可是随后对图象巨细举行哀求时基本不必要处置。该示例的扩大大概会反省可用的磁盘空间,以便于匡助均衡无限的文件空间与您但愿供应给客户机的立即信息之间的折中。


调剂图象巨细

前一节研讨了编写定制JSP标志的步骤。ImageSizerTag类会主动从头调剂图象的巨细以婚配用户的首选项。这一节供应了有关您能够怎样利用ImageSizer类来从头调剂图象巨细并将其保留为JPEG文件的更多具体信息。使用java.awt.Image类中的getScaledInstance办法,很简单在Java代码中从头调剂图象的巨细。使用新的宽和高挪用这个办法,大概为某个参数供应一个值-1以坚持纵横比,您能够失掉新的从头调剂过巨细的图象。可是,就象任何Java图象一样,该图象并非当即可用的,因而您必需利用java.awt.MediaTracker以守候图象完整装进。ImageSizer的waitForImage办法封装了该代码。

在该示例中,最难的计划点在于决意怎样保留图象。用Java编程编码和保留图象有良多选择,一切选择都有分歧的衡量。

com.sun.image.codec。该包在Java2SDK1.2和1.3完成中是可用的,但它在公有(private)包中,在未来的Java2版本中这大概会产生变更。该包只限于JPEG编码。

JavaImageI/OAPI。在Java2SDK1.4中,该包是大众的和尺度的。可是,在撰写本文时,还没有利用SDK1.4的J2EE版本。该包供应了优秀的图象操纵功效和编码选项。

Java初级映象API(JavaAdvancedImagingAPI)。这个API是一个尺度扩大,可是利用它必要安装包―您的Web办理员大概不撑持该事情。

ACMEGIF编码器(ACMEGIFEncoder)。该软件及很多别的第三方图象包很有效,您能够将它们兼并在示例代码中,可是有个用度和可保护性的成绩。同别的选择分歧,该软件不是收费的,而且不完整撑持GIF尺度。

关于清单3,我们利用com.sun.image.codec包,由于它在一切J2EE1.2和1.3Web服务器容器(如IBMWebSphere和ApacheTomcat)中都可用。编码器很复杂,而且是100%纯Java代码,可是它们是com.sun包中的。可是,从久远思索,JavaImageI/O包多是开展的偏向。在图象转换特征和保留为多种文件格局的才能方面,它对照壮大。直到Java2V1.4时JavaImageI/O包才会成为尺度。

既然已决意了利用哪一个图象处置包,那末保留JPEG文件的代码就相称复杂了。ImageSizer的encodeJPEG办法封装了这个历程:

java.awt.image.BufferedImage对象,这是一个加强的JavaImage子代,是从从头调剂过巨细的输入图象创立的。正文在代码中标了然一个地位,能够在这里扩大示例以将徽标、水印、工夫戳记或版权信息增加到图象。

在将Image转换为BufferedImage以后,在输入流上创立一个JPEGImageEncoder对象。输入编码质量的局限从0.0(最差)到1.0(最好)。缺省值是0.75,但0.95将天生较年夜的文件巨细,它带有更具体的图象。作为该示例的扩大,您能够思索由图象巨细来决意质量―较小的图象必要较高的质量设置,而较年夜的图象必要较低的设置。

将图象编码到输入流,并对该流举行革新以确保一切信息都显现在图象文件中。

清单3.ImageSizerencodeJPEG完成

//Encodesthegivenimageatthegiven//qualitytotheoutputstream.publicstaticvoidencodeJPEG(OutputStreamoutputStream,ImageoutputImage,floatoutputQuality)throwsjava.io.IOException{//Getabufferedimagefromtheimage.BufferedImagebi=newBufferedImage(outputWidth,outputHeight,BufferedImage.TYPE_INT_RGB);Graphics2DbiContext=bi.createGraphics();biContext.drawImage(outputImage,0,0,null);//Additionaldrawingcode,suchas//watermarksorlogoscanbeplacedhere.//com.sun.image.codec.jpegpackage//isincludedinSunandIBMsdk1.3.JPEGImageEncoderencoder=JPEGCodec.createJPEGEncoder(outputStream);//Thedefaultqualityis0.75.JPEGEncodeParamjep=JPEGCodec.getDefaultJPEGEncodeParam(bi);jep.setQuality(outputQuality,true);encoder.encode(bi,jep);outputStream.flush();}//encodeImage

那就是从头调剂图象巨细及保留图象所需的全体。

打包并部署到WebSphere或Tomcat上

本节将论述怎样打包ImageSizerJSP标志并将其部署到ApplicationServerV4.0或ApacheTomcatV4.0上。显现了ApplicationDeveloper的抓屏。左上栏的Navigator窗格(windowpane)显现了Web使用程序的目次布局,和必需怎样依据J2EE标准打包定制JSP标志。因为J2EE标准的必要,因而该目次布局关于一切Web使用程序都是大众的。一旦回档了该布局,则它将成为Web回档(WAR)文件,而且能够便利地将其传送给WebSphere、Tomcat或任何别的兼容的Web容器。优秀的开辟情况(如ApplicationDeveloper)有助于开辟职员遵守这些标准,并天生无效的使用程序。



<br>


.在WebSphereStudioApplicationDeveloper中打包ImageSizer

在ImageSizer项面前目今,有一个源代码目次;开辟职员能够选择是不是在终极的WAR文件中包括该目次。webApplication目次包括实践的程序代码。示例项目包括名为PickASize.jsp的测试JSP页面及称为LazyDog.jpg的伟大的测试图象。一般,ImageSizer定制标志的库版本其实不包括这些。标志的完成位于WEB-INF目次中。Java类都位于WEB-INF/classes中,而标志库形貌符(TagLibraryDescriptor)文件位于WEB-INF/tlds中。这些是一切Web使用程序的尺度目次结构。该树中的别的文件有助于设置服务器选项,但却并不是WAR文件强迫必要的。利用ApplicationDeveloper或JavaSDK以创立该使用程序的WAR文件。

要将Web使用程序部署在WebApplicationServer(如Tomcat)上,则将文件放在ROOT/webapps目次中,而且让服务器将WAR文件睁开为目次布局。关于ApplicationServer,您可使用AdministratorsConsole中的WebApplication导游来安装使用程序。部署终了,可经由过程会见http://yourhostname:port/ImageSizer/PickASize.jsp运转JSP页面。


停止语

如今您已创立了主动办理图象缩放的JSP定制标志。定制标志为您省往了从头调剂图象巨细的事情,还利用户在会见您的网站时能够指定本人的首选项。能够很便利地扩大该示例标志以实行各类图象操纵:版权文本、工夫戳记、徽标或水印。经由过程将代码部署到ApplicationServer或ApacheTomcat,而且编写一些基于图象的JSP页面或利用给定的示例,您能够实验代码。但愿本文为您供应了“掏出便可用”的JSP标志,还供应了能使您进一步扩大功效以满意您必要的代码。愿您看图兴奋!


进而能拉拢大多数程序员用windows产品。并且从ASP.NETAJAX可以跨平台这一点上,间接证明了我们的推断,至少证明了微软做过这方面的研究。所以如果哪一天突然听说了.net可以跨平台了,那么请不要吃惊,如果这一天真的到来,java就到了真正和.net决战的时刻。因为不到万不得以的时候微软是不会推出跨平台的.net的,如果跨平台的.net还不足以对抗java的话,那么微软还剩的手段就是开源了,呵呵。

小魔女 发表于 2015-1-21 10:37:29

是一种使网页(Web Page)由静态(Static)转变为动态(Dynamic)的语言

第二个灵魂 发表于 2015-1-22 07:30:32

你现在最缺的是实际的工作经验,而不是书本上那些凭空想出来的程序。

再现理想 发表于 2015-1-30 23:45:06

如果你学过HTML,那么事情要好办的多,如果没有,那你快去补一补HTML基础吧。其实JSP中的Java语法也不多,它更象一个脚本语言,有点象ASP。

不帅 发表于 2015-2-8 07:18:59

Java 不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将源代码编译成二进制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码。从而实现了“一次编译、到处执行”的跨平台特性。

分手快乐 发表于 2015-2-11 04:45:36

如果你学过HTML,那么事情要好办的多,如果没有,那你快去补一补HTML基础吧。其实JSP中的Java语法也不多,它更象一个脚本语言,有点象ASP。

小女巫 发表于 2015-2-25 17:16:37

吧,现在很流行的Structs就是它的一种实现方式,不过Structs用起来实在是很繁,我们只要学习其精髓即可,我们完全可以设计自己的MVC结构。然后你再研究一下软件Refactoring (重构)和极限XP编程,相信你又会上一个台阶。 做完这些,你不如整理一下你的Java代码,把那些经典的程序和常见的应用整理出来,再精心打造一番,提高其重用性和可扩展性。你再找几个志同道合的朋友成立一个工作室吧

柔情似水 发表于 2015-3-6 18:27:02

那么我书也看了,程序也做了,别人问我的问题我都能解决了,是不是就成为高手了呢?当然没那么简单,这只是万里长征走完了第一步。不信?那你出去接一个项目,你知道怎么下手吗,你知道怎么设计吗,你知道怎么组织人员进行开发吗?你现在脑子里除了一些散乱的代码之外,可能再没有别的东西了吧!

山那边是海 发表于 2015-3-11 16:20:13

Jive的资料在很多网站上都有,大家可以找来研究一下。相信你读完代码后,会有脱胎换骨的感觉。遗憾的是Jive从2.5以后就不再无条件的开放源代码,同时有licence限制。不过幸好还有中国一流的Java程序员关注它,外国人不开源了,中国人就不能开源吗?这里向大家推荐一个汉化的Jive版本—J道。Jive(J道版)是由中国Java界大名 鼎鼎的banq在Jive 2.1版本基础上改编而成, 全中文,增加了一些实用功能,如贴图,用户头像和用户资料查询等,而且有一个开发团队在不断升级。你可以访问banq的网站

莫相离 发表于 2015-3-19 01:03:59

设计模式是高级程序员真正掌握面向对象核心思想的必修课。设计模式并不是一种具体"技术",它讲述的是思想,它不仅仅展示了接口或抽象类在实际案例中的灵活应用和智慧

冷月葬花魂 发表于 2015-3-22 05:09:23

Java是一个纯的面向对象的程序设计语言,它继承了 C++语言面向对象技术的核心。Java舍弃了C ++语言中容易引起错误的指针(以引用取代)、运算符重载(operator overloading)

若相依 发表于 2015-3-25 21:01:20

Pet Store.(宠物店)是SUN公司为了演示其J2EE编程规范而推出的开放源码的程序,应该很具有权威性,想学J2EE和EJB的朋友不要 错过了。

灵魂腐蚀 发表于 2015-4-2 11:50:28

是一种简化的C++语言 是一种安全的语言,具有阻绝计算机病毒传输的功能

透明 发表于 2015-4-21 20:45:30

科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。

若天明 发表于 2015-4-22 17:46:22

至于JDBC,就不用我多说了,你如果用java编过存取数据库的程序,就应该很熟悉。还有,如果你要用Java编发送电子邮件的程序,你就得看看Javamail 了。

只想知道 发表于 2015-4-26 03:11:31

Java是一个纯的面向对象的程序设计语言,它继承了 C++语言面向对象技术的核心。Java舍弃了C ++语言中容易引起错误的指针(以引用取代)、运算符重载(operator overloading)

海妖 发表于 2015-4-26 21:12:00

你就该学一学Servlet了。Servlet就是服务器端小程序,他负责生成发送给客户端的HTML文件。JSP在执行时,也是先转换成Servlet再运行的。虽说JSP理论上可以完全取代Servlet,这也是SUN推出JSP的本意,可是Servlet用来控制流程跳转还是挺方便的,也令程序更清晰。接下来你应该学习一下Javabean了,可能你早就看不管JSP在HTML中嵌Java代码的混乱方式了,这种方式跟ASP又有什么区别呢?

蒙在股里 发表于 2015-4-28 06:40:42

是一种突破用户端机器环境和CPU

简单生活 发表于 2015-6-16 20:27:26

还好,SUN提供了Javabean可以把你的JSP中的 Java代码封装起来,便于调用也便于重用。
页: [1]
查看完整版本: JAVA教程之把持静态servlet图形处置(2)