上次问问题没人回答!这次再问一个难点的---Servlet可否同时输出图象流和HTML文本? 一个servlet输出图像,另一个servlet输出HTML文本,<img src="servlet_a?id=xxx"> 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 用servlet输出图像不一定要先存成文件的,你可以直接这样<img src="/ImageOutputServet">即可。 以sharetop(天生不笨)的sample来说,ImageOutputServet是另一个Servlet.此Servlet的输出mime type是jpg.还有一个Servlet用来输出html,其中包括<img src="/ImageOutputServet">.这样就可以了。 不明白问题的根本!一次http请求到底能不能同时输出html文本和图片,我认为是不行的,因为对于http来说,那根本就是两次请求!不知道我说的对不对! To jintooth,sharetop(天生不笨),object_cat(面向对象的猫),fengyuxi :你们说的不错,可能是我没有把问题说清楚。我的程序采用MVC的Struts构架,所以整个应用程序只有1个Servlet就是ActionServlet,负责控制路由HTTP请求到其他对象(例如JSP页面或开发者实现的org.apache.struts.action.Action的子类)。Action类的目的就是通过perform()方法来处理用户请求,并返回一个ActionForward对象转向到一个JSP。如下:public ActionForward perform(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException;现在我在这个Action子类里面 调用JPEGEncoder.encode( pieChart2D, 1.0f, response );绘制饼图;JPEGEncoder类接收pieChart2D参数,并负责将response再包装成图象输出流到客户端。所以在JPEGEncoder的encode方法返回的时候实际上输出流已经关闭了,用的是同一个response,而且正如上面所说的,只有1个Servlet是控制所有请求分发的。这样要实现图文混合输出又该如何处理呢? 是同一个servlet没关系,但是一定是两次请求,多次请求每个img分别是一次请求 MainServlet.java://仅输出html/textout.println("<html>");out.println("这是动态输出的图片<img src='/ImgServlet'>");out.println("</html>");ImgServlet.java://仅输出Img用输出流动态输出Img//其实楼上的各位已经说得很详细了 怎么 输出图象啊,我这为什么不行?想从oracle中读出一blob字段,数据库中共一条记录 id 1 pic blob (一个图片) isize 368(图象大小)在jsp中想显示出图片,可报错An error occurs : java.lang.IllegalStateException 为何?源代码如下:<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head> <title>Untitled</title></head><body><%@ page language="java" import="java.sql.*,java.util.*"%><% String image_id = "1"; if (image_id != null) { try { Class.forName("oracle.jdbc.driver.OracleDriver"); Connection con = DriverManager.getConnection("java:oracle:thin:@srv:1521:srv","yp","yp"); Statement stmt = con.createStatement(); String sql="SELECT id,pic,isize FROM my_blob_table WHERE ID ='1'"; ResultSet rs = stmt.executeQuery(sql); if (rs.next()) { //out.println(rs.getString("id")); String dim_image = rs.getString("isize"); // out.println(dim_image); byte [] blocco = rs.getBytes("pic"); response.setContentType("image/jpeg"); ServletOutputStream op = response.getOutputStream(); for(int i=0;i<Integer.parseInt(dim_image);i++) //for(int i=0;i<blocco.length;i++) { // op.write(i); op.write(blocco[i]); } } else { out.println("no record!"); } rs.close(); stmt.close(); con.close(); } catch(Exception e) { out.println("An error occurs : " + e.toString()); } }%></body></html> 我还是认为servlet再一次请求中不可能同时输出图片和文字。如果用一个servlet来实现,只能在servlet接收到请求的时候来判断一下本次请求是要求显示一个图片还是请求一个html页面。servlet输出图片我倒是可以给一个类出来!这个类用来显示一个人的图片,在oracle中,photo是一个blob字段,关键字是人的编号“id”。在html中使用<img src="EMPShowPhoto?selectedid=12345678">来调用!“12345678”是指一个人的编号。应该能看懂吧!import java.io.*;import java.sql.*;import java.util.*;import javax.servlet.*;import javax.servlet.http.*;import javax.sql.*;import oracle.jdbc.driver.*;import oracle.jdbc.pool.OracleDataSource;import oracle.sql.*;import com.neubitco.jnpc.pa.util.*;public class EMPShowPhoto extends HttpServlet { Connection connection = null; Statement statement = null; public void init(ServletConfig config) throws ServletException { super.init(config); try { } catch(Exception e) { } } public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String strID = request.getParameter("selectedkey"); //连接数据库 try { //获得数据库连接 connection = DBConnection.getConnection(); connection.setAutoCommit(true); //获得基本数据库执行语句 statement = connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); } catch(Exception e) { disconnectDB(); return; } //执行查询 String strSQLQuery = "select photo from pa_emp_employee where id='" + strID + "'"; ResultSet rsQuery = null; try { rsQuery = statement.executeQuery(strSQLQuery); //查询到相关的照片 if (rsQuery.next()) { //提取照片数据 BLOB blobPhoto = ((OracleResultSet)rsQuery).getBLOB(1); InputStream isBLOBPhoto = blobPhoto.getBinaryStream(); //建立读取照片数据的缓冲区 int intChunkSize = blobPhoto.getChunkSize(); byte[] byteArrayBuffer = new byte[intChunkSize]; //循环读取照片数据并输出 ServletOutputStream sosPhoto = response.getOutputStream(); int intReadSize = -1; while ((intReadSize = isBLOBPhoto.read(byteArrayBuffer)) != -1) { sosPhoto.write(byteArrayBuffer, 0, intReadSize); } //关闭输入流,清空输出流并关闭 isBLOBPhoto.close(); sosPhoto.flush(); sosPhoto.close(); //没有查询到相关的照片处理 } else { } } catch(Exception e) { } finally { disconnectDB(); return; } } /** * */ protected void disconnectDB() { try { connection.setAutoCommit(true); statement.close(); connection.close(); } catch(Exception e) { } }} fengyuxi你说的正是我的我问题所在,我的问题就是只有一次请求(对应1个回应),希望实现图象和文字的输出。如果2次请求,正如我上面所说,似乎是不大可能的。是不是必须要写到文件? 一个servlet在一次请求中是不可能同时输出文字和图像的,这点没错,但是我不明白你的需求,你关键是想做什么?实现什么效果?不是说你现在的结构是什么,只有一个ActionServlet,MVC也不是说只让你用一个servlet的呀,理解决对错误。上面大家讨论的方法,大都集中在用img src=...上面,这其实是说你的pageServelt,建立一个请求,它在显示到客户端后变成html,然后browser在解析到<img src=....时再建立一个请求,来生成一个jpeg。所以我们用两次请求就绕过了一次请求只能生成一种格式的问题。你说的存成文件,一样是在客户端解析html的img标签时重新从server读这个文件,差不多的,你还要保证这个图像是新的也并不是什么好方法,有点多余。 你的img文件是否存在于服务器端?如果存在,直接输出<img src=...........>否则就在服务器上创建一个图片文件再用serlvet输出<img src=...........> To天生不笨,你算说到点子上啦browser在解析到<img src=....时再建立一个请求,来生成一个jpeg。怎样才能再建立一个请求?直接用<img src="/ImageOutputServet">就可以了吗?我很笨的,请大家体谅一下! 是呀------------------当浏览器遇到<img src=时,它会与服务器再建立连接,然后发现这是个servlet,于是执行,下载到本地成为图像显示出来。 同一个字符串,写入日志的内容和页面前端显示的不同,为什么? jdk安装目录下没有native2ascii 如何调用不同文件夹的数据库? 电子贺卡 送给蛋蛋 圣诞快乐 [求助]将sql配置到hibernate xml再调用的方式,始终配不成功 Eclipse+struts连接数据库找不到驱动问题 请教一个关于用户验证的初级问题【解决就结账】 处理大批量数据传输时,应该采用什么技术? 请教,一个奇怪的问题。。。。。。。。。HTML 请问哪里有spring hibernate比较新版本的手册和例子? 如何去掉字符串中的所有空格? JavaBean
一次http请求到底能不能同时输出html文本和图片,
我认为是不行的,
因为对于http来说,
那根本就是两次请求!不知道我说的对不对!
你们说的不错,可能是我没有把问题说清楚。
我的程序采用MVC的Struts构架,所以整个应用程序只有1个Servlet就是ActionServlet,负责控制路由HTTP请求到其他对象(例如JSP页面或开发者实现的org.apache.struts.action.Action的子类)。
Action类的目的就是通过perform()方法来处理用户请求,并返回一个ActionForward对象转向到一个JSP。如下:
public ActionForward perform(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException;
现在我在这个Action子类里面 调用
JPEGEncoder.encode( pieChart2D, 1.0f, response );
绘制饼图;
JPEGEncoder类接收pieChart2D参数,并负责将response再包装成图象输出流到客户端。
所以在JPEGEncoder的encode方法返回的时候实际上输出流已经关闭了,用的是同一个response,
而且正如上面所说的,只有1个Servlet是控制所有请求分发的。这样要实现图文混合输出又该如何处理呢?
每个img分别是一次请求
out.println("这是动态输出的图片<img src='/ImgServlet'>");
out.println("</html>");ImgServlet.java://仅输出Img用输出流动态输出Img//其实楼上的各位已经说得很详细了
想从oracle中读出一blob字段,
数据库中共一条记录 id 1
pic blob (一个图片)
isize 368(图象大小)在jsp中想显示出图片,可报错
An error occurs : java.lang.IllegalStateException 为何?源代码如下:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html>
<head>
<title>Untitled</title>
</head><body>
<%@ page language="java" import="java.sql.*,java.util.*"%>
<%
String image_id = "1";
if (image_id != null)
{
try
{
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection con = DriverManager.getConnection("java:oracle:thin:@srv:1521:srv","yp","yp");
Statement stmt = con.createStatement();
String sql="SELECT id,pic,isize FROM my_blob_table WHERE ID ='1'";
ResultSet rs = stmt.executeQuery(sql);
if (rs.next())
{
//out.println(rs.getString("id"));
String dim_image = rs.getString("isize");
// out.println(dim_image);
byte [] blocco = rs.getBytes("pic");
response.setContentType("image/jpeg");
ServletOutputStream op = response.getOutputStream();
for(int i=0;i<Integer.parseInt(dim_image);i++)
//for(int i=0;i<blocco.length;i++)
{
// op.write(i);
op.write(blocco[i]);
}
}
else
{
out.println("no record!");
}
rs.close();
stmt.close();
con.close();
}
catch(Exception e)
{
out.println("An error occurs : " + e.toString());
}
}
%>
</body>
</html>
如果用一个servlet来实现,只能在servlet接收到请求的时候
来判断一下本次请求是要求显示一个图片还是请求一个html页面。
servlet输出图片我倒是可以给一个类出来!
这个类用来显示一个人的图片,在oracle中,photo是一个blob字段,
关键字是人的编号“id”。
在html中使用<img src="EMPShowPhoto?selectedid=12345678">来调用!
“12345678”是指一个人的编号。应该能看懂吧!import java.io.*;
import java.sql.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.sql.*;import oracle.jdbc.driver.*;
import oracle.jdbc.pool.OracleDataSource;
import oracle.sql.*;import com.neubitco.jnpc.pa.util.*;public class EMPShowPhoto extends HttpServlet {
Connection connection = null;
Statement statement = null;
public void init(ServletConfig config)
throws ServletException {
super.init(config); try {
} catch(Exception e) {
}
} public void service(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
String strID = request.getParameter("selectedkey");
//连接数据库
try {
//获得数据库连接
connection = DBConnection.getConnection();
connection.setAutoCommit(true); //获得基本数据库执行语句
statement = connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
} catch(Exception e) {
disconnectDB();
return;
} //执行查询
String strSQLQuery = "select photo from pa_emp_employee where id='" + strID + "'";
ResultSet rsQuery = null;
try {
rsQuery = statement.executeQuery(strSQLQuery); //查询到相关的照片
if (rsQuery.next()) {
//提取照片数据
BLOB blobPhoto = ((OracleResultSet)rsQuery).getBLOB(1);
InputStream isBLOBPhoto = blobPhoto.getBinaryStream(); //建立读取照片数据的缓冲区
int intChunkSize = blobPhoto.getChunkSize();
byte[] byteArrayBuffer = new byte[intChunkSize];
//循环读取照片数据并输出
ServletOutputStream sosPhoto = response.getOutputStream();
int intReadSize = -1;
while ((intReadSize = isBLOBPhoto.read(byteArrayBuffer)) != -1) {
sosPhoto.write(byteArrayBuffer, 0, intReadSize);
} //关闭输入流,清空输出流并关闭
isBLOBPhoto.close();
sosPhoto.flush();
sosPhoto.close();
//没有查询到相关的照片处理
} else {
}
} catch(Exception e) {
} finally {
disconnectDB();
return;
}
} /**
*
*/
protected void disconnectDB() {
try {
connection.setAutoCommit(true);
statement.close();
connection.close();
} catch(Exception e) {
}
}
}
我的问题就是只有一次请求(对应1个回应),希望实现图象和文字的输出。
如果2次请求,正如我上面所说,似乎是不大可能的。
是不是必须要写到文件?
如果存在,直接输出<img src=...........>
否则就在服务器上创建一个图片文件再用serlvet输出<img src=...........>
browser在解析到<img src=....时再建立一个请求,来生成一个jpeg。怎样才能再建立一个请求?直接用<img src="/ImageOutputServet">就可以了吗?
我很笨的,请大家体谅一下!
是呀------------------当浏览器遇到<img src=时,它会与服务器再建立连接,然后发现这是个servlet,于是执行,下载到本地成为图像显示出来。