Как выполнить проверку и отображение сообщения об ошибке в той же форме в JSP?

Как я могу отобразить сообщение об ошибке в том же JSP, когда пользователь вводит неправильный ввод? Я не собираюсь создавать исключение и показывать страницу с ошибкой.

Ответы

Ответ 1

Проще всего было бы иметь заполнители для сообщений об ошибках проверки в вашем JSP.

JSP /WEB-INF/foo.jsp:

<form action="${pageContext.request.contextPath}/foo" method="post">
    <label for="foo">Foo</label>
    <input id="foo" name="foo" value="${fn:escapeXml(param.foo)}">
    <span class="error">${messages.foo}</span>
    <br />
    <label for="bar">Bar</label>
    <input id="bar" name="bar" value="${fn:escapeXml(param.bar)}">
    <span class="error">${messages.bar}</span>
    <br />
    ...
    <input type="submit">
    <span class="success">${messages.success}</span>
</form>

В servlet, куда вы отправляете форму, вы можете использовать Map<String, String> для получения сообщений, которые должны отображаться в JSP.

Сервлета @WebServlet("foo"):

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    request.getRequestDispatcher("/WEB-INF/foo.jsp").forward(request, response);
}

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    Map<String, String> messages = new HashMap<String, String>();
    request.setAttribute("messages", messages); // Now it available by ${messages}

    String foo = request.getParameter("foo");
    if (foo == null || foo.trim().isEmpty()) {
        messages.put("foo", "Please enter foo");
    } else if (!foo.matches("\\p{Alnum}+")) {
        messages.put("foo", "Please enter alphanumeric characters only");
    }

    String bar = request.getParameter("bar");
    if (bar == null || bar.trim().isEmpty()) {
        messages.put("bar", "Please enter bar");
    } else if (!bar.matches("\\d+")) {
        messages.put("bar", "Please enter digits only");
    }

    // ...

    if (messages.isEmpty()) {
        messages.put("success", "Form successfully submitted!");
    }

    request.getRequestDispatcher("/WEB-INF/foo.jsp").forward(request, response);
}

Если вы создаете больше JSP-страниц и сервлетов, делающих все больше и больше, и начинайте замечать, что это, в конце концов, много повторяющегося шаблона кода, а затем рассмотрите возможность использования структуры MVC.

См. также:

Ответ 2

Я вижу тег "form-validation", поэтому, возможно, вам следует просто использовать проверку JavaScript и клиентской формы? Если вам нужна проверка с помощью JSP, обработайте данные формы и повторно отобразите форму с сообщением об ошибке или примите данные формы, если она будет исправлена.

Ответ 3

Я не совсем уверен, что вы подразумеваете под "отображением сообщения об ошибке". Если у вас стандартная обработка ошибок, вы всегда можете проверить параметры:

<%
    if(wrong option selected)
        throw new Exception("Invalid option selected");
%>

Конечно, это только понятие; желательно, чтобы у вас был свой собственный класс исключений. Но опять же, я не совсем уверен, что вы после.