Servlets 使用imageio java 1.5 update 22在servlet上显示图像
我有一个在servlet上使用imageio显示图像的Web应用程序。当使用jre 1.6托管在Tomcat7中时,webapp工作正常。但同样的webapp在部署到带有Servlet2.4和Jre 1.5的Tomcat5.5上时不起作用。为了访问该图像,我将标识符作为参数传递,然后得到该图像,它是DB中的blob列。最初,我使用eclipse在Tomcat7实例上开发了该应用程序,效果很好。编译器版本兼容性选择为1.5,动态web模块版本选择为2.4。在下面的代码中,我检查了jdbc连接,它工作正常,我可以显示文本信息。此外,我还通过检查null来分别检查BuffereImage是否有一些数据,它似乎有数据。但是servlet根本无法显示图像,我最终得到一个空白屏幕 在Tomcat7上工作 [http://localhost:8081/testimage/ReturnImage?code=AUS] 在tomcat 5.5上不起作用 [http://localhost:8080/testimage/ReturnImage?code=AUS] servlet只为后者显示一个空白屏幕。 下面是我的servlet的代码Servlets 使用imageio java 1.5 update 22在servlet上显示图像,servlets,javax.imageio,tomcat5.5,Servlets,Javax.imageio,Tomcat5.5,我有一个在servlet上使用imageio显示图像的Web应用程序。当使用jre 1.6托管在Tomcat7中时,webapp工作正常。但同样的webapp在部署到带有Servlet2.4和Jre 1.5的Tomcat5.5上时不起作用。为了访问该图像,我将标识符作为参数传递,然后得到该图像,它是DB中的blob列。最初,我使用eclipse在Tomcat7实例上开发了该应用程序,效果很好。编译器版本兼容性选择为1.5,动态web模块版本选择为2.4。在下面的代码中,我检查了jdbc连接,它工
package flags;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.sql.*;
import java.awt.image.BufferedImage;
public class ReturnImage extends HttpServlet {
private static final long serialVersionUID = 1L;
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//PrintWriter out = response.getWriter();
// OutputStream outimg = response.getOutputStream();
try {
Class.forName("com.mysql.jdbc.Driver");
Connection connection = DriverManager.getConnection(
"jdbc:mysql://192.168.2.2:3306/world", "root", "abcdef");
//out.println("Connecting to database <br>");
Statement statement = connection.createStatement();
String param;
param = request.getParameter("code");
String sql = "Select Name,Flag,Code from world.Country where Code='"+ param + "'";
ResultSet res = statement.executeQuery(sql);
while (res.next()) {
String Name = res.getString("Name");
String Code = res.getString("Code");
BufferedImage image = javax.imageio.ImageIO.read(res.getBlob("Flag").getBinaryStream());
//out.println(System.getProperty("java.runtime.version"));
//out.println(Code + " ");
//out.println(Name + "<br>");
if (image == null) {
//out.println("null image");
}
ImageIO.write(image, "gif", outimg);
outimg.close();
}
res.close();
statement.close();
connection.close();
} catch (SQLException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
}
包标志;
导入java.io.IOException;
导入java.io.OutputStream;
导入java.io.PrintWriter;
导入javax.imageio.imageio;
导入javax.servlet.ServletException;
导入javax.servlet.http.HttpServlet;
导入javax.servlet.http.HttpServletRequest;
导入javax.servlet.http.HttpServletResponse;
导入java.sql.*;
导入java.awt.image.buffereImage;
公共类ReturnImage扩展了HttpServlet{
私有静态最终长serialVersionUID=1L;
public void doGet(HttpServletRequest请求、HttpServletResponse响应)
抛出ServletException、IOException{
//PrintWriter out=response.getWriter();
//OutputStream outimg=response.getOutputStream();
试一试{
Class.forName(“com.mysql.jdbc.Driver”);
Connection Connection=DriverManager.getConnection(
“jdbc:mysql://192.168.2.2:3306/world“,”根“,”abcdef”);
//out.println(“连接到数据库
”;
语句Statement=connection.createStatement();
字符串参数;
param=request.getParameter(“代码”);
String sql=“从世界各地选择名称、标志、代码,其中代码=”+param+“”;
ResultSet res=statement.executeQuery(sql);
while(res.next()){
字符串名称=res.getString(“名称”);
字符串代码=res.getString(“代码”);
buffereImage image=javax.imageio.imageio.read(res.getBlob(“Flag”).getBinaryStream());
//println(System.getProperty(“java.runtime.version”);
//out.println(代码+“”);
//out.println(名称+“
”);
if(image==null){
//out.println(“空图像”);
}
写入(图像,“gif”,输出图像);
outimg.close();
}
res.close();
语句。close();
connection.close();
}捕获(SQLE异常){
e、 printStackTrace();
}捕获(例外e){
e、 printStackTrace();
}
}
}
显示两个不同tomcat实例中的servlet输出。Tomcat5.5使用JDK1.5,Tomcat7使用JDK1.6,您可能需要正确设置setContentType(正如您目前所做的那样) 但是,您是否尝试过使用不同的格式,如PNG(当然,使用“image/PNG”作为内容类型)?由于过去的LZW许可问题,我不确定Java1.5是否有GIF编写器。请注意,ImageIO.write方法有一个布尔返回类型,用于检查是否写入了任何内容。在任何情况下,PNG都应该始终有效
PS:除非您计划在servlet中修改图像,否则以正确的格式将图像存储在blob中,并将其传递给客户端而无需对其进行解码/编码,当然要快得多。I添加了response.setContentType(“image/gif”);但我现在看到的只是一个有十字架的盒子,我尝试将Tomcat5.5的JVM重新写入jre 1.6的客户机JVM.dll,现在可以显示图像了。如何在不向新版本报告的情况下修复此问题。我问这个问题是因为我不能在生产框上修改任何这样的设置。较旧的JRE已经有了所需的库,那么到底是什么失败了呢。请帮忙!!!你为什么要首先对图像进行解码和编码?您是否计划使用它进行任何图像处理,添加元数据、水印或类似内容?为什么不直接将blob和适当的内容类型一起流式传输呢?嗨,Harald,非常感谢你的回答。我发现,对于Jre 1.5,ImageIO.write的布尔输出为false,而javadoc表示,如果找不到合适的writer,它将返回false。因为我正在将GIF图像写回outputstream,所以失败了。然后我试着将我所有的GIF输出为jpeg格式,并正确显示。我唯一想知道的是转换是否总是正确的,我只测试了10-20个样本。另外,您能给我一些建议吗?如果没有BuffereImage,我如何将InputStream直接传递到outputstream?不客气。但是你问了这个问题,所以你必须把它标记为已回答。请做!有关如何将输入复制到输出,请参见本文中的代码示例。我的信誉点似乎不足以将答案标记为有用:-)有关详细信息,请参见此