1. 程式人生 > >基於jsp、servlet、MySQL 實現讀取顯示資料庫中的圖片

基於jsp、servlet、MySQL 實現讀取顯示資料庫中的圖片

  1. 首先介紹mysql資料庫表的資訊:
CREATE TABLE `imgtest` (
  `id` int(10) NOT NULL AUTO_INCREMENT COMMENT '圖片id',
  `name` varchar(20) NOT NULL COMMENT '名稱',
  `image` blob NOT NULL COMMENT '照片',
  PRIMARY KEY (`id`)
) 

注意:圖片儲存為 blob格式,直接儲存在資料庫中,而沒有選擇儲存路徑

2.介紹專案檔案結構,我使用的是 MyEclipse

這裡寫圖片描述

3.解析主要程式碼
ImageBean.java 為與表結構對應的bean類:

public class ImageBean {
    private int id;                // 圖片id
    private String name;           // 圖片名字
    private InputStream inStream;  // 圖片位元組流
    .....此處省略getset方法
}

JDBCUtil.java 類包含資料庫的連線操作和關閉操作,此處省略,詳見附件程式碼

GeneralDao.java 包含通用的增刪查改操作,這裡只給出兩個用到的查詢函式:

// 查詢,返回一個物件
public static
Object query(String sql, Object[] values, RowMapper rowMapper) { Object object = null; Connection conn = JDBCUtil.getConn(); PreparedStatement preStmt = null; ResultSet rs = null; // 查詢結果集 try { preStmt= conn.prepareStatement(sql); for(int i =0;i<values.length;i++) preStmt.setObject(i+1
, values[i]); // 將查詢引數放入sql語句中 rs = preStmt.executeQuery(); object = rowMapper.rowMapping(rs); // 對映為一個物件 } catch (SQLException e) { e.printStackTrace(); }finally{ JDBCUtil.closeConn(rs,preStmt,conn); } return object; } // 查詢,返回一組物件 public static List query(String sql, Object[] values, RowMapperList rowMapperList) { List list = null; Connection conn = JDBCUtil.getConn(); PreparedStatement preStmt = null; ResultSet rs = null; try { preStmt= conn.prepareStatement(sql); for(int i =0;i<values.length;i++) preStmt.setObject(i+1, values[i]); rs = preStmt.executeQuery(); list = rowMapperList.rowMapping(rs); // 對映為一個list } catch (SQLException e) { e.printStackTrace(); }finally{ JDBCUtil.closeConn(rs,preStmt,conn); } if (list == null || list.isEmpty() || list.size() == 0) { return null; } return list; }

RowMapper.java 和 RowMapperList.java 分別是兩個介面,供內部類實現
RowMapper.java :

public interface RowMapper {
    public Object rowMapping(ResultSet rs) throws SQLException;

}

RowMapperList.java :

public interface RowMapperList {

    public List rowMapping(ResultSet rs) throws SQLException;
}

ImageDao.java 裡面是對資料庫表的詳細操作:

public class ImageDao {

    // 查詢所有記錄
    public static List<ImageBean> query(String sql) {
        Object[] values = new Object[] {};
        ImageRML rowMapperList = new ImageRML();
        List<ImageBean> list = GeneralDao.query(sql, values, rowMapperList);
        return list;
    }

    // 根據id,查詢圖片位元組流
    public static InputStream queryImgStream(int id) {
        String sql = "select image from imgtest where id = ?";
        Object[] values = new Object[] {id};
        ImageRM rowMapper = new ImageRM();
        ImageBean imageBean = (ImageBean)GeneralDao.query(sql, values, rowMapper);
        // 如果查詢結果為空
        if (imageBean.equals(null)) {
            return null;
        }
        return imageBean.getInStream();
    }
}

// 一條記錄對映
class ImageRM implements RowMapper {

    @Override
    public Object rowMapping(ResultSet rs) throws SQLException {
        if (rs.next()) {
            ImageBean imageBean = new ImageBean();
            // 獲取圖片位元組
            imageBean.setInStream(rs.getBinaryStream("image"));
            return imageBean;
        }

        return null;
    }

}

// 一組記錄對映
class ImageRML implements RowMapperList {

    public List<ImageBean> rowMapping(ResultSet rs) throws SQLException 
    {
        List<ImageBean> list = new ArrayList<ImageBean>();
        // 如果rs有資料
        if (rs.next()) {
            do {
                ImageBean imageBean = new ImageBean();
                imageBean.setId(rs.getInt("id"));
                imageBean.setName(rs.getString("name"));
                list.add(imageBean);
            } while (rs.next());
        }
        else {
            return null;
        }
        return list;
    }
}

ImageOutServlet.java 為顯示圖片的servlet:

public class ImageOutServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        doPost(request, response);
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 獲取請求傳過來的id,對應的就是圖片的id
        String temp = request.getParameter("id");
        int id = Integer.parseInt(temp);
        // 獲取圖片位元組流
        InputStream inStream = ImageDao.queryImgStream(id);
        // 建立圖片輸出的輸出流
        ServletOutputStream soutStream = response.getOutputStream();
        if (inStream.equals(null)) {
            soutStream.println("圖片無法顯示 !<br>");
        } else {
            // 定義位元組流緩衝陣列
            byte[] buffer = new byte[1024];

            // 迴圈輸出位元組流, 為空時,read()返回 -1
            while (inStream.read(buffer) != -1) {
                soutStream.write(buffer);
            }
            // 輸入完畢,清楚緩衝
            soutStream.flush();
            soutStream.close();
        }
    }
}

4.jsp顯示頁面:

<body>
  <%
    String sql = "select id,name from imgtest";
    List<ImageBean> list = ImageDao.query(sql);
    // 如果結果集不為空
    if (list.size() > 0) {
   %>
    <table>
        <th>id</th><th>名稱</th><th>圖片</th>
    <%
        for (ImageBean bean : list) {
    %>
        <tr>
        <td><%=bean.getId() %></td>
        <td><%=bean.getName() %></td>
        <!-- 通過bean.getId() 將圖片id傳給servlet,然後返回顯示 -->
        <!-- 這裡 src 路徑,要根據目錄結構來確定,如果圖片顯示個X,大多是路徑問題 -->
        <td><img style="width:50px;height:50px" src="servlet/ImageOutServlet?id=<%=bean.getId()%>"></td>
        </tr>
    <%      
        } // for 
    }// if    
     %>

    </table>
  </body>

5.最後把專案部署到伺服器(tomcat)上,然後啟動,在瀏覽器位址列輸入:http://localhost:8089/ImageShow/ShowImg.jsp,我的埠為8089,你們根據自己的埠來。顯示結果為:
這裡寫圖片描述

辛苦大家看到最後,可能之間的資料庫操作略顯麻煩,但那是為了我專案的所有表的操作的方便,以及程式碼複用,沒有涉及到什麼框架。
如果為了儘快看到效果,也可以直接將資料庫查詢操作放在jsp中和servlet中,根據自己需要來。
程式碼還存在很多不足,還請見諒,普通學生水平。有什麼意見,儘管提出,大家互相交流。
過幾天會接著貼上專案地址

這裡附上 碼雲地址,裡面包含了兩種圖片上傳方式,由於能力有限,難免會有錯誤和侷限的地方,請多包含
https://gitee.com/sys_code/ImageShow

相關推薦

基於jspservletMySQL 實現讀取顯示資料庫圖片

首先介紹mysql資料庫表的資訊: CREATE TABLE `imgtest` ( `id` int(10) NOT NULL AUTO_INCREMENT COMMENT '圖片id', `name` varchar(20) NOT NUL

JSPservletSQL三者之間的數據傳遞

gre setattr == lec iterator connect cti 輸出 erp JSP、servlet、SQL三者之間的數據傳遞 博客分類: web開發 JSPservletSQL數據庫連接池web開發 前言: 最近一直在做WEB

JSPServletJDBC學習筆記

html con bat 什麽 cal servlet das www 所有 WEB的學習 * 服務器 * 網絡的架構(面試題) * C/S client/server 客戶端/服務器端 例子:QQ 快播 暴風影音 * 優點:交互性好,服務器壓力小。 * 缺點:客戶端更新了

JSP + Servlet + JDBC + Mysql 實現增刪改查 課程管理系統

1.專案目錄結構 2.專案環境 Eclipse IDE  MYSQL  jdk tomcat jar包 3.資料庫相關配置 先建立一個course的資料庫名,然後在建立一個course的表 要注意將id欄位 自動遞增  4.原始碼    

jspservletform表單提交過程的地址(相對和絕對)

今天終於理解這個地址的問題,對於jsp頁面或者是servlet中的相對地址和絕對地址,這裡我需要說的幾點:首先對於相對地址來說:Jsp頁面我現在有一個專案,名稱是shengsiyuan,然後webroot下面有一個資料夾session,session下面有兩個jsp頁面,一個

Java基礎Java集合多執行緒JDBCHTTPJSPServletStruts面試題彙總(附答案)

[Java基礎] 1.”==”和equals方法有什麼區別? 答:==是運算子,equals是方法,方法可以通過重寫改變其行為,如String的equals就是比較字串內容。 2. switch語句能否作用在byte上,能否作用在long上,能否作用在String上?

tomcatservletJSPJSTL版本支援對應表

  Tomcat版本 Servlet版本 Jsp版本 Jstl版本 6.0.x 2.5 2.1 1.2、1.1.x 5.5.x 2.4 2.0 1.1.x 5.0.x 2.4 2.0 1.1 4.1.x 2.3 1.2 1.0

基於jspservlet,通過複選框實現批量刪除的功能

複選框實現批量刪除 <%@ page language="java" contentType="text/html; charset=UTF-8"     pageEncoding="UTF-8"%> <%@ taglib uri="http://java

013-Spring Boot web【二】靜態資源ServletFilterlistenter

ces 其中 bean response cat 使用 修改配置 dac tostring 一、靜態資源 1.1、webapp默認支持靜態資源 在src/main/webapp下建立user.html默認支持訪問 1.2、默認內置靜態資源目錄。可被直接訪問 查看包:

jspservlet操作mysql中文亂碼問題的解決辦法

inux com 過濾 國際化 出現 conf onf my.cnf pos 轉載:http://www.jb51.net/article/49253.htm 首先看是從什麽地方開始出現的亂碼,只要統一編碼,就不會出現亂碼,下面以uft-8(個人認為最好)為例,詳細說明

spring boot 入門(八)filterservletlistener

spring boot 入門(八)servlet、filter、listener 1. filter spring boot有兩種方式來配置filter 1.1 Servlet 3.0新特性,以註解方式配置Filter,需在啟動類上加入@ServletComponentSc

用分離附加的方式實現sql server資料庫的備份和還原

一、資料庫分離、附加的說明 SQL Server提供了“分離/附加”資料庫、“備份/還原”資料庫、複製資料庫等多種資料庫的備份和恢復方法。這裡介紹一種學習中常用的“分離/附加”方法,類似於大家熟悉的“檔案拷貝”方法,即把資料庫檔案(.MDF)和對應的日誌檔案(.LDF)再拷貝到任何需要恢復這個資料庫的系統磁

C#實現對SQL資料庫的表的查詢新增修改刪除資料

經常用到的物件有:SqlConnection,SqlAdapter,SqlCommand、Dataset、DataGrid和DataReader等,以SqlConnection,SqlAdapter,SqlCommand、Dataset、DataGrid物件,操作SQL的例

商城專案小總結(基於jspservlet的Java Web開發)

商品的查詢和刪除操作與往常一致,這裡著重說明的是商品的新增和修改。新增商品需要上傳照片,因此要用到檔案上傳下載的知識。檔案的上傳流程大致為:首先建立一個檔案解析工廠,接著通過解析工廠建立一個檔案解析器,解析器是用來解析request物件中的資訊,就是新增商品jsp頁面中,input輸入框中的name屬性。解

FilterServletListener區別與聯絡

1. Filter實現javax.servlet.Filter介面,在web.xml中配置與標籤指定使用哪個Filter實現類過濾哪些URL連結。只在web啟動時進行初始化操作。filter 流程是線性的, url傳來之後,檢查之後,可保持原來的流程繼續向下執行,被下一個f

SpringBoot2伺服器屬性配置詳解-ServerSSLServletTomcatundertowjetty

server server.address= # 定義一個伺服器將監聽的IP地址 Network address to whi

利用java反射機制實現讀取excel表格的資料

如果直接把excel表格中的資料匯入資料庫,首先應該將excel中的資料讀取出來。 為了實現程式碼重用,所以使用了Object,而最終的結果是要獲取一個list如List<User>、List<Book>等,所以需要使用泛型機制去實現。下面會給出程式

使用Python實現讀取Excel表格的資料

本案例的實現是通過使用第三方xlrd,關於xlrd的相關文章請自行百度,教程很多,不做詳解。 #-*- coding:utf-8 -*- import xdrlib ,sys imp

SQL 2008R2問題:使用者組或角色'XXX'在當前資料庫已存在?

為一個數據庫新增一個使用者或者對映資料庫時,提示以下錯誤資訊: 使用者、組或角色 '*****' 在當前資料庫中已存在。 (Microsoft SQLServer, 錯誤 : 15023) 問題原因:在還原資料庫的過程中,在其它sql server伺服器上進行還原之後,會

python獲取系統記憶體CPU磁碟平均負載資訊並儲存到資料庫

本主題主要考察的是python os模組呼叫linux命令、模組、函式呼叫以及通過python操縱資料庫。 假設已經可以正常連線mysql資料庫了,儲存系統資訊的資料庫名稱為hostinfo,相關的四個資料表分別名為cpuinfo、meminfo、diskin