Использование метода Service в Servlet, когда уже есть doGet и другие 6 методов.

1

Я кодировал простой сервлет. который просто печатает значения, переданные пользователем, или в соответствующие параметры URL. Теперь, внедряя метод doGet, я увидел, что одна и та же функция также может быть выполнена методом обслуживания. Код для этого ниже:

protected void service(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException {


    PrintWriter o = resp.getWriter();
    String user = req.getParameter("username");

    HttpSession session = req.getSession();
    ServletContext context = req.getServletContext();

    if (user != "" && user != null) {

        session.setAttribute("myhuzu", user);
        context.setAttribute("myhuzu", user);
    }

    o.println("request parameter has value " + user);
    o.println("session parameter  has user name as "
            + session.getAttribute("myhuzu"));

    o.println("context parameter  has user name as "
            + context.getAttribute("myhuzu"));

    o.println("init parameter  has user name as "
            + getServletConfig().getInitParameter("default"));


}

}

Поэтому мой вопрос: зачем нам нужны методы doGet или doPOST, когда сам метод обслуживания заботится обо всех этих вещах. Поскольку приведенный выше код работает идеально, он также отлично работает, если он хранится в методе doGet, поэтому почему они не работают остался только один из них? Примечание. Я очень хорошо знаю жизненный цикл сервлета и другие связанные понятия, поэтому, пожалуйста, не объясняйте все эти понятия.

  • 0
    Пожалуйста, используйте английскую пунктуацию при написании на английском языке.
Теги:
jsp
servlets
java-ee

4 ответа

3
Лучший ответ

Метод службы в классе HttpServlet проверяет, какой метод находится в запросе на голову и перенаправляется на указанный метод, например, когда его запрос на получение будет вызван методом doGet, его используется, когда ваш сервлет будет отвечать с разной целью для разных методов, например, в служба REST, когда у вас есть запрос GET, вы вернете информацию, но когда у вас есть запрос PUT, вы обновите информацию, поэтому сервлет предоставит вам этот метод.

Кроме того, он гарантирует, что сервлет не ответит на неправильный запрос, используя метод обслуживания, как вы, я могу вызвать ваш сервлет даже со странным запросом типа "запрос метода TEST", и сервлет ответит и сохранит ваш код чистым,

См. Исходный код услуги:

protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String method = req.getMethod();
        long errMsg;
        if(method.equals("GET")) {
            errMsg = this.getLastModified(req);
            if(errMsg == -1L) {
                this.doGet(req, resp);
            } else {
                long ifModifiedSince = req.getDateHeader("If-Modified-Since");
                if(ifModifiedSince < errMsg) {
                    this.maybeSetLastModified(resp, errMsg);
                    this.doGet(req, resp);
                } else {
                    resp.setStatus(304);
                }
            }
        } else if(method.equals("HEAD")) {
            errMsg = this.getLastModified(req);
            this.maybeSetLastModified(resp, errMsg);
            this.doHead(req, resp);
        } else if(method.equals("POST")) {
            this.doPost(req, resp);
        } else if(method.equals("PUT")) {
            this.doPut(req, resp);
        } else if(method.equals("DELETE")) {
            this.doDelete(req, resp);
        } else if(method.equals("OPTIONS")) {
            this.doOptions(req, resp);
        } else if(method.equals("TRACE")) {
            this.doTrace(req, resp);
        } else {
            String errMsg1 = lStrings.getString("http.method_not_implemented");
            Object[] errArgs = new Object[]{method};
            errMsg1 = MessageFormat.format(errMsg1, errArgs);
            resp.sendError(501, errMsg1);
        }

    }

Он реагирует в зависимости от того, какой метод запроса используется.

Если вы выполняете пользовательский HTTP-запрос, вы можете установить нужный метод, вместо GET или PUT или DELETE вы можете отправить TEST, и ваша служба будет генерировать исключение "Невозможно реализовать метод", но если вы переопределите метод службы, ответ, ваш код сервлета будет выполнен в любом случае.

  • 0
    Можете ли вы объяснить подробно, что вы подразумеваете под "я могу вызвать ваш сервлет даже со странным запросом типа" запрос метода TEST ", и сервлет ответит и сохранит ваш код чище". ? Спасибо.
  • 0
    Я обновил свой ответ, теперь вы понимаете?
Показать ещё 2 комментария
1

Могут существовать такие сценарии, как вы хотите ответить на GET определенным образом и запрос POST. Запросы GET обычно предназначены для простого извлечения данных и их возврата. И запрос POST предназначен для обновления некоторых вещей в бэкэнде. Это почему он называется idempotent. Но если бы вы переопределили метод службы, у вас будет только один способ ответа.

1

У вас есть doGet и doPost, чтобы сервлет мог реагировать по-разному в зависимости от HTTP-глагола, который используется при доступе к нему.

Спецификация также определяет doHead, doOptions и т.д.

  • 0
    Это не близко к моему ответу, о котором я спрашивал. Также я уже сказал, что знаю об основах сервлета. поэтому, пожалуйста, прочитайте мой вопрос правильно. Спасибо.
  • 0
    Отлично, @huzefabiyawarwala - вы добавили себя в мой список людей, которых я не буду беспокоить, пытаясь снова помочь. И я бы сказал, что мой ответ охватывает «Итак, мой вопрос: зачем нам нужны методы doGet или doPOST», довольно кратко, не так ли?
Показать ещё 1 комментарий
0

Метод службы может обслуживать запросы Get и Post.

Но предположим, что существует сценарий, в котором вы хотите застраховать, чтобы никто не набрал ваш сервлет, кроме использования запросов POST, например: при отправке запроса на вход

если вы разрешаете кому-либо использовать GET в таком сценарии; вы будете создавать серьезные уязвимости безопасности (поскольку запросы GET будут раскрывать всю информацию о пользователе в URL-адресе)

Таким образом, вы реализуете метод POST в качестве гарантии.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню