I expected that since pageContext object is available in the page I can access the init-param values using that object. The same is the case with application object too. What is the reason for this behaviour?
If you want to add init-params to a JSP via web.xml, you need to create a servlet mapping for your JSP and use the url defined in that mapping when making the request.
Context init params, on the other hand are bound to the Context object (which is available to all components of the app) will be available, regardless of how your JSP was invoked.