getString из ResultSet с пробелами
Я управляю базой данных 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
метод работает по-разному в обеих ситуациях, я был бы очень благодарен.
2 ответа
Ошибка в этих строках:
<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
, который не распознается и будет игнорироваться. Фактически, выделение синтаксиса 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">
Теперь вы можете видеть, что значение было написано правильно.
Помимо этого, есть еще пара комментариев, которые я хотел бы сделать:
Во-первых, ваш код уязвим для внедрения SQL. Если твой
username
переменная сеанса заканчивается как что-то вродеtest' OR 1=1 --
все результаты из базы данных будут возвращены. Еще хуже, если это что-то вродеtest'; DROP TABLE Usuario;--
Вы можете потерять данные. Вместо этого используйте PreparedStatements.Во-вторых, как отметил Аникет в комментарии, вам действительно не следует использовать скриптлеты.
<% ... %>
в JSP больше нет. Вместо этого вы должны использовать теги JSTL и выражения EL. Вопрос, связанный с Аникетом, - хорошее место для начала.
Я ценю, что это может быть вашим первым приложением JSP. Однако после того, как вы все заработаете, я бы порекомендовал вам рассмотреть возможность внесения этих изменений.
Цель метода getString () в классе ResultSet - вернуть данные из столбца, который вы указали как String. Это может принять два аргумента
Строка getString(String columnLabel) выбрасывает SQLException
Строка getString(String columnIndex) выбрасывает SQLException
Первый - это итерация ResultSet с использованием столбца для ex, как вы указали
String marca = rs.getString("marca");
второй может быть таким
String marca = rs.getString(1);
Также полностью повторяйте набор результатов до rs.next
чтобы получить все значения из таблицы. Подробнее здесь
Надеюсь, поможет!!