Следует ли использовать сеанс для обработки сообщения об ошибке для проверки формы? - PullRequest
1 голос
/ 25 августа 2010

Я создаю страницу регистрации и выполнил базовую проверку формы на стороне клиента.
Теперь я должен написать проверку на стороне сервера.

Что я сделал, так это вызов request.getParameter ():

String username = request.getParameter("username");

Тогда, если ввод имени пользователя недействителен, я помещаю сообщение об ошибке в ArrayList:

ArrayList<String> errors = new ArrayList<String>();
errors.add("username is not valid");

Затем добавьте объект ArrayList в переменную сеанса,

session.setAttribute("inputErrors", errors);

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

Но мне интересно, является ли использование сессии таким способом хорошим способом обработки сообщений об ошибках. Поскольку эта операция включает в себя только 2 страницы: например, пользовательский интерфейс регистрации (regis.jsp) и страницу, которая обрабатывает проверку и обработку ввода регистрации (process_regis.jsp). Насколько я понимаю, сеанс должен использоваться на нескольких страницах, в основном для зарегистрированных пользовательских данных.

пожалуйста, дайте мне знать, если вам нужно больше разъяснений.

1 Ответ

5 голосов
/ 25 августа 2010

Сеанс на стороне сервера распределяется между всеми запросами одного и того же сеанса клиента. Сеанс длится до тех пор, пока пользователь обращается к сайту в первый раз, пока не истечет срок действия сеанса (не используется в течение 30 минут (который настраивается)), или он не был явно признан недействительным. При вашем подходе откройте ту же страницу в новой вкладке браузера. Вы по-прежнему будете видеть сообщения об ошибках, пока форма на новой странице не будет введена / отправлена ​​вообще. Это не очень удобно для пользователя.

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

/WEB-INF/register.jsp

<form method="post" action="register">
    <p><label for="username">Username</label>
    <input type="text" id="username" name="username" value="${fn:escapeXml(param.username)}">
    <span class="error">${messages.username}</span>
    <p><label for="password">Password</label>
    <input type="password" id="password" name="password">
    <span class="error">${messages.password}</span>
    <p><label for="confirm">Confirm password <span class="required">*</span></label>
    <input type="password" id="confirm" name="confirm">
    <span class="error">${messages.confirm}</span>
    <p><input type="submit" value="Register">
    <p>${messages.result}</p>
</form>

com.example.RegisterServlet

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

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

    String username = request.getParameter("username");
    if (username == null  || username.trim().isEmpty()) {
        messages.put("username", "Please enter username");
    }

    // ...

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

Отобразите этот сервлет следующим образом в web.xml:

<servlet>
    <servlet-name>registerServlet</servlet-name>
    <servlet-class>com.example.RegisterServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>registerServlet</servlet-name>
    <url-pattern>/register</url-pattern>
</servlet-mapping>

Откройте его по http://example.com/context/register и продолжайте.

Смотри также

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...