request.getParameter не имеет нулевых значений, когда они ожидаются

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

Я изучаю JSP и связанные с ним технологии. Что я пытаюсь сделать, так это получить параметры из JSP в сервлет, а затем использовать их с If(). Вот часть моей кодировки.

if ((request.getParameter("ID_A") != null || request.getParameter("Password_A") != null) &&
    (request.getParameter("ID_B") != null || request.getParameter("Password_B") != null)) {

        errorMessage = "Information is detected for the both side";
        request.setAttribute("errorMessage", errorMessage);
        request.getRequestDispatcher("4_enter_personal_info.jsp").forward(request, response);
    } // Other conditions...

Вот часть JSP (предыдущий шаг)

<form action="PersonalInfor_to_confirmation_servlet" method="POST">
    <h2>For an existing customer</h2>
        <p>Customer ID</p>
        <input type="text" name="ID_A" value="" />
        <p>Password</p>
        <input type="text" name="Password_A" value="" />
        <br>
    <h2>For a new customer</h2>
        <p>Set your customer ID</p>
        <input type="text" name="ID_B" value="" />
        <p>Set your password</p>
        <input type="text" name="Password_B" value="" />
    //There are other lines
</form>

Я пытаюсь убедиться, что когда клиент введет информацию с обеих сторон (For an existing customer/For a new customer), на JSP появится указанное выше сообщение "Information is detected for the both side".

Однако даже если все текстовые поля пусты, появляется сообщение об ошибке. Таким образом, все приведенные выше методы request.getParameter( ) не содержат нулевых значений, даже если я сделаю их пустыми.

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

Любые советы будут оценены.


person Hiroki    schedule 13.01.2015    source источник
comment
Связанный: stackoverflow.com/questions/7109419/   -  person BalusC    schedule 13.01.2015


Ответы (2)


Причина, по которой выполняются операторы в блоке if, заключается в том, что поле существует. Если вы не хотите запускать его, когда текстовые поля пусты, вам следует включить в свое условие проверку, содержит ли параметр пустую строку, например:

request.getParameter("ID_A") != null && !request.getParameter("ID_A").isEmpty()
|| request.getParameter("Password_A") && !request.getParameter("Password_A").isEmpty()
...

Таким образом, все приведенные выше методы request.getParameter() не содержат пустых значений, даже если я делаю их пустыми.

Да. Когда getParamater() возвращает значение null, это означает, что он не может найти в форме поле с таким именем. Используйте другой метод: isEmpty(), чтобы проверить, пусто поле или нет. Такие как:

request.getParameter("noSuchField")==null //true
request.getParameter("ID_A")==null //false
request.getParameter("ID_A").isEmpty() //true
person lxcky    schedule 13.01.2015
comment
Большое спасибо. Этот способ выглядит лаконичным и, пожалуй, лучшим. Итак, в мире JSP быть нулевым — это не значит быть пустым... верно? - person Hiroki; 13.01.2015
comment
@YMD, да. null и пустые строки совершенно разные. Просто помните, что каждое поле в вашей форме при отправке не равно null, они по умолчанию имеют значение пустой строки "". Поэтому не забудьте также включить isEmpty() в свою проверку. - person lxcky; 13.01.2015
comment
Спасибо, профессор... Я думал, что a String variable of value "" будет распознан как null, но это НЕ для JSP. Большое спасибо. - person Hiroki; 13.01.2015
comment
@YMD, но пустая строка и null тоже не одно и то же в Java. Я рад, что смог помочь. Просто прочитайте и попробуйте кодировать. Вы получите его достаточно скоро. Удачи! :) - person lxcky; 13.01.2015

<input type="text" name="ID_A" value="" />

Когда вы отправляете форму таким образом, у вас будет ID_A в качестве ключа и "" (пустая строка) в качестве значения. Способ получить нулевое значение состоит в том, чтобы вообще не отправлять ID_A с любым значением.

Хорошим способом обойти это было бы явно проверить пустую строку:

private boolean isNullOrBlank(final String s) {
    return s == null || s.trim().length() == 0;
}

if ((isNullOrBlank(request.getParameter("ID_A"))||
     isNullOrBlank(request.getParameter("Password_A"))
    ) &&
    (isNullOrBlank(request.getParameter("ID_B"))|| 
     isNullOrBlank(request.getParameter("Password_B")))) {
 ...
}
person Todd    schedule 13.01.2015