why can't we put the code in servlet (in place of Listener i.e ServletContextListener) to initialize the application with database DataSource that all the servlets can use?
You can. You can also use a hammer to drive in a screw. But it's the wrong tool for the job. Servlets are meant to respond to requests, context listeners are meant to perform setup. Use the right tool for the job.