Проверка номеров с помощью сервлетов и JSP - PullRequest
3 голосов
/ 31 марта 2011

Я работаю над небольшим приложением Servlets & JSP при изучении веб-разработки.

У меня есть вопрос, касающийся проверок и передачи значений между jsp и сервлетами.

У меня есть "Пиво""class, со свойством" rating "(типа double).

Сервлет, который загружает" edit.jsp ", создает объект Beer и загружает текущие значения из БД.

BeerDAO beerdao = new BeerDAO();
Beer beer = beerdao.getBeer(id);            
request.setAttribute("beer", beer);

В JSP объект отображается следующим образом:

...
<td class="left">Beer Name:</td>
<td><input type="text" name="name" value="${beer.name}"/></td>
...
<td class="left">Rating:</td>
<td><input type="text" name="rating" value="${beer.rating}"/></td>
...

Теперь, когда я отправляю форму сервлету "update", каждое свойство проверяется.В случае свойства "rating" я конвертирую его в двойное значение.

Если я обнаружу ошибку в проверке (т. Е. Буквы вместо цифр для значения рейтинга), я хочу вернуться назад.к форме со значениями, которые пользователь ввел, и сообщением об ошибке.Дело в том, что мне нужно, чтобы объект Beer в запросе отображался в форме, но я не могу передать ему значение «rating», потому что оно имеет неправильный тип.Поэтому сейчас я отправляю пользователя обратно в форму с пустым рейтингом.

Полагаю, я ошибаюсь.Итак, каков будет правильный способ проверки чисел и возврата к форме редактирования?

1 Ответ

4 голосов
/ 31 марта 2011

Самым основным подходом было бы иметь Map<String, String> в области запроса, где ключ представляет имя поля, а значение представляет ошибку проверки -если любой.

BeerDAO beerdao = new BeerDAO();
Beer beer = beerdao.getBeer(id);            
request.setAttribute("beer", beer);
// ...

Map<String, String> messages = new HashMap<String, String>();
request.setAttribute("messages", messages);
// ...

String rating = request.getParameter("rating");
if (rating == null) {
    messages.put("rating", "Please enter rating");
} else if (!rating.matches("\\d+")) {
    messages.put("rating", "Please enter numbers only");
} else {
    beer.setRating(Integer.valueOf(rating));
}

// ...

А потом в поле зрения

<input name="rating" value="${empty messages.rating ? beer.rating : param.rating}" />
<span class="error">${messages.rating}</span>

Условное выражение покажет рейтинг пива, когда сообщения нет (и, следовательно, проверка прошла успешно), а в противном случае пользовательское значение будет указано в качестве параметра запроса.


Не связано с конкретной проблемой, повторное отображение предоставленных пользователем данных без экранирования XML может быть подвержено XSS атакам . Я настоятельно рекомендую установить JSTL и использовать функцию fn:escapeXml() для экранирования значений.

<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>   
...
<input name="rating" value="${fn:escapeXml(empty messages.rating ? beer.rating : param.rating)}" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...