一个servlet输出图像,另一个servlet输出HTML文本,<img src="servlet_a?id=xxx">

解决方案 »

  1.   

    用servlet输出图像不一定要先存成文件的,你可以直接这样<img src="/ImageOutputServet">即可。
      

  2.   

    以sharetop(天生不笨)的sample来说,ImageOutputServet是另一个Servlet.此Servlet的输出mime type是jpg.还有一个Servlet用来输出html,其中包括<img src="/ImageOutputServet">.这样就可以了。
      

  3.   

    不明白问题的根本!
    一次http请求到底能不能同时输出html文本和图片,
    我认为是不行的,
    因为对于http来说,
    那根本就是两次请求!不知道我说的对不对!
      

  4.   

    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是控制所有请求分发的。这样要实现图文混合输出又该如何处理呢?
      

  5.   

    是同一个servlet没关系,但是一定是两次请求,多次请求
    每个img分别是一次请求
      

  6.   

    MainServlet.java://仅输出html/textout.println("<html>");
    out.println("这是动态输出的图片<img src='/ImgServlet'>");
    out.println("</html>");ImgServlet.java://仅输出Img用输出流动态输出Img//其实楼上的各位已经说得很详细了
      

  7.   

    怎么 输出图象啊,我这为什么不行?
    想从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> 
      

  8.   

    我还是认为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) {
        }
      }
    }
      

  9.   

    fengyuxi你说的正是我的我问题所在,
    我的问题就是只有一次请求(对应1个回应),希望实现图象和文字的输出。
    如果2次请求,正如我上面所说,似乎是不大可能的。
    是不是必须要写到文件?
      

  10.   

    一个servlet在一次请求中是不可能同时输出文字和图像的,这点没错,但是我不明白你的需求,你关键是想做什么?实现什么效果?不是说你现在的结构是什么,只有一个ActionServlet,MVC也不是说只让你用一个servlet的呀,理解决对错误。上面大家讨论的方法,大都集中在用img src=...上面,这其实是说你的pageServelt,建立一个请求,它在显示到客户端后变成html,然后browser在解析到<img src=....时再建立一个请求,来生成一个jpeg。所以我们用两次请求就绕过了一次请求只能生成一种格式的问题。你说的存成文件,一样是在客户端解析html的img标签时重新从server读这个文件,差不多的,你还要保证这个图像是新的也并不是什么好方法,有点多余。
      

  11.   

    你的img文件是否存在于服务器端?
    如果存在,直接输出<img src=...........>
    否则就在服务器上创建一个图片文件再用serlvet输出<img src=...........>
      

  12.   

    To天生不笨,你算说到点子上啦
    browser在解析到<img src=....时再建立一个请求,来生成一个jpeg。怎样才能再建立一个请求?直接用<img src="/ImageOutputServet">就可以了吗?
    我很笨的,请大家体谅一下!
      

  13.   


    是呀------------------当浏览器遇到<img src=时,它会与服务器再建立连接,然后发现这是个servlet,于是执行,下载到本地成为图像显示出来。