1

我正在使用 Servlet/JSP 管理 JDBC 数据库,并且我在表中拥有的属性之一是一个字符串,它在单词之间可能有也可能没有空格。我有一个 JSP 来显示所有信息,另一个 JSP 来编辑它,在我执行getString到 aResultSet时,当我只是显示它时它工作正常,但是在编辑 JSP 上它只“抓取”空格前的第一个单词其余的字符串消失了。以下是部分代码:

PerfilUsuarioConectado.jsp(我用来显示数据的那个)

<%
    Connection conexion = DriverManager.getConnection("jdbc:odbc:gasteizcar", "", "");
    Statement set = conexion.createStatement();
    ResultSet rs = set.executeQuery("SELECT * FROM Usuario WHERE correoElectronico ='" + session.getAttribute("username") + "'");
    rs.next();
%>
<div id="principal">
    <table border="1" align="center">
        <tr>
            <td> Nombre: </td>
            <td> <%= rs.getString("nombre")%>
        </tr>
        <tr>
            <td> Apellidos: </td>
            <td> <%= rs.getString("apellidos")%>
        </tr>
        <tr>
            <td> E-mail: </td>
            <td> <%= rs.getString("correoElectronico")%>
        </tr>
        <tr>
            <td> Alias: </td>
            <td> <%= rs.getString("alias")%>
        </tr>
        <tr>
            <td> Nº móvil: </td>
            <td> <%= rs.getString("movil")%>
        </tr>
        <tr>
            <td> Coche: </td>
            <td> <%= rs.getString("marca") + " " + rs.getString("modelo") + " " + rs.getString("color")%>
        </tr>
    </table>
</div>

ModificarDatos.jsp(编辑数据的那个)

<%
    Connection conexion = DriverManager.getConnection("jdbc:odbc:gasteizcar", "", "");
    Statement set = conexion.createStatement();
    ResultSet rs = set.executeQuery("SELECT * FROM Usuario WHERE correoElectronico ='"
            + session.getAttribute("username") + "'");
    int i = 0;
    rs.next();
    String marca = rs.getString("marca");
    String modelo = rs.getString("modelo");
    String color = rs.getString("color");
    String movil = rs.getString("movil");
%>
<div id="principal">
    <form id="datos" action="ModificarDatos" method="post">
        <table border="1" align="center">
            <tr>
                <td> * Verificar con contraseña: </td>
                <td> <input pattern="[a-zA-Z0-9 ]{3,12}" type="password" id="password" name="password" required></td>
            </tr>
            <tr>
                <td> ** Nueva contraseña: </td>
                <td> <input pattern="[a-zA-Z0-9 ]{3,12}" type="password" id="nuevaContrasenia" name="nuevaContrasenia"> </td>
            </tr>
            <tr>
                <td> ** Repita la contraseña: </td>
                <td> <input pattern="[a-zA-Z0-9 ]{3,12}" type="password" id="repContrasenia" name="repContrasenia"> </td>
            </tr>
            <tr>
                <td> * Nº de móvil: </td>
                <td> <input pattern="[0-9]{9}" type="text" name="movil" id="movil" required value=<%= movil%>> </td>
            </tr>
            <tr>
                <td> *** Marca del coche: </td>
                <td> <input type="text" name="marca" id="marca" value=<%= marca%>> </td>
            </tr>
            <tr>
                <td> *** Modelo del coche: </td>
                <td> <input type="text" name="modelo" id="modelo" value=<%= modelo%>> </td>
            </tr>
            <tr>
                <td> *** Color: </td>
                <td> <input type="text" name="color" id="color" value=<%= color%>> </td>
            </tr>
        </table>
</div>
<input type="button" id="bActualizar" value="Actualizar datos">

因此,如果有人能告诉我为什么该getString方法在这两种情况下的表现不同,我将不胜感激。

4

2 回答 2

0

ResultSet 类中的getString() 方法的目的是从您指定为String 的列中返回数据。它可以采用两个参数 sch 作为

字符串 getString(String columnLabel) 抛出 SQLException

字符串 getString(String columnIndex) 抛出 SQLException

第一个是使用您指定的 ex 列迭代 ResultSet

String marca = rs.getString("marca");

第二个可能是这样的

String marca = rs.getString(1);

还完全迭代结果集,直到rs.next从表中获取所有值。更多信息在这里

希望能帮助到你 !!

于 2013-12-30T10:23:52.157 回答
0

错误在这些行中:

<input pattern="[0-9]{9}" type="text" name="movil" id="movil" required value=<%= movil%>>

例如,如果您的变量movil包含abc def,那么生成的 HTML 将是:

<input pattern="[0-9]{9}" type="text" name="movil" id="movil" required value=abc def>

然后将输入的值设置为abc并创建另一个属性def,该属性无法识别并将被忽略。事实上,Stack Overflow 上突出显示的 Markdown 语法指出了这一点:abc蓝色表示值,def红色表示属性名称。

至少,您需要在 周围加上引号<%= movil %>

<input pattern="[0-9]{9}" type="text" name="movil" id="movil" required value="<%= movil%>">

如果movilcontains abc def,这一次,输出将是

<input pattern="[0-9]{9}" type="text" name="movil" id="movil" required value="abc def">

现在您可以看到该值已正确写入。


除此之外,我还想发表一些评论:

  • 首先,您的代码容易受到SQL 注入的攻击。如果您的username会话变量以类似的形式结束test' OR 1=1 --,则将返回数据库中的所有结果。更糟糕的是,如果它类似于test'; DROP TABLE Usuario;--,您可能会丢失数据。请改用PreparedStatements

  • 其次,正如 Aniket 在评论中指出的那样,您真的不应该再<% ... %>在 JSP 中使用 scriptlet。相反,您应该使用 JSTL 标记和 EL 表达式。 Aniket 所链接的问题是一个很好的起点。

我很欣赏这可能是您的第一个 JSP 应用程序。但是,一旦你让它工作,我建议你考虑进行这些更改。

于 2013-12-30T12:09:51.640 回答