Search code examples
javatomcatservletsweb.xmlurl-pattern

url-pattern /* serves jsp files and static assets as seperate requests


I have a simple servlet which renders different content based on different geo locations for example:

example.com/us
example.com/de
example.com/uk
example.com/..

so actually the servlet should supports all geo locations as url-pattern. So thats why I defined the rule below in my web.xml file:

<servlet-mapping>
  servlet-name>MyServlet</servlet-name>
  <url-pattern>/*</url-pattern>
</servlet-mapping>

this is how the servlet look like:

public class MyServlet extends HttpServlet{
  String showPage = "/pages/show.jsp";
  public void doGet(HttpServletRequest request, HttpServletResponse response){
    System.out.println("servlet initiated... ~> "+request.getRequestURI());
    ...
    request.getRequestDispatcher(showPage).forward(request, response);

  }

}

As soon as I try to forward the page, the servlet starts again and again; it tries to also handle the request /page/show.jsp. So I get such an ouput when I try to access example.com/us:

servlet initiated... ~> /us
servlet initiated... ~> /page/show.jsp
Exception...
servlet initiated... ~> /page/show.jsp
Exception...
servlet initiated... ~> /page/show.jsp
...

It throws an exception because my servlet is not expecting such a url-pattern /page/show.jsp but it triggers because I have define /* url-pattern in my web.xml file.

Any idea? how can I skip or exclude the unwanted requests like the one above? Thanks.


Solution

  • Bart answer gave me the clue. Actually there are many ways to handle this, one is to use Filters and the other one is to define all the static routes in web.xml and instead of the /* I have used /.

    So to resolve the issue I change the url-pattern as below:

    <!-- static assets -->
    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>*.js</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>*.css</url-pattern>
    </servlet-mapping>
    
    <!-- my servlet -->
    <servlet-mapping>
      servlet-name>MyServlet</servlet-name>
      <url-pattern>/</url-pattern>
    </servlet-mapping>
    

    You also don't need to define the pattern for org.apache.catalina.servlets.DefaultServlet its already there by default. So After above changes everything works fine.