• Post Reply Bookmark Topic Watch Topic
  • New Topic
programming forums Java Mobile Certification Databases Caching Books Engineering Micro Controllers OS Languages Paradigms IDEs Build Tools Frameworks Application Servers Open Source This Site Careers Other Pie Elite all forums
this forum made possible by our volunteer staff, including ...
Marshals:
  • Campbell Ritchie
  • Jeanne Boyarsky
  • Ron McLeod
  • Paul Clapham
  • Liutauras Vilda
Sheriffs:
  • paul wheaton
  • Rob Spoor
  • Devaka Cooray
Saloon Keepers:
  • Stephan van Hulst
  • Tim Holloway
  • Carey Brown
  • Frits Walraven
  • Tim Moores
Bartenders:
  • Mikalai Zaikin

what methods of HttpServlet are abstract?

 
Ranch Hand
Posts: 170
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
Hi,

Confusion # 1

I understand that HttpServlet class is an abstract class. But when i was going thru the specifications, i couldn't identify which methods of it are abstract.

Also i came accross the following statement in the specs.


A subclass of HttpServlet must override at least one method, usually one of these:

doGet, if the servlet supports HTTP GET requests
doPost, for HTTP POST requests
doPut, for HTTP PUT requests
doDelete, for HTTP DELETE requests
init and destroy, to manage resources that are held for the life of the servlet
getServletInfo, which the servlet uses to provide information about itself



Why is such requirement? From my SCJP exp., if i have an abstract class and i am sub-classing it, then i must implement all the abstract methods otherwise delcare the sub-class also abstract.

For example sake, i can compile my class which extends HttpServlet, even if i don't override doGet method. It means doGet method is not a abstract method.

I am assuming same is the case with rest of the methods too. In such case, why do i need to implement at least one of these methods? what rule is governing this?

Confusion # 2

Assuming doGet method is not an abstract method, HttpServlet class should provide implementation for the same. Is this correct?

Thank you in advacne!

Sekhar -- SCWCD 1.3 scheduled for September 10th!!
 
Ranch Hand
Posts: 81
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
You are right, this is confusing. If you look at the javadocs for HttpServlet it is declared as abstract still its methods are protected and none of those is abstracted. The answer to this is the Web Container like Tomcat etc, they are supposed to provide the default implementation for this class so that we should be able to use it. Hence all the methods mentioned here are not our responsibility to override. Obviously there is no point in writing servlet if we don't intercept the requests from clients hence it is required to at least implement one of the methods.

Secondly, if you look at the sibling classes of HttpSerlet namely HttpServletRequest and HttpServletResponse etc, all of these are interfaces and we don't implement those, but still we make use of these. The answer lies in the earlier explanations as these too are implemented by Server provider.
 
author
Posts: 199
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
Hello Sekhar,

The HttpServlet class is abstract, but all of its methods are implemented. There is nothing inherently wrong with this, but as you pointed out a little confusing. Java has no requirement that an abstract class must have one or more abstract methods. It just means that the class cannot be instantiated by the JVM (and enforced by the complier).

The reason why the doXyz methods are implemented is that the spec writers didn't want to force the servlet developer to have to implement all of these: doGet, doPost, doPut, doDelete, and so on. Most of these HTTP methods are of no interest to the casual servlet developer. So... the HttpServlet class implements all of these methods and the typical behavior is to send an 501 (Not Implemented) HTTP status code. Therefore, (as the javadocs state) you must override one or more of these methods to get the behaviour you are trying to achieve. So... the HttpServlet implementations are merely a convience for the servlet developer. Make sense?


-Bryan
 
Sekhar Kadiyala
Ranch Hand
Posts: 170
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
Thank you, Brayn. Things are little more clear now. But as a continuation of this discussion, if the methods are implemented (for example doGet) then, if my servlet doesn't have doGet method and i am trying to access the servlet thru address bar (which will invoke the HTTP method GET), then technically i shouldn't be getting the error as my servlet extends HttpServlet. But it does throw the error saying

doGet method not found

.

This is where i think i am still confused. If doGet method is already implemenetd, then i am assuming the default implementation wouldn't do anything, so even if i call my servlet without defining doGet, i should get no output, but not the error.
 
Bahadar Khan
Ranch Hand
Posts: 81
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
Thanks Bryan.

You have corrected me too. I was under the wrong assumption. And sorry Sekhar, I didn't mean to provide you with the wrong information. It was what I knew about this.

Thanks again Bryan.
 
Ranch Hand
Posts: 270
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
in weblogic 8.1, the default implementation is as follows:

 
Bryan Basham
author
Posts: 199
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator

Originally posted by Sekhar Kadiyala:
But as a continuation of this discussion, if the methods are implemented (for example doGet) then, if my servlet doesn't have doGet method and i am trying to access the servlet thru address bar (which will invoke the HTTP method GET), then technically i shouldn't be getting the error as my servlet extends HttpServlet. But it does throw the error saying doGet method not found



OK, there are "compiler errors" and "HTTP errors". In your scenario, you will not get a compiler error (because HttpServlet implements doGet), but you will get an HTTP error when you invoke the servlet from the browser. Is this the behavior that you are seeing? If so, then have I sufficiently explained why this is happening? If not, then please let me know what you see in the browser.

HTH,
Bryan
 
Sekhar Kadiyala
Ranch Hand
Posts: 170
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator

OK, there are "compiler errors" and "HTTP errors".



This point has made it all clear. Thank you very much!
 
Consider Paul's rocket mass heater.
reply
    Bookmark Topic Watch Topic
  • New Topic