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>");
}
}
添加回答
舉報