Как можно использовать интерфейсные методы без необходимости их реализации?

#java #http #servlets #request

Вопрос:

Это основной вопрос интерфейса Java, но в контексте сервлетов.

Я понимаю, что интерфейсы полностью абстрактны в том смысле, что ни один из их методов не может иметь реализаций, отличных от абстрактных классов. HttpServletRequest-это интерфейс. При создании сервлетов методы doPost() и doGet() используют этот интерфейс с кодом:

 doPost(HttpServletRequest request, HttpServletResponse response){ // implementation }  

Мои вопросы таковы:

  • Что такое запрос и ответ? Являются ли они объектами?
  • Учитывая, что методы интерфейса не реализованы и что нам обычно не требуется реализовывать методы интерфейса при создании сервлета, как реализуются методы «запроса», как показано в коде.
     request.getParameter()  

Комментарии:

1. Это объекты, реализующие интерфейс. Объекты создаются сервером (например, Tomcat).

Ответ №1:

Что такое запрос и ответ? Являются ли они объектами?

Это просто ссылки, указывающие на некоторые объекты, как и любая другая ссылка. Здесь нет ничего особенного.

как реализуются методы » запроса’, как показано в коде.

HttpServletRequest это просто API, реализация которого обеспечивается контейнером сервлетов, который вы используете (вероятно, tomcat). Внутренне для каждого запроса контейнер будет создавать объект HttpServletRequest и HttpServletResponse реализацию и передавать его вашему doPost doGet методу или.

Комментарии:

1. Итак, вы хотите сказать, что response-это ссылка на объект, созданный Tomcat, который реализует методы, указанные в интерфейсе HttpServletResponse, и что всякий раз, когда вы вызываете response.getParameter (), вы на самом деле используете метод getParameter() объекта, на который ссылается response?

2. Кроме того, если контейнер сервлета создает объект для вас, разве мы не зависим от этого контейнера? Я имею в виду, что в более общем случае мы не смогли бы просто использовать интерфейс, объявив ссылку аналогичным образом, если бы мы сами не реализовали ее правильно?

3. @user3111418 HttpServletRequest является частью спецификации сервлета. Контейнер Tomcat и другие контейнеры, если на то пошло, являются реализацией для этой спецификации. Реализация, которую они предоставляют, должна соответствовать спецификациям. И да, вы зависите от этих контейнеров. Можно также создать свой собственный контейнер, соответствующий спецификациям сервлета, и вы можете развернуть там приложение. Ничего страшного. Но дело в том, что кто-то должен обеспечить реализацию.

4. Таким образом, даже если вы зависите от контейнера tomcat, вы не тесно связаны с ним. Вы можете использовать любой другой контейнер.

Ответ №2:

Вы получаете ссылку на объект класса, который фактически реализует HttpServletRequest .

Теперь, как вы получаете этот объект, веб-сервер инициализирует этот объект и вызывает ваш doGet doPost метод или, передавая эту ссылку в качестве параметра.