从数据库获取NULL值

时间:2018-10-27 11:38:42

标签: java html jsp html-table

我正在尝试使用以下方法显示数据库中的某些数据,但它仅显示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>

2 个答案:

答案 0 :(得分:0)

首先值得一提的是,我们不再使用scriptlet。以下是一些说明原因的信息:

  

JSP中使用 scriptlets (那些<% %>事物)的确是   自 taglibs (例如JSTL)诞生以来,我们极力劝阻   ELExpression Language,那些${}的东西)   2001。

     

小脚本的主要缺点是:

     
      
  1. 可重用性:您无法重用scriptlet。
  2.   
  3. 可替换性:您不能使脚本集变得抽象。
  4.   
  5. 面向对象功能::您无法利用继承/组成。
  6.   
  7. 可调试性::如果scriptlet中途抛出异常,那么您得到的只是空白页。
  8.   
  9. 可测试性:脚本无法进行单元测试。
  10.   
  11. 可维护性:每维护一次,需要花费更多时间来维护混合/混乱/重复的代码逻辑。
  12.   
     

Sun Oracle本身在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>"); 

}

}