Ответ 1
Наиболее распространенный и рекомендуемый сценарий (для проверки на стороне сервера в мире Java serlvets/JSP) устанавливает некоторое сообщение об ошибке как атрибут запроса (в области запроса), а затем вывод этого сообщения в JSP с использованием Язык выражения (см. пример ниже). Когда сообщение об ошибке не установлено - ничего не будет показано.
Но при сохранении сообщения об ошибке в запросе вы должны перенаправить запрос на начальную страницу. Установка атрибута запроса не подходит при перенаправлении, потому что если вы используете перенаправление, это будет запрос NEW и атрибуты запроса reset между запросами.
Если вы хотите перенаправить запрос на ссылочную страницу (ту, с которой вы отправили данные), вы можете сохранить сообщение об ошибке в сеансе (в области сеанса), то есть установить атрибут сеанса. Но в этом случае вам также необходимо удалить этот атрибут из сеанса, когда представленный запрос будет правильным, поскольку в противном случае сообщение об ошибке будет доступно до тех пор, пока сессия не будет работать.
Что касается атрибута контекста, он должен быть доступен для всего веб-приложения (область приложения) и для ВСЕХ пользователей, плюс он живет до тех пор, пока работает веб-приложение, что вряд ли полезно в твоем случае. Если вы установите сообщение об ошибке как атрибут приложения , он будет отображаться для ВСЕХ пользователей, а не только для тех, которые отправили неверные данные.
ОК, вот примитивный пример.
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<display-name>Test application</display-name>
<servlet>
<servlet-name>Order Servlet</servlet-name>
<servlet-class>com.example.TestOrderServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Order Servlet</servlet-name>
<url-pattern>/MakeOrder.do</url-pattern>
</servlet-mapping>
</web-app>
order.jsp
<!DOCTYPE html>
<html>
<head>
<title>Test Page</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<h1>Test page</h1>
<form action="MakeOrder.do" method="post">
<div style="color: #FF0000;">${errorMessage}</div>
<p>Enter amount: <input type="text" name="itemAmount" /></p>
<input type="submit" value="Submit Data" />
</form>
</body>
</html>
Вариант №1: установка сообщения об ошибке в качестве атрибута запроса
package com.example;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.ServletException;
import java.io.IOException;
public class TestOrderServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
int amount = 0;
try {
amount = Integer.parseInt(request.getParameter("itemAmount"));
} catch (NumberFormatException e) {
// do something or whatever
}
if ((amount > 0) && (amount < 100)) { // an amount is OK
request.getRequestDispatcher("/index.jsp").forward(request, response);
} else { // invalid amount
// Set some error message as a request attribute.
if (amount <= 0) {
request.setAttribute("errorMessage", "Please submit an amount of at least 1");
}
if (amount > 100){
request.setAttribute("errorMessage", "Amount of items ordered is too big. No more than 100 is currently available.");
}
// get back to order.jsp page using forward
request.getRequestDispatcher("/order.jsp").forward(request, response);
}
}
}
Вариант №2: установка сообщения об ошибке как атрибута сеанса
TestOrderServlet.java
package com.example;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.ServletException;
import java.io.IOException;
public class TestOrderServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
int amount = 0;
try {
amount = Integer.parseInt(request.getParameter("itemAmount"));
} catch (NumberFormatException e) {
// do something or whatever
}
if ((amount > 0) && (amount < 100)) { // an amount is OK
// If the session does not have an object bound with the specified name, the removeAttribute() method does nothing.
request.getSession().removeAttribute("errorMessage");
request.getRequestDispatcher("/index.jsp").forward(request, response);
} else { // invalid amount
// Set some error message as a Session attribute.
if (amount <= 0) {
request.getSession().setAttribute("errorMessage", "Please submit an amount of at least 1");
}
if (amount > 100){
request.getSession().setAttribute("errorMessage", "Amount of items ordered is too big. No more than 100 is currently available.");
}
// get back to the referer page using redirect
response.sendRedirect(request.getHeader("Referer"));
}
}
}
Связанное чтение: