name属性的设置值在setAttribute()之后中断



我想创建一个名称属性并使用resultset方法为其设置一个值,但它在request.setAttribute(..)之后中断。

退出第一个if else结构,但不继续执行转发或返回语句。

如果我使用rs.next()作为名称的值,它工作得很好,所以我很确定我使用rs.getString的方式是错误的。我检查了文档,找不到我的错误。

String sql = "select * from students where id="+ request.getParameter("st_id");
ResultSet rs= stmt.executeQuery(sql);
if (rs.wasNull()) {
    request.getRequestDispatcher("/login_fail.jsp").forward(request, response);
    return; 
}else{
    request.setAttribute("name", rs.getString("name"));
    request.getRequestDispatcher("/login_action.jsp").forward(request, response);
    return; 
}

您应该呼叫rs.next()。因为当你收到ResultSet游标是指向结果集的第一行之前的地方。所以你必须调用next()方法,然后得到结果在java API中,它说

boolean next() throws SQLException
Moves the cursor froward one row from its current position. A ResultSet cursor is initially positioned before the first row; the first call to the method next makes the first row the current row; the second call makes the second row the current row, and so on.

读取ResultSet.next()的文档

因此可以编写如下代码

String sql = "select * from students where id="+ request.getParameter("st_id");
ResultSet rs= stmt.executeQuery(sql);
if(rs.next()){
    if (rs.wasNull()) {
        request.getRequestDispatcher("/login_fail.jsp").forward(request, response);
    }else{
        request.setAttribute("name", rs.getString("name"));
        request.getRequestDispatcher("/login_action.jsp").forward(request, response);
    }
}

请在此处打印列名。

ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM TABLE2");
ResultSetMetaData rsmd = rs.getMetaData();
int columnCount = rsmd.getColumnCount();
// The column count starts from 1
for (int i = 1; i < columnCount + 1; i++ ) {
  String name = rsmd.getColumnName(i);
   System.out.println(name);
}

试着像下面这样修改代码

String sql = "select * from students where id="+ request.getParameter("st_id");
            ResultSet rs= stmt.executeQuery(sql);

            if (rs.wasNull()) {
                request.getRequestDispatcher("/login_fail.jsp").forward(request, response);
                return; 
            }else{
              while (resultSet.next()) {
                request.setAttribute("name", rs.getString("name"));
                request.getRequestDispatcher("/login_action.jsp").forward(request, response);
                }
            return; 
            }

您可以尝试更改查询并在其中提供列名,如:

String sql = "select name, col1 from students where id="+ request.getParameter("st_id");
ResultSet rs= stmt.executeQuery(sql);

然后你可以像这样使用rs.getstring:

if(rs.next())
{
if (rs.wasNull()) 
{
    request.getRequestDispatcher("/login_fail.jsp").forward(request, response);
    return;
}
else
{
    request.setAttribute("name", rs.getString(1));
    request.getRequestDispatcher("/login_action.jsp").forward(request, response);
    return;
}
}

最新更新