How can I configure web.xml url-pattern to get specified location?

16,457

Solution 1

You cannot put multiple url-patterns into one servlet-mapping. You need multiple servlet-mappings with the same servlet-name but different url-pattern.

My suggestion is to map your servlet to all /Projects/* URLs and implement simple servlet filter, which will return 404 for any URLs with subpath (this check can be made in your servlet as well, but if you cannot modify the servlet, use filter).

Solution 2

As my understanding of question:

if you want the thing as

  <servlet-mapping>
    <servlet-name>ProjectsServlet</servlet-name>
   <url-pattern>/Projects</url-pattern>
   <url-pattern>/Projects/*/</url-pattern>
 </servlet-mapping>

You can use two Servlet mappings as:

    <servlet-mapping>
      <servlet-name>ProjectsServlet</servlet-name>
       <url-pattern>/Projects</url-pattern>
   </servlet-mapping>   
    <servlet-mapping>
       <servlet-name>ProjectsServlet</servlet-name>
      <url-pattern>/Projects/*/</url-pattern>
   </servlet-mapping> 

And you can also map to a filter(ProjectsServletFilter) for the urls like "/Projects/*/" and process the request( Decide here whether need to send 404 or continue chain to another servlet etc) in this filter.

  <filter>
    <filter-name>ProjectsServletFilter</filter-name>
    <display-name>ProjectsServletFilter</display-name>
    <filter-class>ProjectsServletFilter</filter-class>
  </filter>
 <filter-mapping>
    <filter-name>ProjectsServletFilter</filter-name>
    <url-pattern>/Projects/*/</url-pattern>
</filter-mapping>

Anyway, the "/Projects" url servlet will get executed, if the above filter (ProjectsServletFilter) executed successfully without returning any 404 error code etc.

I hope it helps you.

Share:
16,457
rand0m86
Author by

rand0m86

Middle Java Developer. Working at IDEXX NL. Interested in Spring, Java EE and FP. Coding for fun.

Updated on June 04, 2022

Comments

  • rand0m86
    rand0m86 almost 2 years

    I want to handle requests to /Projects and /Projects/SomeProject/ with 'ProjectsServlet' but return 404 error code while accessing /Projects/SomePath/SomeOtherSubPath.

    Project names are updated frequently, so I don't want to rewrite my Servlet code every time it happens and I've written simple parser of project name and servlet loads specified page if it exists.

    So how can I write config in web.xml? Now it looks like:

    <servlet>
      <servlet-name>ProjectsServlet</servlet-name>
      <servlet-class>com.example.ProjectsServlet</servlet-class>
    </servlet>
    
    <servlet-mapping>
      <servlet-name>ProjectsServlet</servlet-name>
      <url-pattern>/Projects/*</url-pattern>
    </servlet-mapping>
    

    But it also trying to handle all requests after 'Projects' root directory /Projects/.../...

    In the best case I want to write mapping like this:

    <servlet-mapping>
      <servlet-name>ProjectsServlet</servlet-name>
      <url-pattern>/Projects</url-pattern>
      <url-pattern>/Projects/*/</url-pattern>
    </servlet-mapping>
    

    But it's not correct. How can I do the same?