views:

111

answers:

2

Hi, I'm using Spring 2.5 MVC and wan't to add another third-party Servlet. The Problem is, that Spring MVC catches all request, so the Servlet isn't getting any request. Here a web.xml Snippet:

<servlet>
    <servlet-name>SpringMVC</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>2</load-on-startup>
</servlet>

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

<servlet>
    <description>This is the servlet needed for cache.type servlet, returns the packed resources</description>
    <display-name>PackServlet</display-name>
    <servlet-name>PackServlet</servlet-name>
   <servlet-class>net.sf.packtag.servlet.PackServlet</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>PackServlet</servlet-name>
    <url-pattern>*.pack</url-pattern>
</servlet-mapping>

The /* mapping is really needed for the application, an pack:tag (the third-party Servlet) really need the mapping based on the file extension. Any possiblities to tell Spring not to process the request? Thanks and regards.

+1  A: 

Check the accepted answer on this SO questions. It should solve your issue.

http://stackoverflow.com/questions/1234298/can-springmvc-be-configured-to-process-all-requests-but-exclude-static-content-d

Lombo
+3  A: 

Actually you do not need spring to do anything, the servlet container can solve this for you.

When matching to which servlet a request is sent is dependent on the matching rules defined by the url-pattern. No 2 servlets may have the same pattern, but they may have overlapping patterns. Then 4 rules apply :

1) exact matches have priority over wildcard matches 2) longer path patterns have priority over shorter patterns 3) path matches have priority over filetype matches 4) / matches anything not already matched

<servlet-mapping>
  <servlet-name>PackServlet</servlet-name>
  <url-pattern>*.pack</url-pattern>
</servlet-mapping>
<servlet-mapping>
  <servlet-name>SpringMVC</servlet-name>
  <url-pattern>/</url-pattern>
</servlet-mapping>

If you use /* for the SpringMVC it may match on the longest path. By removing the * you are sure to follow the servlet spec for the default servlet and falls under rule 4.

Here you can find some more details.

Peter Tillemans
both your <url-pattern> end with a </usr-pattern>, try to correct those as people who find these useful will likely copy-paste this snippet
Lombo
@Lombo : Thanks, Great spot.
Peter Tillemans