亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

從數據庫中獲取 NULL 值

從數據庫中獲取 NULL 值

qq_遁去的一_1 2021-12-10 15:39:49
我正在嘗試使用以下方法顯示我的數據庫中的一些數據,但它只顯示 NULL 值。我不確定我是否有正確的方法實現,所以如果在調用 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;        }
查看完整描述

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 是)


希望這可以幫助。如果您在理解任何內容時遇到困難,請告訴我!


查看完整回答
反對 回復 2021-12-10
?
MMMHUHU

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>"); 


}

}


查看完整回答
反對 回復 2021-12-10
  • 2 回答
  • 0 關注
  • 269 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號