从带有空格的 ResultSet 中获取字符串
Posted
技术标签:
【中文标题】从带有空格的 ResultSet 中获取字符串【英文标题】:getString from ResultSet with spaces 【发布时间】:2013-12-30 03:40:18 【问题描述】:我正在使用 Servlets/JSP 管理一个 JDBC 数据库,我在表中拥有的属性之一是一个字符串,它在单词之间可能有也可能没有空格。我有一个 JSP 来显示所有信息,另一个 JSP 来编辑它,我执行 getString
到 ResultSet
并且当我只是显示它时它工作正常,但在编辑 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
是红色的,表示属性名称。
至少,您需要在<%= movil %>
周围加上引号:
<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 <% ... %>
。相反,您应该使用 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 中获取字符串的主要内容,如果未能解决你的问题,请参考以下文章