2016-04-20 7 views
0

プログラムにhttp GETリクエストを実行するセクションがあります。これはMySQLデータベースの行を含むテーブルを表示します。テキストを含む各セルは正常に表示されますが、テーブルのImagesセルにはオブジェクト参照が表示され、複数の検索操作や複数の試行にもかかわらず、この作業を行うことはできません。JSTLを使用してjspページテーブルに複数のMySQL db blobイメージを表示する方法

イメージはDBにBLOBとして保存され、私の行アイテムは下の「DisplayChefRecipes.java」コードのようにオブジェクトリストに格納されます。私はJSPページのELでこれにアクセスしています。

Stackoverflowの別の場所に記載されている理由で、私のJSPページでScripletsを使用したくありません。

Beanクラス(画像に関連するだけでセクション)

private InputStream image; 
public InputStream getImage() { 
    return image; 
} 
public void setImage(InputStream sImage) { 
    this.image = sImage; 
} 

DisplayChefRecipes

public class DisplayChefRecipes extends HttpServlet { 

private static final long serialVersionUID = 1L; 

/** 
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 
*/ 
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 

    Chef chef = new Chef(); 
    int chefIdString = Integer.parseInt(request.getParameter("chef_Id")); 
    chef.setId(chefIdString); 
    List<Object> resultSet = new ArrayList<Object>(); 

    // Make a connection to the database 
    String url = "jdbc:mysql://localhost/traineechefdb"; 
    String driver = "com.mysql.jdbc.Driver"; 
    String user = "root"; 
    String password = null; 

    try { 
     Class.forName(driver).newInstance(); 
     Connection conn = (Connection) DriverManager.getConnection(url, user, password); 
     System.out.println("Connection Established");  
     Class.forName("com.mysql.jdbc.Driver"); 

     Statement stmt = (Statement) conn.createStatement(); 
     String sql = "SELECT R.NAME, R.DESCRIPTION, R.PREP_TIME, R.INGREDIENTS, R.DIRECTIONS, FO.ORIGIN, FT.TYPE_NAME, R.IMAGE " + 
         "FROM RECIPE AS R " + 
         "INNER JOIN FOOD_ORIGIN AS FO " + 
          "ON R.FOOD_ORIGIN_ID = FO.FOOD_ORIGIN_ID " + 
         "INNER JOIN FOOD_TYPE AS FT " + 
          "ON R.FOOD_TYPE_ID = FT.FOOD_TYPE_ID " + 
         "WHERE R.CHEF_ID = '" + chef.getId() + "' "; 

     ResultSet rs = stmt.executeQuery(sql); 

     InputStream sImage = null; 

     while(rs.next()){ 

      Recipe recipe = new Recipe(); 

      recipe.setRecipeName(rs.getString("R.NAME")); 
      recipe.setDescription(rs.getString("R.DESCRIPTION")); 
      recipe.setPrepTime(rs.getDouble("R.PREP_TIME")); 
      recipe.setIngredients(rs.getString("R.INGREDIENTS")); 
      recipe.setDirections(rs.getString("R.DIRECTIONS")); 
      recipe.setFoodOrigin(rs.getString("FO.ORIGIN")); 
      recipe.setFoodType(rs.getString("FT.TYPE_NAME")); 
      sImage = rs.getBinaryStream("R.IMAGE"); 
      recipe.setImage(sImage); 

      resultSet.add(recipe); 
      recipe.equals(null); 
     } 
     request.setAttribute("resultSet", resultSet); 

     sImage.close(); 

     rs.close(); 
     conn.close(); 

     }catch(SQLException){ 
      e.printStackTrace(); 
     } 
      request.getRequestDispatcher("jsp/DisplayChefRecipes.jsp").forward(request, response); 
    } 

DisplayChefRecipes.jsp(表セクション)

<table> 
    <thead> 
     <tr> 
      <th>Recipe Name</th> 
      <th>Food Origin</th> 
      <th>Food Type</th> 
      <th>Description</th> 
      <th>Prep Time (Hours/mins)</th> 
      <th>Ingredients</th> 
      <th>Directions</th> 
      <th>Image</th> 
     </tr> 
    </thead> 
    <tbody> 
     <c:forEach items="${resultSet}" var="row"> 
      <tr> 
       <td>${row.recipeName}</td> 
       <td>${row.foodOrigin}</td> 
       <td>${row.foodType}</td> 
       <td>${row.description}</td> 
       <td>${row.prepTime}</td> 
       <td>${row.ingredients}</td> 
       <td>${row.directions}</td> 
       <td>${row.image}</td> <!-- How to Display each image? --> 
      </tr> 
     </c:forEach> 
    </tbody> 
</table> 

<br> 

<a href="jsp/Menu.jsp"> 
    <button>Return to Menu</button> 
</a> 

答えて

1

一つのアプローチは、指定されたIDの画像を返し、その後、普通の<img src="/imgserv?${row.imageid}"/>(またはそれらの線に沿って)を使用するサーブレットを作成することです。

もう1つの最近の可能性は、Embedding Base64 Imagesで説明されているように、埋め込まれたbase64でエンコードされたイメージデータを使用することです。そうすれば、バイト・データをBase64に前処理する必要がありますが、イメージ・データをフェッチするための別個のサーブレットを作成する必要はありません(間違っているとは限りません)。もちろん、大きな画像がたくさんある場合、組み込みのbase64のオーバーヘッドが問題になることがあります。

+0

ちょうど注記:Base64のアプローチは、「永続的な」画像には絶対に推奨されません。一時的な画像(アップロードと保存の間のプレビュー/クロップなど)にのみ有効です。 – BalusC

+0

おかげで、私は助けてくれてありがとう。このビットをもっと分かりやすくするために私に指示できるところがありますか?私はイメージを表示する必要があり、それは複雑なようです。 – morpheus1977

+0

重複した複製は、初心者には分かりません。 – BalusC

関連する問題