从带有空格的 ResultSet 中获取字符串

Posted

技术标签:

【中文标题】从带有空格的 ResultSet 中获取字符串【英文标题】:getString from ResultSet with spaces 【发布时间】:2013-12-30 03:40:18 【问题描述】:

我正在使用 Servlets/JSP 管理一个 JDBC 数据库,我在表中拥有的属性之一是一个字符串,它在单词之间可能有也可能没有空格。我有一个 JSP 来显示所有信息,另一个 JSP 来编辑它,我执行 getStringResultSet 并且当我只是显示它时它工作正常,但在编辑 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 方法在这两种情况下的表现不同,我将不胜感激。

【问题讨论】:

不要在 JSP 中编写 scriptlet,因为 scriptlet 不应该在 JSP 中使用超过十年。学习 JSP EL、JSTL,并将 servlet 用于 Java 代码。 How to avoid Java Code in JSP-Files? 您能否告诉我们您没有获得完整字符串的字段。一个可能的错误可能是您与输入字段一起使用的模式来验证值。您检查您没有获得完整字符串的字段的模式,如果无法解决,请告诉我们您没有获得哪个行输入的值,因为语言不是英语,所以只需告诉我们行号。 感谢您提供有关避免在 JSP 中使用 Java 代码的信息,但问题是我只有 2 天的时间来交付这个项目,而且我无法负担更改它(还有很多“问题”像这样),在我的辩护中,我只有 12 天的时间来做这件事。尽管我只尝试了“Modelo”和“Color”,但我相信它们都不起作用。我会摆脱这些模式并报告回来。谢谢大家! 模式不是问题,因为我遇到问题的字段是没有模式的字段。 【参考方案1】:

错误在以下几行:

<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 是红色的,表示属性名称。

至少,您需要在&lt;%= movil %&gt; 周围加上引号:

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

如果movil包含abc def,这一次,输出将是

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

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


除此之外,我还想制作另外几个 cmets:

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

其次,正如 Aniket 在评论中指出的那样,您真的不应该再在 JSP 中使用 scriptlet &lt;% ... %&gt;。相反,您应该使用 JSTL 标记和 EL 表达式。 The question linked to by Aniket 是一个很好的起点。

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

【讨论】:

哇,非常感谢!问题是 参数周围缺少引号。再次谢谢你!一旦我有时间(很可能在决赛之后),我确实会尝试改进这段代码。【参考方案2】:

ResultSet 类中getString() 方法的用途是从你指定为String 的列中返回数据。它可以有两个参数 sch as

String getString(String columnLabel) 抛出 SQLException

String getString(String columnIndex) 抛出 SQLException

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

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

第二个可能是这样的

String marca = rs.getString(1);

还完全迭代结果集直到rs.next 以获取表中的所有值。更多信息here

希望对你有帮助!!

【讨论】:

感谢您的评论我已修复 'String getString(String columnIndex)' 必须是 'String getString(int columnIndex)' 我尝试使用 getString(int columnIndex) 并得到相同的结果。还是谢谢。

以上是关于从带有空格的 ResultSet 中获取字符串的主要内容,如果未能解决你的问题,请参考以下文章

从字符串中获取子字符串

iOS 从服务器获取的字符串中含有 \n 不换行的问题

如何在php中解析带有空格的空格分隔字符串?

有没有办法在 c++ 中获得一个带有空格的完整字符串?

如何在 Python 3.10 中的匹配情况下获取带空格的字符串

python 从字符串中获取整数(空格分隔)