I have a servlet called User.java
. It is mapped to the url pattern
<servlet-mapping>
<servlet-name>User</servlet-name>
<url-pattern>/user/*</url-pattern>
</servlet-mapping>
Inside the Servlet, the path following the slash in user/
is analyzed, data about that user is retrieved from the database, set in attributes, and then the page user_home.jsp
is to be displayed.
The code to make this happen is:
User user = UserManager.getUserInfoById(userPath);
request.getSession().setAttribute("user", user);
request.getRequestDispatcher("resources/jsp/user_home.jsp").forward(request, response);
The problem is, that rather than opening this user_home.jsp
, the request is mapped once again to the same servlet User.java
. It does nothing.
I've put output statements at the beginning of the doGet
method, so I can see that the URL is
http://localhost:8080/myproj/user/resources/jsp/user_home.jsp
so it seems the obvious problem is that it's mapping right back to the user/*
pattern.
How do I get the Servlet to display this page without going through URL mapping, and properly display the jsp
I need it to?
If the path passed to request.getRequestDispatcher()
does not begin with a "/
", it is interpreted as relative to the current path. Since your servlet's path is /user/<something>
, it tries to forward the request to /user/resources/jsp/user_home.jsp
, which matches your servlet mapping and therefore forwards to the same servlet recursively.
On the other hand, if the path passed to request.getRequestDispatcher()
begins with a "/
", it is interpreted as relative to the current context root. So assuming that the resources
directory is located at the root of your webapp, try adding a "/
" at the beginning of the path, e.g.:
request.getRequestDispatcher("/resources/jsp/user_home.jsp").forward(request, response);