2 回答
TA贡献1852条经验 获得超1个赞
首先值得一提的是,我们不再使用 scriptlet。以下是一些解释原因的信息:
自从 2001 年标签库(如JSTL)和 EL(表达式语言,那些东西)诞生以来,在JSP 中使用scriptlet(那些<% %>东西)确实是非常不鼓励的。${}
Scriptlet的主要缺点是:
可重用性:您不能重用 scriptlet。
可替换性:您不能使 scriptlet 抽象。
面向对象的能力:你不能使用继承/组合。
可调试性:如果 scriptlet 中途抛出异常,你得到的只是一个空白页面。
可测试性: scriptlet 不可单元测试。
可维护性:每个 Saldo 需要更多时间来维护混合/混乱/重复的代码逻辑。
Sun Oracle 本身也建议在JSP 编码约定中,只要(标记)类可以实现相同的功能,就应避免使用scriptlet。这里有几个相关的引用:
根据 JSP 1.2 规范,强烈建议在 Web 应用程序中使用 JSP 标准标记库 (JSTL),以帮助 减少页面中对 JSP 脚本的需求。使用 JSTL 的页面通常更易于阅读和维护。
...
在可能的情况下,只要标记库提供等效功能,就应避免使用 JSP scriptlet。这使页面更易于阅读和维护,有助于将业务逻辑与表示逻辑分开,并使您的页面更容易演变为 JSP 2.0 样式的页面(JSP 2.0 规范支持但不强调使用 scriptlet)。
...
本着采用模型-视图-控制器 (MVC) 设计模式来减少表示层与业务逻辑之间的耦合的精神,不应使用 JSP 脚本来编写业务逻辑。相反,如果有必要,使用 JSP scriptlet 将处理客户端请求返回的数据(也称为“值对象”)转换为适当的客户端就绪格式。即便如此,最好使用前端控制器 servlet 或自定义标记来完成。
以上引自这个精彩的答案: 如何避免 JSP 文件中的 Java 代码?
好的,现在您明白为什么不应该使用脚本了。那么我们还应该如何在我们的 JSP 页面中做我们想做的事情呢?这就是 JSTL 和 EL 的用武之地。为了在您的项目中使用 JSTL(如果您不使用 maven),您所要做的就是下载 JSTL .jar 文件:https : //mvnrepository.com/artifact/javax .servlet/jstl/1.2并将其包含在您的lib文件夹中(位于 WEB-INF 内)。如果您没有该文件夹,请创建一个并在那里添加 .jar 文件。这是一个很好的资源,展示了你可以用它做的所有事情。
然后为了在您的 JSP 中使用它,只需在 JSP 文件的顶部包含核心库:
<%@ taglib prefix = "c" uri = "http://java.sun.com/jsp/jstl/core" %>
现在回到你的问题。问题出在这里:
Reservation r = new Reservation();
Res rb = new Res();
r.select(rb.getId());
当你在这里使用 rb.getId() 并且像这样你得到 null 因为你本质上是这样做的:
SELECT * FROM reservations WHERE id = null
因为您在该行之前创建了一个新对象而没有设置 id(或其他任何内容)
Res rb = new Res();
您需要做的是从您的 servlet 传递对象,然后您就可以使用它了。(不创建 res 的新对象)
例如,如果你这样做它应该工作:
Reservation r = new Reservation();
Res rb = new Res();
rb.setId(1); //set the id
r.select(rb.getId());
但同样,你不想这样做。因为它涉及小脚本。他们很烂。由于您的项目中现在有 jstl,这里有一个关于如何使用 JSTL 执行此操作的示例:
预订状态.jsp:
<h1 align="center"> Reservation </h1><br>
<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>${Reservation.day}</td>
<td>${Reservation.month}</td>
<td>${Reservation.year}</td>
<td>${Reservation.noRooms}</td>
<td>${Reservation.noNights}</td>
<td>${Reservation.roomType}</td>
<td>${Reservation.comments}</td>
<td>${Reservation.status}</td>
</table>
Wayyy清洁工对吗?您实际上不需要 JSTL,因为您在这里只使用 EL。
但同样,如果您只是尝试直接访问 jsp 页面,您将看不到任何内容。您需要 servlet 将数据传递给 jsp。为了让您更轻松地进行测试,我将做的是将您的 RESERVATION servlet 中的 doPost 更改为 doGet。这样,如果在浏览器中输入为此 servlet 映射的 url:http://localhost:9191/ReservationServletUrl,它将运行 servlet 并将详细信息转发到 jsp。(因为 doPost 不能像那样直接通过 url 访问,只有 doGet 是)
希望这可以帮助。如果您在理解任何内容时遇到困难,请告诉我!
TA贡献1834条经验 获得超8个赞
我改变了它并将代码放在一个 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>");
}
}
添加回答
举报
