<form id="hz9zz"></form>
  • <form id="hz9zz"></form>

      <nobr id="hz9zz"></nobr>

      <form id="hz9zz"></form>

    1. 明輝手游網中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

      用JSP+Servlet完成二進制圖像的動態顯示

      [摘要]數據庫應用程序,特別是基于WEB的數據庫應用程序,通常會涉及到圖片信息的顯示。我們知道在HTML語言當中為了顯示靜態的圖片資料,可以利用如下標記來實現: <img src=http://cfan.net.cn/info/".image/hello.png" width=&...
      數據庫應用程序,特別是基于WEB的數據庫應用程序,通常會涉及到圖片信息的顯示。我們知道在HTML語言當中為了顯示靜態的圖片資料,可以利用如下標記來實現:
      <img src=http://cfan.net.cn/info/".image/hello.png" width="100" height="80">,而要顯示動態的圖片資料,就要采用相關的數據庫訪問技術來實現。在JSP環境編程中解決辦法多種多樣,通常是在數據庫中保存相應的圖片資料的名稱,而后在JSP中可以建立相應的數據源,利用數據庫訪問技術處理圖片信息。在靜態標記的基礎上,略加修改就可以用如下的標記語言實現動態圖片資料的顯示,即:<img src="../image/"+RS_photo.getString(photo_fiield) width="100" height="80">。
      以上兩種解決方案,主要是將所要顯示的圖片資料存在特定的目錄下進行存取控制。如果圖片資料是存儲在數據庫中的二進制數據,上述方法就不能滿足需要了。實際操作中,可以利用JSP+Servlet的編程模式來實現圖片資料的瀏覽顯示。其基本思想是,用Servlet實現圖片資料的后臺處理,用JSP進行頁面表現,具體的編程思想如下所述。
      1.建立后臺數據庫和數據庫應用程序
      假定處理的是某公司的員工信息,那么我們可以建立相應的數據庫及數據表對象。假定我們要存取的數據表結構如下所示:
      /****** Object: Table [dbo].[employee] Script Date: 2002-7-31 21:42:10 ******/
      if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[employee]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
      drop table [dbo].[employee]
      GO
      /****** Object: Table [dbo].[employee] Script Date: 2002-7-31 21:42:10 ******/
      CREATE TABLE [dbo].[employee] (
      [id] [char] (10) COLLATE Chinese_PRC_CI_AS NOT NULL ,
      [name] [char] (20) COLLATE Chinese_PRC_CI_AS NULL ,
      [sex] [char] (2) COLLATE Chinese_PRC_CI_AS NULL ,
      [birthday] [datetime] NULL ,
      [photo] [image] NULL ,
      [title] [char] (20) COLLATE Chinese_PRC_CI_AS NULL ,
      [department] [char] (30) COLLATE Chinese_PRC_CI_AS NULL
      ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
      GO
      其中,employee表中的列photo字段用于存儲員工的照片信息,則用于存儲圖像,其數據類型為“image”。接下來我們就可以建立應用程序,向數據庫中添加圖文信息。基本的操作數據庫應用程序相對簡單,大家可以利用流行的多種開發工具加以實現,并向數據庫中添加若干記錄。圖1是利用Delphi6實現的一種可行存儲image的應用解決方案。


      圖1 Delphi6操作數據庫image列

      程序實現的關鍵技術是流式信息存取技術。即為了實現對Image列的存取,在程序中采用了數據流讀寫圖片資料。其實現代碼主要在數據保存和記錄集移動的事件里。程序代碼在此就不再詳述?梢詤㈤喿髡叩奈恼隆队肈elphi6操作SQL SERVER 2000的Image列存取JPEG圖象》
      2.用Jbuilder7建立WEB應用程序
      對于WEB應用程序的實現方式,我們可以采用JDK 1.4 JAVA環境、Apache Tomcat 4.0和Dreamweaver MX,也可以選擇Jbuilder7的集成開發環境。下面我們以Jbuilder7集成開發環境為例說明WEB應用程序的具體實現過程。
      2.1 建立數據庫連接池訪問
      啟動Jbuilder7后,新建工程readpicfromdb.jpx。在工程中建立數據庫連接池對象類,主要包括一個管理類DBConnectionManager,負責提供與多個連接池對象DBConnectionPool類之間的接口。每一個連接池對象管理一組JDBC連接對象,每一個連接對象可以被任意數量的Servlet共享。類DBConnectionPool可以提供以下功能:
      ● 從連接池獲取(創建)可用連接
      ● 把連接返回給連接池
      ● 在系統關閉時釋放所有資源,關閉所有連接
      類DBConnectionManager則用于管理多個連接池對象,它提供以下功能:
      ● 裝載和注冊JDBC驅動程序
      ● 根據在屬性文件中定義的屬性創建連接池對象
      ● 實現連接池名字與其實例之間的映射。
      ● 跟蹤客戶程序對連接池的引用,保證睚最后一個客戶程序結束時安全地關閉所有連接池。
      上述兩個類的詳細代碼,讀者可以參閱相關書籍,這里主要給出本例中用到的屬性文件db.properties其代碼如下所示:
      **********數據庫連接池屬性文件db.properties***************
      drivers=sun.jdbc.odbc.JdbcOdbcDriver //定義JDBC-ODBC橋驅動程序
      logfile=D:\\webapp\\log.txt //定義日志文件存放的位置和名稱
      comdb.url=jdbc:odbc:graduweb //定義數據庫的JDBC的URL
      comdb.maxconn=10 //定義數據庫的最大連接數
      comdb.user=sa //指定用于該連接池的數據庫帳號
      comdb.password=sa //數據庫相應帳號的密碼
      **********數據庫連接池屬性文件db.properties***************
      最后將編譯過的包含數據庫連接池類的JAVA類DBConnectionManager.java 、DBConnectionManager.class以及上圖的db.properties文件一并放在工程文件的WEB-INF下的classes目錄下。
      2.2 編寫讀取二進制圖片的Servlet
      從Jbuilder7的File菜單里選擇新建Servlet,并將其命名為getphoto。該Servlet的JAVA源代碼如下所示:
      ***************Servlet getphoto.java 的JAVA代碼*************
      import javax.servlet.*;
      import javax.servlet.http.*;
      import java.io.*;
      import java.util.*;
      import java.sql.*;
      public class getphoto extends HttpServlet {
      private static final String CONTENT_TYPE = "image/jpeg";
      /**Initialize global variables*/
      public void init() throws ServletException {
      }
      /**Process the HTTP Get request*/
      public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      //在數據庫中照片的ID
      String PHOTOID = null;
      try {
      PHOTOID = request.getParameter("photoid");
      }
      catch(Exception e) {
      e.printStackTrace();
      }
      //連接數據庫,自定義的數據庫連接池管理類
      DBConnectionManager connMgr;
      connMgr = DBConnectionManager.getInstance();
      Connection conn = connMgr.getConnection("comdb"); //屬性文件中定義
      //用來存儲照片數據的緩沖區
      byte [] buf=null;
      //擴展名可以從數據庫得到,這里直接指定為JPEG
      String photoname="jpeg";
      try{
      //根據ID查找照片
      String searchSql="select photo from employee where id ="+PHOTOID;
      Statement stmt = conn.createStatement();
      ResultSet RS_photo = stmt.executeQuery(searchSql);
      //將圖片數據讀入緩沖區
      if (RS_photo.next()){
      buf = RS_photo.getBytes(1);
      }else
      {
      buf = new byte[0];
      }
      }catch (Exception e){
      //throw e;
      }
      finally {
      connMgr.freeConnection("comdb", conn);
      }
      //response.setContentType(CONTENT_TYPE);
      //告訴瀏覽器輸出的是圖片
      response.setContentType("image/"+photoname);
      //圖片輸出的輸出流
      OutputStream out = response.getOutputStream();
      //將緩沖區的輸入輸出到頁面
      out.write(buf);
      //輸入完畢,清楚緩沖
      out.flush();
      }
      /**Clean up resources*/
      public void destroy() {
      }
      }
      編譯后的Servlet getphoto.class也會自動放置在工程文件的WEB-INF下的classes目錄下。
      2.3 JSP實現數據庫圖文信息瀏覽
      成功建立好Servlet后,下一步要做的工作就是將原先的HTML標記:
      <img src="../image/"+RS_photo.getString(photo_fiield) width="100" height="80">加以修改,替換為Servlet標記。即可以將下面的標記寫于HTML或JSP中頁面中
      <img border="0" src="/servlet/getphoto?photoid=XXX&ts=AAAAA" >
      其中XXX是圖片的ID,AAAAA是時間戳,用來防止圖片不刷新。如果我們要瀏覽數據庫中的所有圖文信息,可以加入適當的循環控制。在本文的示例WEB應用程序中作者加入了簡單的表格控制來修飾輸出的圖文信息。詳細的程序代碼如下所示:
      ***************JSP頁面瀏覽數據庫圖文信息代碼*************
      <%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage="" %>
      <jsp:useBean id="comdbBean" scope="page" class="dbbean.conn"/>
      //使用javabean建立頁面的數據連接
      <html>
      <head>
      <title>Untitled Document</title>
      <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
      </head>
      <body>
      <%
      int table_num=4; //指定表格每行顯示記錄的條數
      ResultSet RS_photo;
      strSQL="select * from employee";
      RS_photo =comdbBean.executeQuery(strSQL);
      out.println("<table width='75%' border='1'align='center'>");
      out.println("<tr>");
      while(RS_photo.next())
      {
      String pic01=rs.getString("id_stud");
      pic01=""+pic01+"";
      String employeename=rs.getString("name");
      //加入表格控制
      out.println("<td>");
      out.println("<div align=\"center\">");
      out.println("<p>");
      out.println("<a
      href=\"inf_ employee_details.jsp?inf_employee_id=pic01\">");
      out.println("<img
      border=\"0\"src=\"../servlet/getphoto?photoid="+pic01+"&ts=AAAAA\" width=\"100\" height=\"120\" align=\"absmiddle\">");
      out.println("</a>");
      out.println("</p>");
      out.println("<p>");
      out.println("<a
      href=\"inf_ employee _details.jsp?inf_employee_id=pic01\">");
      out.println(employeename);
      out.println("</a>");
      out.println("</p>");
      out.println("</div>");
      out.println("</td>" );
      table_num++;
      if((table_num%4)==0)
      //如果可以被4整除,則進入下一欄,否則繼續輸出
      {
      out.println("</tr>");
      out.println("<tr>");
      }
      }
      out.println(" ");
      }
      RS_photo.close(); //關閉數據集RS_subject
      %>
      </body>
      </html>
      在上例的程序代碼示例中,用javabean建立本JSP頁面的數據庫連接,用Servlet進行讀取二進制image數據。后面附加了表格修飾輸出圖文的部分代碼。程序運行結果如下圖1-6所示。


      圖2 JSP頁面瀏覽數據庫圖文信息結果

      以上WEB應用程序在Windows 2000 Server+JBuilder 7+SQL Server 2000+ Apache Tomcat 4.0環境下調試通過。




      日韩精品一区二区三区高清