很开心,在不怎么熟悉java、Graphics等情况下,折腾了好几天的绘图,终于实现了所希望的绘图效果,期间研究了一下JFreeChart、Servlet好像都比较复杂或者不容易实现,其中(1)JFreeChart感觉是在Graphics或其他类的基础上的再开发,如果所涉及的图形刚好同这个类图中的图形是同一类,使用起来非常方便,但是如果在该类库中找不到同类型的图,那么就无法用这个类库了;(2)Servlet好像比较灵活,但是对它不是太熟悉,数据传入和图形网页显示不是太理想。(3)最后还是Graphics好用啊,刚开始用Graphics生成BufferedImage后,就是无法将这个BufferedImage显示在网页上,即使使用ImageIO.write方法显示在网页上,网页上只能显示这一个图片,而不能显示其他的文本和对象,而通常一个网页上总是有很多文字或数据后再显示一个图片;最后在网上查找了一个帖子,将BufferedImage转换为64位的字节字符串(不知表述是否准确了,参考的帖子在后来的众多浏览网页中被淹没了),然后在jsp页面将这个字符串再转为图像,显示在<img>标识符内,测试一番,完美解决我的问题。
可能还有更好的实现方案,就以后再说了。
主要步骤如下:
Step1. 设计绘图类并获得图形结果(图形结果为字符串的表现形式)
(1)设计java类和绘图方法,该方法中首先定义一个BufferedImage对象,然后利用Graphics类绘制图像;
(2)将图像写到64进制的输出流;
(3)将输出流形成字符串,保存或返回给调用函数;
Step2. 在jsp页面中调用上述图形的字符串,并转换为图形
示例代码如下:
1.类文件MyGraphic
public class MyGraphic(){
public String createGant3() throws IOException{
BufferedImage image=new BufferedImage(500,200,BufferedImage.TYPE_INT_RGB);
Graphics2D g=image.createGraphics();
g.setColor(Color.white);
g.fillRect(0, 0, 500,200);
g.setColor(Color.GREEN);
for(int i=0;i<10;i++){
g.fillRect((int)(5+90*Math.random()), (int)(15*i), (int)(50+300*Math.random()), 10);
}
g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB); //抗文字锯齿
g.setColor(Color.red);
g.setFont(new Font("黑体",Font.BOLD,14));
g.drawString("I and my country 中文", 300, 170);
//下面三行是将缓存图片转换为64进制的字符串,这样可以在jsp页面中调用这个字符串
//重新生成图片
ByteArrayOutputStream bo=new ByteArrayOutputStream();
ImageIO.write(image,"jpeg",bo);
String base64Str=Base64.getEncoder().encodeToString(bo.toByteArray());
g.dispose();
return base64Str;
}
}
2. testImg.jsp页面
<%@page import="org.freeie.common.MyGraphic"%>
<%@page contentType="text/html" pageEncoding="GB2312"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GB2312">
<title>JSP Page</title>
</head>
<body>
<h1>画个图看看</h1>
<%
MyGraphic jg=new MyGraphic();
String str64=jg.createGant3();
%>
<img src="">
<p><font color="#FF0000">图后面显示点文字</font></p>
</body>
</html>
执行jsp页面的结果如下: