Подтвердить что ты не робот

Должен ли я переопределить service() или doPost()?

Я читал книгу о сервлетах, в этой книге дается краткое объяснение относительно класса сервлета, а также класса HttpServlet.

Существует один пример заполнения формы - для этой формы метод сервлета doPost() переопределяется классом. Но для другого примера формы входа в систему вместо этого метод service() переопределяется.

Я хочу знать, почему два разных подхода - я думал, что обычно мы помещаем наш код в doPost() (или doGet()), и пусть service() остается таким, каким он есть. Есть ли какая-либо причина использования одного из двух подходов или я могу использовать оба подхода в любой ситуации?

4b9b3361

Ответ 1

Не переопределяйте метод service(). Предпочтительный подход заключается в использовании doPost() для сообщений и doGet() для get. Вот отличный пост о том, что каждый делает. http://www.jguru.com/faq/view.jsp?EID=47730

Если вы должны отвечать на запросы, сделанные клиентом, который не использует HTTP, вы должны использовать service().

Ответ 2

Я думаю, вам нужно понять поток, чтобы решить для себя. Реализация по умолчанию service() для HttpServlet просто вызывает соответствующий обработчик для метода запроса (GET, POST, что угодно).

Вам нужно переопределить service(), когда вы хотите, чтобы один и тот же метод обрабатывал все входящие методы (независимо от того, является ли он запросом GET, PUT или POST, вы ответите одинаково всем). Если вы довольны обработкой каждого метода отдельно, перейдите к реализации функции service() по умолчанию и переопределите конкретные обработчики.

Ответ 3

Вы, скорее всего, переопределите метод doXXX(), где XXX означает HTTP-методы, такие как GET, POST и т.д. service() метод, вызываемый контейнером, определит, какой из doXXX() будет вызываться.

Ответ 4

Метод service() относится к Genericservlet и может быть перегружен для поддержки любого типа протокола, такого как Http, Ftp и т.д.

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

Почему мы не должны переопределять метод service()?

Так как это не очень хорошая практика, чтобы переопределить метод службы. Если мы будем называть любой из методов doxxx, то внутри он вызовет метод службы HttpServlet. Поэтому вам не нужно явно называть это.

Порядок выполнения службы():

сервис (ServletRequest, ServletResponse) →

- > вызовы

- > service (HttpServletRequest req, HttpServletResponse res)

- > вызовы

- > doGet/doPost (HttpServletRequest req, HttpServletResponse res)

Вот как вы можете переопределить службу, если хотите:

protected void service(HttpServletRequest req, HttpServletResponse resp) {
String method = req.getMethod();

if (method.equals(METHOD_GET)) {
        doGet(req, resp);
} else if (method.equals(METHOD_HEAD)) {
    doHead(req, resp);
} else if (method.equals(METHOD_POST)) {
    doPost(req, resp);

} else if (method.equals(METHOD_PUT)) {
    doPut(req, resp);   

} else if (method.equals(METHOD_DELETE)) {
    doDelete(req, resp);

} else if (method.equals(METHOD_OPTIONS)) {
    doOptions(req,resp);

} else if (method.equals(METHOD_TRACE)) {
    doTrace(req,resp);

} else {
    resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED, errMsg);
}}

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

Ответ 5

Если вы должны отвечать на запросы GET или POST, сделанные клиентом протокола HTTP (обычно это браузер), не стесняйтесь распространять HttpServlet и использовать его методы удобства. Если вы должны отвечать на запросы, сделанные клиентом, который не использует протокол HTTP, вы должны использовать service()