2013-09-20 4 views
10

HttpServlet - это абстрактный класс со всеми реализованными методами. Почему это абстрактно?Почему HTTPServlet - абстрактный класс? Любая функциональная причина?

Самый общий ответ, который я получил, - это ограничение экземпляра HttpServlet. Но есть и другие способы сделать это, например, частный конструктор будет ограничивать экземпляр.

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

Но если HttpServlet не был абстрактным, пользователь все равно может его расширить и переопределить требуемые методы.

По крайней мере, по смыслу словаря слова «абстрактное», для меня нет никакого смысла иметь абстрактный класс со всем реализованным методом.

Да, сочетание абстрактных и конкретных методов в порядке.

Но если вы делаете абстракцию классов, почему бы не сделать те методы абстрактными, которые подкласс должен переопределить? или может вообще не объявлять его абстрактным?

Нравится doGet() или doPost() В этом случае.

+1

Вы все же можете создать анонимный класс, например новый HTTPServlet() {}; ничто не определено. Я думаю, что вся идея заключается в том, чтобы использовать его как родительский сервлет со всем необходимым набором, он не абстрактный из-за наличия абстрактных методов, а из-за смысла. Нет такой вещи, как «сервлет», но «MyServlet» – porfiriopartida

+0

Так что в основном абстрактно указать пользователю, что вы должны обеспечить реализацию своего сервлета. Но это было необходимо? Я имею в виду, почему они не делают его нормальным классом с определением в javadocs, говорящим, что вам нужно предоставить реализацию для вашего сервлета. Я хочу сказать, что это излишне усложняет использование абстрактного ключевого слова для новичков. – rockyPeoplesChamp

+0

Вы можете предоставить doGet без doPost, это означает, что сервлет не поддерживает doPost. Вы можете увидеть код здесь: http://grepcode.com/file/repo1.maven.org/maven2/javax.servlet/servlet-api/2.5/javax/servlet/http/HttpServlet.java И все же у вас может быть сервлет без какой-либо реализации, а затем он будет бросать не поддерживаемые ошибки, не исключение, а функциональные ошибки. – porfiriopartida

ответ

11

Чтобы иметь какое-либо полезное поведение, ожидается, что вам придется переопределить методы. HttpServlet не имеет полезных функций самостоятельно.

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

Дизайн HttpServlet, вероятно, не идеален - как на многих страницах, особенно формы, логика GET и POST должна протекать хотя бы частично по общему пути. Однако идея дизайна HttpServlet заключалась в том, чтобы предложить doGet(), doPost() и т. Д. Реализации, ответившие на ошибку «не поддерживается» в зависимости от версии HTTP. Эти заглушки были бы полезны для наследования, если бы вам нужно было вернуть такой ответ.

В итоге, API/интерфейс завершена - но функциональность окончательно нет. Таким образом, оно объявлено как аннотация.

8

HTTPServlet - это абстрактный класс со всеми реализованными методами. Тогда почему это абстрактно?

Это абстрактно, потому что реализации ключевых методов должны быть предоставлены (например, переопределены) собственным классом сервлета.Как Javadoc говорит:

Подкласс HttpServlet должны переопределить по крайней мере один способ, как правило, один из них:

  • doGet, если сервлет поддерживает HTTP GET запросы
  • doPost, для POST HTTP просит
  • doPut, для HTTP PUT запросы
  • doDelete, для HTTP DELETE Спросы
  • инициализации и уничтожить, чтобы управлять ресурсами, которые Хель d для жизни сервлета
  • getServletInfo, который сервлет использует для предоставления информации о себе

Если расширить класс без отвергая любые методы, вы получите бесполезный сервлет; то есть тот, который дает ответ об ошибке для всех запросов. Аналогично, если класс не был abstract, то любой прямой экземпляр HttpServlet был бы бесполезен.

Следовательно, причина для создания HttpServlet класса abstract заключается в предотвращении (наивной) ошибки программиста.


Для записи, причина для обеспечения реализации всех методов, чтобы сделать жизнь проще для программиста, предоставляя поведение по умолчанию. Например, если я не хочу, чтобы мой сервлет поддерживал запросы DELETE, реализация по умолчанию для doDelete будет удобно отправлять ответ с кодом ответа «Метод не поддерживается».

1

Вы вынуждены расширять HttpServlet, потому что вам нужно добавить к нему свою конкретную логику приложения. Вот определение абстрактного класса в соответствии с мужчинами оракула:

«Абстрактный класс - это класс, объявленный абстрактом - он может включать или не включать абстрактные методы. Абстрактные классы не могут быть созданы, но они могут быть подклассами. "

http://docs.oracle.com/javase/tutorial/java/IandI/abstract.html

Причина: Мы все знаем, что HttpServlet оленьей кожи есть какие-либо абстрактный метод. Он содержит все конкретные методы. Но все же этот класс хранится абстрактно. Причина очень проста. Наш собственный класс может выступать в роли сервлета, только когда он расширяет класс HttpServlet или GenericServlet или реализует интерфейс Servlet. Если класс HttpServlet не будет содержать абстрактные данные, вам не будет предложено расширить этот класс, и ваш класс не будет действовать как Servlet.

ServletContainer использует instanceOf(), чтобы узнать, является ли ваш класс дочерним по отношению к интерфейсу HttpServlet или GenericServlet или Servlet. Поскольку ваш класс не является дочерним по отношению к классу HttpServlet, GenericServlet или внедренному интерфейсу Servlet, instanceOf() завершится с ошибкой.

-1

В принципе, у нас есть абстрактный класс (HttpServlet) без абстрактного метода или только конкретный метод. Где наш класс сервлета реализует javax.servlet.Servlet напрямую (в случае RMI и CORBA) или косвенно (расширение общего или HTTPServlet).

Как Интерфейс имеет 3 основных методов (init(), service() и destroy()), которая реализована в HttpServlet (абстрактный класс), который продолженные вашего класса сервлета, которые обрабатывают запросы браузера к серверу, используя эти три метода. И в зависимости от типа метода HTTP-запроса наш класс сервлета (путем расширения HttpServlet) использует соответствующий метод do[xxx], который в большинстве случаев составляет doGet или doPost. Если у нас есть все методы или некоторые из методов httpServlet как абстрактного метода, мы должны реализовать весь или часть абстрактного метода, которые присутствуют в нашем подклассе сервлетов, но мы должны реализовать только те методы, которые необходимы для обработки Запрос метода HTTP. Таким образом, по моему мнению, конкретный метод в абстрактном классе обеспечивает свободу реализации в зависимости от логики HTTP-запроса.

+0

Бег в сплошную стену текста не менее болезненен, чем бег в сплошную стену из кирпича. (Хорошо, немного менее болезненным.) – mah

+0

И вы на самом деле не отвечаете на вопрос. Вопрос: * ** Почему ** HTTPServlet - абстрактный класс? Любая функциональная причина? »* –

-1

Для этого есть две причины.

  1. Во-первых, чтобы вы не могли создать объект класса HttpServlet. Предположим, что он не был защищен, тогда мы могли бы создать объект этого класса, который был бы бесполезным.
  2. Второй Защищенный метод в классе HttpServlet. Таким образом, чтобы получить доступ к защищенной вещи класса, чтобы иметь функцию Servlet в вашем классе реализации, вы должны расширить этот класс. Поэтому в основном это вынуждает программиста расширять класс HttpServlet.
+0

Почему вы повторяете уже данный ответ? – BalusC

-1

В основном HttpServlet не содержит абстрактного метода, его единственный метод службы жизненного цикла (-, -), который является абстрактным. А также предоставляет 7 doXXX() не абстрактных методов без какой-либо прикладной логики для отправки 404 ошибки в качестве ответа. Таким образом, расширенному классу класса HTTPServlet не нужно реализовывать методы doXXX() , чтобы сообщить разработчикам Java, что класс HttpServlet не полностью реализован класс класса HttpServlet, сделанный как абстрактный.

+0

Почему вы повторяете уже данный ответ? –

Смежные вопросы