Это мой код. У меня есть образ в папке и пути к файлу в базе данных, я хочу получить все изображение по последней созданной строке. Я хочу показать первое последнее изображение.
<%@ include file="getcon.jsp"%>
<html>
<head>
<title>View Image Page</title>
</head>
<body>
<table width="100%" border="0">
<!-- main content -->
<%
String type=request.getParameter("type");
String sql;
if(type!=null)
{
sql="SELECT PICTURE, TITLE, TAG, POST from testimage where type='"+type+"'";
ResultSet rs=null;
try
{
rs=st.executeQuery(sql);
while(rs.next())
{
%>
<table width="700%" height="600" border="1" align="center">
<tr>
<!-- Mention Directory where your images has been saved-->
<% String filename=rs.getString(2);
//System.out.println("filename isssssss"+filename);
out.println("<b>"+filename+"</b>");
out.println(application.getRealPath("/"));
//session.setAttribute("download",filename);
%>
<td><img src="jokeimage\<%=rs.getString(1)%>" width="500" height="400" /></td>
</tr>
</table>
<%
}
}
catch(Exception e)
{
out.print(""+e.getMessage());
}
}
else{}
%>
Всегда старайтесь избегать элементов Scriplet вместо этого использовать JSP Standard Tag Library, которая более проста в использовании и меньше подвержена ошибкам.
Вы можете использовать библиотеку тегов SQL, которая предназначена для доступа к базе данных в JSP.
Пример кода: (изменить URL-адрес базы данных и учетные данные)
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<sql:setDataSource var="dataSource" driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/db" user="root" password="" />
<sql:query dataSource="${dataSource}" sql="SELECT PICTURE, TITLE from testimage where type=? ORDER BY CREATION_DATE DESC" var="result">
<sql:param value="${param.type}"/>
</sql:query>
<table width="100%" height="600" border="1" align="center">
<c:forEach var="row" items="${result.rows}">
<tr>
<td><b>${row.tag}</b></td>
<td><img src="${pageContext.request.contextPath}/jokeimage/${row.picture}" width="500" height="400" /></td>
</tr>
</c:forEach>
</table>
Как я преобразовал его в JSTL & EL из Scriplet?
${param.type}
используется для request.getParameter("type")
${pageContext.request.contextPath}
используется для application.getRealPath("/")
c:forEach
тег используется для во while
циклаsql:param
используется для параметризованного запросаsql:setDataSource
используется для создания источника данныхsql:query
используется для выполнения запроса Я бы выбрал параметры PreparedStatement
и bind (поскольку текущий запрос восприимчив к SQL Injection), при условии, что значение столбца POST
увеличивается для каждой следующей строки; возможно сделать что-то подобное в контроллере Servlet
-
sql="SELECT PICTURE, TITLE, TAG, POST from testimage where type=? ORDER BY POST DESC";
PreparedStatement ps = null;
try {
ps = conn.prepareStatement(sql);
ps.setString(1, type);
rs = ps.executeQuery();
// ... Read the ResultSet ...
} finally {
try {
rs.close();
} catch (Exception ignored) {
}
try {
ps.close();
} catch (Exception ignored) {
}
}