Я кодировал простой сервлет. который просто печатает значения, переданные пользователем, или в соответствующие параметры 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, поэтому почему они не работают остался только один из них? Примечание. Я очень хорошо знаю жизненный цикл сервлета и другие связанные понятия, поэтому, пожалуйста, не объясняйте все эти понятия.
Метод службы в классе 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, и ваша служба будет генерировать исключение "Невозможно реализовать метод", но если вы переопределите метод службы, ответ, ваш код сервлета будет выполнен в любом случае.
Могут существовать такие сценарии, как вы хотите ответить на GET
определенным образом и запрос POST
. Запросы GET
обычно предназначены для простого извлечения данных и их возврата. И запрос POST
предназначен для обновления некоторых вещей в бэкэнде. Это почему он называется idempotent. Но если бы вы переопределили метод службы, у вас будет только один способ ответа.
У вас есть doGet и doPost, чтобы сервлет мог реагировать по-разному в зависимости от HTTP-глагола, который используется при доступе к нему.
Спецификация также определяет doHead, doOptions и т.д.
Метод службы может обслуживать запросы Get и Post.
Но предположим, что существует сценарий, в котором вы хотите застраховать, чтобы никто не набрал ваш сервлет, кроме использования запросов POST, например: при отправке запроса на вход
если вы разрешаете кому-либо использовать GET в таком сценарии; вы будете создавать серьезные уязвимости безопасности (поскольку запросы GET будут раскрывать всю информацию о пользователе в URL-адресе)
Таким образом, вы реализуете метод POST в качестве гарантии.