gpt4 book ai didi

java - 如何使用 JSTL 在 jsp 页表中显示多个 MySQL db blob 图像

转载 作者:行者123 更新时间:2023-12-01 10:01:58 26 4
gpt4 key购买 nike

我的程序中有一个部分执行 http GET 请求,该请求显示一个包含 MySQL 数据库中的行的表。虽然包含文本的每个单元格显示良好,但表的图像单元格显示对象引用,尽管进行了多次搜索和多次尝试,但仍无法实现此目的。

我的图像作为 Blob 存储在数据库中,我的行项目存储在对象列表中,如下面我的“DisplayChefRecipes.java”代码所示。我在 JSP 页面上使用 EL 访问它。

出于 Stackoverflow 中其他地方所述的原因,我不想在 JSP 页面中使用 Scriplet。

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>

最佳答案

一种方法是创建一个 servlet,它将返回具有指定 id 的图像,然后仅使用常规 <img src="/imgserv?${row.imageid}"/> (或沿着这些思路)。

最近的另一种可能性是使用嵌入的、base64 编码的图像数据,如 Embedding Base64 Images 中所述。 。这将要求您将字节数据预处理为 Base64,但它可以避免创建单独的 servlet 来获取图像数据(并不是说它有任何问题)。当然,如果您有许多大图像,嵌入式 Base64 的额外开销可能会成为一个问题。

关于java - 如何使用 JSTL 在 jsp 页表中显示多个 MySQL db blob 图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36740684/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com