как остановить сервлет? - PullRequest
4 голосов
/ 09 марта 2011

У меня есть сервлет, который выглядит так:

public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException{
    String param1 = request.getParameter("param1");
    String param2 = request.getParameter("param2");

    validateInput(param1, param2, request, response);

    //if nothing's wrong with the input, do this and that
}


private void validateInput(String param1, String param2, HttpServletRequest request, HttpServletResponse response) throws IOException{
    boolean fail = false;

    //validate input blah blah blah

    if (fail){
        PrintWriter out = response.getWriter();
        out.write("invalid input");
        //end process or servlet
    }
}

Идея состоит в том, что я хочу передать param1 и param2 в функцию validateInput(), чтобы проверить, является ли ввод действительным. Если ввод неверен, напишите сообщение обратно и затем завершите процесс. У меня вопрос как завершить процесс? Я знаю, что вызов return; в doPost() завершит процесс, но я пытаюсь избежать возврата любого значения от validateInput() до doPost() только ради окончания процесса. Лично я чувствую, что так удобнее читать, чем возвращать true или false на doPost() и звонить туда return;. Есть ли способ сделать это? Или это просто невозможно?

Ответы [ 7 ]

9 голосов
/ 09 марта 2011
public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException{
    String param1 = request.getParameter("param1");
    String param2 = request.getParameter("param2");

    if(!isValidInput(param1, param2)){
        PrintWriter out = response.getWriter();
        out.write("invalid input");
        return;
    }

    //if nothing's wrong with the input, do this and that

}


private boolean isValidInput(String param1, String param2){
    boolean fail = false;
    //validate input and return true/false

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

Элемент управления всегда будет возвращаться к doPost после выполнения validateInput, если только вы не сгенерируете исключение (либо исключение без проверки, либо IOException в данном случае).

Таким образом, если вы не вернете ЛЮБОЕ значение от validateInput до doPost, даже если вы передадите ответ, doPost все равно продолжит делать то, что должен был сделать. (Конечно, если ответ будет принят, браузер не будет знать о каких-либо дальнейших действиях на стороне сервера).

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

1 голос
/ 20 июня 2012

Попробуйте это:

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

response.sendError позволит вам сделать страницу с общей ошибкой (см .: http://blogs.atlassian.com/2007/07/responsesenderror_vs_responses/) вместо вашего вывода. Если вы хотите, чтобы вы хотели setStatus (снова, см. Ссылку).

Возврат должен прекратить выполнение и не дать остальным произойти, но он не выключитсервлет, как system.exit (0).

public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException{
    String param1 = request.getParameter("param1");
    String param2 = request.getParameter("param2");

    if (! validateInput(param1, param2, request, response)){
        response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
        //Or you can use this instead... 
        //response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
        //PrintWriter out = response.getWriter();
        //out.write("invalid input");
        return;
    }
    //if nothing's wrong with the input, do this and that
}




private boolean validateInput(String param1, String param2, HttpServletRequest request, HttpServletResponse response) throws IOException{
    boolean success = false;

    //validate input blah blah blah

    return success;
}
1 голос
/ 09 марта 2011

Что вы называете «процессом»? Это единственный запрос? Если да, то отправка сообщения обратно прекращает ответственность сервлета. HTTP - это протокол запроса / ответа.

Если вы хотите остановить сервлет, это неправильно. Сервлет работает в контейнере, который все еще собирается. Он ждет следующего запроса.

Я не вижу ничего, что заслуживает остановки. Валидация и обратная маршрутизация с ошибками распространены.

1 голос
/ 09 марта 2011

Более изощренный способ был бы.

  • validate и setAttributes для запроса при обнаружении ошибки и forward request для jsp
  • на jsp проверяет наличие атрибута ошибки, если он есть у любого присутствующего

См. Также

0 голосов
/ 09 марта 2011

Звучит так, как будто вы хотите получить ссылку на OutputStream для записи HTML обратно клиенту?

Вы можете использовать response.getOutputStream(), который возвращает ServletOutputStream.

После того как вы написали в этот поток, вам нужно закончить.После этого вам нужно будет набрать close() и flush().

Все, что вы напишете в этот поток, будет отправлено в браузер.Также не забудьте вызвать response.setContentType("text/html");, чтобы браузер знал, что он имеет дело с HTML.

0 голосов
/ 09 марта 2011

пробовали ли вы с одним из следующих

response.sendRedirect("some view.jsp");

(или)

System.exit(0); // which exits from the program

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