当前位置: 首页 > 知识库问答 >
问题:

从jsp调用时图像不来自servlet

慕健
2023-03-14

我正试图从oracle数据库中获取图像。流程是:JSP(读取photo_id)->jsp->,它从HTML图像标记的src属性内部调用Servlet。

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>your Pic</title>
</head>
<body>

      <form id="form2" enctype="multipart/form-data" action="getPhoto.jsp" method="get">
            <table>
                <tr>
                    <td>Enter Photo Id :</td>
                    <td><input  type="text"  name="id"/></td>
                </tr>

            </table>
            <p/>
            <input type="submit" value="fetch Photo"/>
        </form>

</body>
</html>

getphoto.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Your photo</title>
</head>
<body>
<% String p_id=request.getParameter("id");%>


<table>
    <tr><td><%=p_id%></td></tr>
    <tr><td><img src="/getPic?photoid=<%=p_id%>" /></td></tr>
</table>
</body>
</html>

img标记的src属性中的getPic是servlet。

getPic.java

package com.kp.imagehandler;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.IOException;
import java.io.InputStream;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.kp.imagehandler.Image;

/**
 * Servlet implementation class getPic
 */
public class getPic extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#HttpServlet()
     */
    public getPic() {
        super();
        // TODO Auto-generated constructor stub
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub

        String imageId = request.getParameter("photoid");
        System.out.println(imageId);
        InputStream photoStream = (new Image()).getImageStream(imageId);


        BufferedInputStream input = null;
          BufferedOutputStream output = null;

          try {

              // Open streams
              input = new BufferedInputStream(photoStream, 200000);
              output = new BufferedOutputStream(response.getOutputStream(),
                      200000);

              // Write file contents to response.
              byte[] buffer = new byte[200000];
              int length;
              while ((length = input.read(buffer)) > 0) {
                  output.write(buffer, 0, length);
              }

              } finally {
                  output.close();
                  input.close();
              }

    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
    }

}

image.java:

package com.kp.imagehandler;

import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class Image {

    // Init ---------------------------------------------------------------------------------------


    public InputStream getImageStream(String pid)
    {
        InputStream IS=null;
        try {

        Connection connection = DriverManager.getConnection("jdbc:oracle:thin:@10.75.122.69:1521:devdb",
                "s3", "s3");
          Statement stmt = connection.createStatement ();

            ResultSet rset = stmt.executeQuery ("SELECT photo FROM photo_holder where id="+pid);

            while(rset.next())
            {
                IS=rset.getBinaryStream("photo");

            }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }


        return IS;

    }

    // Implement default getters and setters here.

}
  <servlet>
    <description>getPic</description>
    <display-name>getPic</display-name>
    <servlet-name>getPic</servlet-name>
    <servlet-class>com.kp.imagehandler.getPic</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>getPic</servlet-name>
    <url-pattern>/getPic</url-pattern>
  </servlet-mapping>

表定义:

create table PHOTO_HOLDER
(
  ID    NUMBER(5) not null,
  TITLE VARCHAR2(50),
  PHOTO BLOB
)

但是在点击获取照片后,我只是得到了照片id而不是图像。在这里,我不确定servlet是否被解雇。

请帮忙。提前谢谢。

共有1个答案

广晔
2023-03-14

为图像形成的URL可能有问题。

请通过简单地查看浏览器中生成的JSP的源代码来再次验证它。

只需调试代码或使用日志记录来调查问题。

在servlet/JSP路径之前追加上下文路径后再试一次,如下所示:

<form id="form2" enctype="multipart/form-data" action="<%=request.getContextPath() %>/getPhoto.jsp" method="get">

<img src="<%=request.getContextPath() %>/getPic?photoid=<%=p_id%>" />
 类似资料:
  • 我创建了一个动态web项目,以便通过Servlet显示JSP(我不能使用任何类似Spring的框架…)。默认情况下,我构建的类放在Build/classes中,因此在我将输出文件夹更改为WebContent/WEB-INF/classes后,我的应用程序运行良好。之后,我将该项目转换为Maven项目。(我不记得我上次使用servlet/JSP时需要更改输出文件夹,那是3年前!)。 无论如何,现在我

  • 在我的jsp页面中,jsp:include编号(1)不调用servlet。。我在cat_catalogo中有一个空指针异常。就是两天我在努力理解这个问题。这是我的jsp页面的结构。。如果我删除jsp:include(1)和列表,它会工作,但是如果我取消所有内容,只保留和列表,它也会工作。我绝望了。谢谢所有想帮助我的人。 这是玻璃鱼的结果:

  • 谁能告诉我,除了RequestDispatcher之外,是否还有其他方法可以从我的servlet调用jsp页面?因为我试了很多都没有成功。 我的servlet工作正常,从JSP中恢复了所有数据。我所需要的只是在用户正确输入用户名和密码时被重定向到另一个页面。 我要为其重定向的jsp

  • 在相机意图返回时获得文件路径的最佳方法是什么。当然,我可以在启动意图之前将文件路径保存到成员变量,但这似乎不好,我应该从OnActivityResult中获得路径。 我已经试过了(从相机意图获取图像路径): 唯一不同的是,我在尝试内部存储pic时使用了INTERNAL_CONTENT_URI。如果我这样做,我会得到一个异常:

  • 我在我的主题中添加了一个功能,允许用户“上传”画廊的图像。该字段称为缩略图,它返回一个url(http://example.com/wp-content/upload/image.jpg)。 我的问题是我添加了新的缩略图大小(add_image_size()),重新生成了照片,但现在调用新图像时遇到问题。 示例: 我有一个图像,叫做:http://example.com/wp-content/up

  • 我一直在寻找答案,但没有找到任何相关的。 因此,我将创建一个wordpress自定义主题,条件是: -我希望有一个以帖子图像为背景图像的特色帖子 问题是,每次我要做一篇特色文章,我都需要不同的文章封面图片,我怎样才能让这个文章图片在CSS上显示为背景图片,而不是像平常一样 因为我需要一个大背景(css)背景大小的特色文章:封面;