Forums Register Login

HttpServletRequest getRequestDispatcher behaving strangely

+Pie Number of slices to send: Send
Please find the code snipped below which is working perfectly eventhough I donot have any directory called Receiver under my context root(webapps/myApplication). Can you please help me how it is working.

// Obtain a RequestDispatcher (for the Receiver servlet)
RequestDispatcher rd = request.getRequestDispatcher("/Receiver/pathInfo?fruit=orange");

Also I dont have any Servlet called pathInfo under any directory of my context-root.

As far as I know getRequestDispatcher() argument starting with "/" will try to look for a file from context-root. Please do help me in this.
+Pie Number of slices to send: Send
It doesn't have to be a specific file in a real location, it is a URL. You should look into the web.xml file to see what servlet is mapped to that URL.

Other things to check would be a control servlet mapped to /* or /Receiver/* that could then look at the URL and translate the rest of the input as parameters to determine which page to display.
+Pie Number of slices to send: Send
Thank you very much. But I read that getNamedDispatcher is the one which will look into web.xml for a given servlet name. Do you mean to say that getRequestDispatcher() method looks for a matching url-pattern where as getNamedDispatcher() looks for a servlet-name in web.xml.

So, Can we conclude that both the methods looks into web.xml for finding a sevlet.

getRequestDispatcher() for matching url-pattern
getNamedDispatcher() for matching servlet-name.
+Pie Number of slices to send: Send
Yes. That is right. getRequestDispatcher() will lookup a URL and doesn't need to know where the URL came from - either the address of a physical file under the context root or a URL pattern that is matched in web.xml. The getNamedDispatcher() will look for Servlet names which usually come from the web.xml.
+Pie Number of slices to send: Send
Thank you. What if the getRequestDispatcher() method finds requested resource both under context-root and in web.xml but each having different content. Which one will take precedence.

Say for example a file with name test.jsp under context-root as well as under context-root/WEB-INF (with an entry with url-pattern /test* in web.xml) but each having different content.

Which one will take precedence.
+Pie Number of slices to send: Send
So these kinds of questions can best be answered by reading the Servlet specifications, which you can find here.

The appropriate chapter is SRV 11: Mapping Servlets to Requests. If you read section SRV.11.2 you will see:


So when you have the URL mapped to:
/test*
That would be an unmatched pattern since the * would not be a wildcard, but must be an exact match. So let's change your question to ask:
"When I make a request to /test/my.jsp, which will be chosen between a JSP with the path under the context root of /test/my.jsp versus a servlet mapped to /test/*?"

To answer this we look at section SRV.11.1 which says:


So in the case of a JSP at:
/ContextRoot/test/my.jsp
versus a Servlet mapped to
/test/*

First try Rule 1, and if there isn't a specific match to /test/my.jsp then that fails.

Then try Rule 2... by looking through the mapped URLs, /test/my.jsp matches the /test/* URL so that servlet gets called.

Only if the requested URL didn't match a specific mapping in the web.xml would Rule 3 apply and let the JSP servlet get executed. But because Rule 2 applies before Rule 3, those URLs you map in the web.xml will take precedence over extension-mapped URLs, such as JSPs.
[ December 31, 2008: Message edited by: Steve Luke ]
+Pie Number of slices to send: Send
I got it now. Thank you Steve.
I'd appreciate it if you pronounced my name correctly. Pinhead, with a silent "H". Petite ad:
a bit of art, as a gift, that will fit in a stocking
https://gardener-gift.com


reply
reply
This thread has been viewed 4342 times.
Similar Threads
How to set context-root for web application in 6.1
RequestDispatcher question
request dispatcher include call failed
damn the requestDispatcher
How do i forward db resultset from servlet to jsp
More...

All times above are in ranch (not your local) time.
The current ranch time is
Mar 28, 2024 02:50:50.