我正在尝试使用以下方法显示数据库中的某些数据,但它仅显示NULL值。我不确定我是否正确地实现了该方法,因此如果有什么需要调用select()方法的则应该更改。 预先感谢您的帮助。
// SELECT方法
public Res select(int id) {
Res res = new Res();
Connection connection = null;
PreparedStatement preparedStm = null;
ResultSet resultSet = null;
try {
connection = ConnectionConfiguration.getConnection();
preparedStm = connection.prepareStatement("SELECT * FROM res WHERE id = ?");
preparedStm.setInt(1, id);
resultSet = preparedStm.executeQuery();
while(resultSet.next()) {
res.setId(resultSet.getInt("id"));
res.setDay(resultSet.getString("res"));
res.setNoRooms(resultSet.getString("rooms"));
res.setNoNights(resultSet.getString("nights"));
res.setRoomType(resultSet.getString("room_type"));
res.setUser_email(resultSet.getString("email"));
}
} catch(Exception e) {
e.printStackTrace();
} finally {
if (resultSet != null) {
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (preparedStm != null) {
try {
preparedStm.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
return res;
}
// JSP页面显示
<h1 align="center"> Reservation </h1><br>
<% Reservation r = new Reservation();
Res rb = new Res();
r.select(rb.getId());
%>
<table border="1" width="50%" align="center">
<tr><th colspan="3">Date</th><th>Rooms</th><th>Nights</th><th>Room type</th><th>
Comments</th><th>Status</th></tr>
<tr><td><%= rb.getDay() %><td>
<%=rb.getRooms() %></td><td><%=rb.getNights() %></td><td><%=rb.getRoomType() %></td>
</table>
答案 0 :(得分:0)
首先值得一提的是,我们不再使用scriptlet。以下是一些说明原因的信息:
在JSP中使用 scriptlets (那些
<% %>
事物)的确是 自 taglibs (例如JSTL)诞生以来,我们极力劝阻 EL(Expression Language,那些${}
的东西) 2001。小脚本的主要缺点是:
- 可重用性:您无法重用scriptlet。
- 可替换性:您不能使脚本集变得抽象。
- 面向对象功能::您无法利用继承/组成。
- 可调试性::如果scriptlet中途抛出异常,那么您得到的只是空白页。
- 可测试性:脚本无法进行单元测试。
- 可维护性:每维护一次,需要花费更多时间来维护混合/混乱/重复的代码逻辑。
SunOracle本身在JSP coding conventions中也建议避免在相同的情况下使用 scriptlets (标签)类可以实现功能。这里有几个引用 相关性:从JSP 1.2规范开始,强烈建议您在Web应用程序中使用JSP标准标记库(JSTL),以帮助 减少页面中对JSP脚本的需要。通常,使用JSTL的页面更易于阅读和维护。
...
在可能的情况下,只要标签库提供等效功能,就避免使用JSP脚本。这使页面更易于阅读和 维护,有助于将业务逻辑与表示逻辑分开, 并使您的页面更容易演变为JSP 2.0样式的页面 (JSP 2.0规范支持但不强调使用 脚本)。
...
本着采用模型视图控制器(MVC)设计模式的精神,可以减少展示层与展示层之间的耦合。 业务逻辑,不应使用 JSP脚本进行编写 商业逻辑。相反,如果需要,可以使用JSP scriptlet 转换从处理返回的数据(也称为“值对象”) 将客户的请求转换为适合客户使用的格式。即使这样, 使用前端控制器servlet或自定义更好 标签。
上面的引文摘自这个奇妙的答案: How to avoid Java code in JSP files?
好的,现在您了解了为什么不应该使用scriptlet。那么我们应该如何在JSP页面中做我们想做的事情?这是JSTL和EL出现的地方。要在项目中使用JSTL(如果您不使用maven),要做的就是下载JSTL .jar文件:https://mvnrepository.com/artifact/javax.servlet/jstl/1.2并将其包含在{ {1}}文件夹(位于WEB-INF中)。如果您没有该文件夹,请创建一个文件夹,然后在其中添加.jar文件。 Here是一个很棒的资源,展示了您可以使用它做的所有事情。
然后,为了在JSP中使用它,只需在JSP文件顶部包括核心库即可。
lib
现在回到您的问题。问题出在这里:
<%@ taglib prefix = "c" uri = "http://java.sun.com/jsp/jstl/core" %>
当您在此处rb.getId()时,由于实际上是在执行此操作,因此您会得到null:
Reservation r = new Reservation();
Res rb = new Res();
r.select(rb.getId());
因为您在该行之前创建了一个新对象,而未设置ID(或其他任何内容)
SELECT * FROM reservations WHERE id = null
您需要做的是从servlet传递对象,然后可以使用它。 (无需创建res的新对象)
例如,如果您执行此操作,它将起作用:
Res rb = new Res();
但是,再次,您不想这样做。因为它涉及脚本。他们很烂。由于您现在的项目中已有jstl,因此以下是有关如何使用JSTL的示例:
ReservationStatus.jsp:
Reservation r = new Reservation();
Res rb = new Res();
rb.setId(1); //set the id
r.select(rb.getId());
Wayyy清洁工对吗?实际上,您实际上不需要JSTL,因为这里只使用EL。
但是,如果再次尝试直接访问jsp页面,您将看不到任何内容。您需要Servlet才能将数据传递到jsp。为了使您更容易测试,我要做的就是将RESERVATION Servlet中的doPost更改为doGet。这样,如果在浏览器中输入为此servlet映射的URL:http://localhost:9191/ReservationServletUrl,它将运行servlet并将详细信息转发到jsp。 (因为doPost不能直接通过url进行访问,所以只有doGet可以)
希望这会有所帮助。如果您在理解任何内容时遇到麻烦,请告诉我!
答案 1 :(得分:0)
我对其进行了更改,并将代码放入如下所示的Servlet中,现在我使用电子邮件地址显示数据,因为它使一切变得更加容易。我做了如下。
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession s = request.getSession();
ResBean res = new ResBean();
Connection connection = null;
PreparedStatement preparedStm = null;
ResultSet resultSet = null;
String user_email = String.valueOf(s.getAttribute("uemail"));
PrintWriter out = response.getWriter();
out.println("<html><body><center><h1> Reservation Status</h1></center><br><h4 align=\"center\"> Rezervimi nga perdoruesi me email: " + user_email);
out.println("<table border=\"1\" width=\"50%\" align=\"center\">");
out.println("<tr><th colspan=\"3\">Data</th><th>Numri i dhomave</th><th>Numri i neteve</th>"
+ "<th>LLoji i dhomes</th><th>\r\n" +
"Kerkesa</th><th>Statusi</th></tr>");
try {
connection = ConnectionConfiguration.getConnection();
preparedStm = connection.prepareStatement("SELECT * FROM reservations WHERE user_email = ?");
preparedStm.setString(1, user_email);
resultSet = preparedStm.executeQuery();
while(resultSet.next()) {
res.setDay(resultSet.getString("res_day"));
res.setMonth(resultSet.getString("res_month"));
res.setYear(resultSet.getString("res_year"));
res.setNoRooms(resultSet.getString("no_rooms"));
res.setNoNights(resultSet.getString("no_nights"));
res.setRoomType(resultSet.getString("room_type"));
res.setComments(resultSet.getString("add_comments"));
res.setStatus(resultSet.getString("res_status"));
res.setUser_email(resultSet.getString("user_email"));
out.println("<tr><td>" + res.getDay() +"</td><td>"+ res.getMonth() + "</td><td>" + res.getYear() +"</td><td>"
+ res.getNoRooms() + "</td><td>" + res.getNoNights() + "</td><td>" + res.getRoomType() + "</td><td>" +
res.getComments() + "</td><td>" + res.getStatus() + "</td></tr>");
}
} catch(Exception e) {
e.printStackTrace();
} finally {
if (resultSet != null) {
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (preparedStm != null) {
try {
preparedStm.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
out.println("</table></body></html>");
}
}