为了账号安全,请及时绑定邮箱和手机立即绑定

从数据库中获取 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 关注
  • 287 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号