用JSP创建可重用的图形背景

js|创建|图形

有一个技术可以在Java Server Pages(JSP)中产生整齐、精细的直方图,它可以用来作为可重用的背景。为了达到可重用性的目的,你需要使得图形的尺寸可以调整,你还应该管理直方块以免它们越过图形区域的边界。然后,你还需要把图形数据编码为一种可用的图形格式。我们将利用这个代码例子介绍本技巧。

你需要什么?

为了开始运行本文所给出的例子,你需要JDK 1.2或者它的更高版本(http://java.sun.com)。你还需要一个支持JSP的Web服务器。我在Tomcat上测试该例子,我用com.sun.image.codec.jpeg 类(在Sun Java 2 SDK中发布)进行图形数据的编码。

可重用的背景

既然你希望拥有可重用的背景,你应该创建一个Java类来管理布局,包括标题区和外部边界。如A所示。

图A

正如你所看到的那样,我在标题区和外部边界上都进行了阴影处理。标题有一个白色的、一个象素宽的边界,图形区有一个细的黑色边界。这些边界增加了阴影的清晰度。

边界很容易产生。用Graphics2D对象的fill()方法来填充一个蓝色的标题矩形,然后用draw()方法用其它颜色画出边界。

产生阴影效果也很简单。首先,用fill()方法画出一个阴影。然后,在偏移七个象素的地方画出标题。这个偏移产生了三维的效果,这样就得到了阴影效果。

举一个例子

假设有一家公司销售农产品,它需要一个直方图来显示销售额。在实际应用场合下,我们需要从一个数据库或者XML文件中获取这些数据,但是为了简单起见,我们假设销售额数据保存在下面的两个数组中:
String datanames[] = {"苹果", "桔子", "桃子", "柠檬", "柚子"};
int datavalues[] = {11, 62, 33, 102, 50};

第一个数组保存该公司出售的各种农产品的项目。第二个数组为对应各农产品的销售额。

准备好直方图

直方图将以JPEG格式显示和保存,所以我们需要正确设置MIME,即内容类型。浏览器利用MIME类型来决定如何做出反应。下面的代码用以设置MIME类型:
response.setContentType("image/jpeg");

接下来,我们需要一个表示该图像的对象。Java 2D API支持BufferedImage类,它提供了一种在内存中保存和管理象素数据的方法。我们希望图形是彩色的,所以使用了TYPE_INT_RGB图形类型。WIDTHHEIGHT这两个整形数据用来以象素为单位指定该图像的宽度和高度:
BufferedImage bi = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);

现在我们有个一个BufferedImage对象,我们可以通过调用该对象的createGraphics()方法来设置Graphics2D的内容:
Graphics2D biContext = bi.createGraphics();

宽度、高度和极大值

创建该图的程序员需要根据该图形的重要程度和页面的整体布局来设置WIDTH参数。图形元素根据图形宽度的改变自动调整自身的大小。

标题的宽度和边界区域,以及图形的最长直方块需要根据WIDTH参数进行计算。这样做的目的是为了确保所有的图形元素都没有超过图形的宽度而越过图形的右边界。

需要显示的数据条目数决定了图形的HEIGHT参数。如果有新的元素添加到datavalues[]datanames[]数组,那么图形的高度就应该对应增长以适应所需显示的区域大小。

maximum参数用于最长直方块。然后,其它直方块的宽度按照相对于maximum的量进行计算:
int barWidth = (innerWIDTH * currentValue) / maximum;

上面的算法用到了maximum和图形的innerWIDTH(图形区域)这两个数值来确保直方块会随着WIDTH数值的改变而自动伸缩。

显示图形背景

为了显示该图形,我们需要创建一个背景图像,然后添加图形数据。首先,创建一个graphBG对象并调用它的draw()方法:
graphBG gr = new graphBG();
gr.draw(biContext, WIDTH, HEIGHT, "Farm Produce", "Overall Average: " + average);

draw()方法的参数包括图形内容、biContext、WIDTHHEIGHTgraphBG类利用它们来决定标题和图形区域的宽度和高度。最后,计算average数据值并添加到标题中显示的文本中。

创建直方块

每个直方块的纵坐标(y轴)位置按照如下公式计算:y_pos = i * displayHeight + headerOffset。其中displayHeight等于直方块上文本的高度加上直方块的高度,headerOffset表示从图形顶端开始的垂直距离,包括标题区域以及阴影的高度。

我用了前面创建标题边界的技术创建了这些直方块以及它们的边界。我把直方块边界的宽度和高度分别减去一个象素,这样每个直方块看起来都有一个红色的边界,并通过在白色背景上画上内边界使得减切效果的产生变得简单起来。

编码

我们已经在内存中建立好了这幅图片,现在我们对它进行编码并把它显示给用户。我们不能用默认得JSP输出流来处理JPEG,所以我们需要利用response.getOutputStream()从响应对象中获取流。我们可以用输出流来创建一个JPEGImageEncoder对象并调用它的encode(),传递我们在前面创建的BufferedImage对象:
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(output);
encoder.encode(bi);

产生的图象相对较小,只占用了13.7千字节的容量。B给出了最终的效果:

图B

无论从那个方面来说,index.jsp的输出都是一个JPEG图像。你可以把它保存到你的桌面上或者按PrintScreen键来抓图。如果你需要在同一页上显示多幅图形或者把图形引入到其它内容中,你可以使用HTML的img标记(<img src = ”index.jsp”>),然后,当需要时放置该图,如利用一个表格。

也许最老的用于动态产生图形的Internet技术之一可以实现处了显示一个图像之外的其它任务。设想你需要记录这副图的浏览人数(类似记录广告点击次数的情况),那么你需要在index.jsp中实现诸如点击计数、数据库或者文件访问之类的任务,你可以在后台处理这些任务而不需要利用缓冲页面切换给用户。

结论

我们在本文之中检验了一种产生整齐、看上去很舒服的直方图。我们巧妙的处理了图形尺寸的改变以及编码为JPEG格式,并且讨论了通过修改HTML代码的方式把最终产生的图片放置在页面的不同位置上。

时间: 2025-01-21 03:41:25

用JSP创建可重用的图形背景的相关文章

用JSP创建可重用的图形背景_JSP编程

有一个技术可以在Java Server Pages(JSP)中产生整齐.精细的直方图,它可以用来作为可重用的背景.为了达到可重用性的目的,你需要使得图形的尺寸可以调整,你还应该管理直方块以免它们越过图形区域的边界.然后,你还需要把图形数据编码为一种可用的图形格式.我们将利用这个代码例子介绍本技巧. 你需要什么? 为了开始运行本文所给出的例子,你需要JDK 1.2或者它的更高版本(http://java.sun.com).你还需要一个支持JSP的Web服务器.我在Tomcat上测试该例子,我用co

在jsp中怎么给文字加背景图片啊

问题描述 在jsp中怎么给文字加背景图片啊 动态生成的菜单 代码如下 function startParentNode(text){ //alert(text); if(""站址管理"" == text){ document.write('<table border=""0"" cellpadding=""1"" cellspacing=""0"&qu

Photoshop中创建多种样式的网格背景图案教程

我在去年夏天写的那篇文章<在Photoshop中创建不规则无缝拼接图案>给大家提供了如何在Photoshop中创建以绿草地为内容的无缝拼接网页图案的方法.今天我再来介绍一下如何在Photoshop中创建网格背景的无缝拼接图案. 关于网页图案 首先需要说明的是,用作页面背景的网页图案一定要简单,效果不能太强烈,只需要提供一点点质感就可以了,要不就抢了页面内容的风头.而实际上页面内容才应该是整个网站的视觉焦点.这种经验我们可以在给手机换壁纸的时候收获到,我们经常是本能的去挑选那些非常漂亮的风景照或

WPS表格2010为表格设置图形背景

在wps表格中我们只能对单元格设置填充颜色而已,效果显然并不是那么漂亮.如果想发让表格更漂亮,最好的效果当然还是用图形做为表格背景了,可惜WPS表格中并没有提供可直接为单元格设置图片填充效果的功能.其实在WPS office 2010个人版的WPS表格中通过在页眉页脚插入图形的方法,我们完全可以轻松地为表格设置图形背景,甚至可以为同一张表格的不同区域设置不同的背景图片. 1.设置背景图 在WPS表格中单击工具栏的"打印预览"图标进入页面视图.再单击"打印预览"工具栏

《C语言接口与实现:创建可重用软件的技术》一导读

前言 C语言接口与实现:创建可重用软件的技术 如今的程序员忙于应付大量关于API(Application Programming Interface)的信息.但是,大多数程序员都会在其所写的几乎每一个应用程序中使用API并实现API的库,只有少数程序员会创建或发布新的能广泛应用的API.事实上,程序员似乎更喜欢使用自己搞的东西,而不愿意查找能满足他们要求的程序库,这或许是因为写特定应用程序的代码要比设计可广泛使用的API容易. 不好意思,我也未能免俗:lcc(我和Chris Fraser为ANS

ITEXT实例学习与研究(二) 之 创建一个细长的浅黄色背景的页面以及纵向页面与横向页面之间的切换

iTextSharp.text.Document-object共有三个构造函数: public Document(); public Document(Rectangle pageSize); public Document(Rectangle pageSize, int marginLeft, int marginRight, int marginTop, int marginBottom); 第一个构造函数以A4页面作为参数调用第二个构造函数,第二个构造函数以每边36磅页边距为参数调用第三个

Pro JavaScript Techniques第三章: 创建可重用的代码

 Pro JavaScript Techniques第三章: 创建可重用的代码 mozart0 [楼主] 匪徒田老大 版主 帖子 2326体力 6628 威望 177 注册 2003-6-18 #1 发表于 2007-4-8 12:46  资料  短消息  加为好友  Pro Javascript Techniques翻译连载:说明和目录 当与其它程序员共同开发代码时(这里对大多数合作或团队项目来说是很常见的),为了保持你们的清醒而维护良好的编程惯例将会变得极其重要.随着近年来JavaScrip

jquery实现动画菜单的左右滚动、渐变及图形背景滚动等效果_jquery

本文实例讲述了jquery实现动画菜单的左右滚动.渐变及图形背景滚动等效果.分享给大家供大家参考.具体如下: 这里演示基于jquery实现的动画菜单,内含四种效果的网站菜单,第一种是不带效果的传统导航菜单,第二种是带有图形滚动背景的菜单,第三种是由右向左背景滚动的菜单,第四种则是背景色渐变的网站菜单,每一种都很精彩,喜欢Js菜单的可模仿借鉴一下. 运行效果截图如下: 在线演示地址如下: http://demo.jb51.net/js/2015/jquery-flash-style-cha-men

《C语言接口与实现:创建可重用软件的技术》一第1章 引言1.1 文学程序

第1章 引言 C语言接口与实现:创建可重用软件的技术 一个大程序由许多小的模块组成.这些模块提供了程序中使用的函数.过程和数据结构.理想情况下,这些模块中大部分都是现成的并且来自于库,只有那些特定于现有应用程序的模块需要从头开始编写.假定库代码已经全面测试过,而只有应用程序相关的代码会包含bug,那么调试就可以仅限于这部分代码. 遗憾的是,这种理论上的理想情况实际上很少出现.大多数程序都是从头开始编写,它们只对最低层次的功能使用库,如I/O和内存管理.即使对于此类底层组件,程序员也经常编写特定于