First thing is that the constructor of the servlet is called by the container, we cannot call it. So we cannot add anything into the constructor.Moreover, at that time, it is just another java objectnot a servlet.So it cannot have any servlet specific parameters,like ServletConfig , which we can use.
For example,for every request from the clinet, the servlet has to look into the database(or something of that sort),so we have to set up the database connection set-up,login etc. for every request.
We have to make the servlet ready to have a connection to the database/resource before any client requests come. How can we do it?Sure,it cannot be put in the constructor.
The init() method has access to the ServletConfig,ServeltCOntext,which can be used for similar purposes,for example, use ServeltContext to get database name,login name ,etc.. (that are defined in xml's...)..
To perform all the above melodrama, we should override the init() method and put the code in that.
Now I suppose u understand why contructor() is not sufficient in these kind of cases,hence init() can be overriden in such cases.
First thing is that the constructor of the servlet is called by the container, we cannot call it. So we cannot add anything into the constructor
The init method is also called by the container. You can write a non-argrument constructor having initialization code, but is is bad parctice. While loading, there is something in betwwen the constructors and init method ( initialization of some objects like ServletConfig) so we can get access to initalization parameters to servelts, ServletContext etc. So it it easier to write initalization codes in init method