The "default" servlet is also responsible for handling the requests to the static content in a web application.
A convention for Spring MVC based applications is to register the Spring MVC Front Controller called the DispatcherServlet with a servlet mapping of '/'
<servlet> <servlet-name>spring</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:/META-INF/spring/web/webmvc-config.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>spring</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
This enables Spring MVC to handle all the requests coming to the web application, except for cases where other specific mappings are available. A good example of a case where a specific mapping may be required is to configure the front controller for Apache CXF to accept webservice requests to /webservices servlet path:
<servlet> <servlet-name>CXFServlet</servlet-name> <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>CXFServlet</servlet-name> <url-pattern>/webservices/*</url-pattern> </servlet-mapping>
Given that it is the "default" servlet which handles the request for the static resources like images, and the default servlet with Spring MVC is the DispatcherServlet, there are a few recommendations to serve out static content from Spring MVC based web applications:
1. Using mvc:resources -
For eg.
<mvc:resources mapping="/resources/**" location="/public-resources/"/>
This enables serving any static content whose location can be specified as a Spring Resource
2. Using mvc:default-servlet-handler:
<mvc:default-servlet-handler />This provides a way to serve out the static content from the root of the web application even though the Dispatcher Servlet is registered at /, the details of how Spring does this is available at the Spring documentation site here - in brief the responsibility is delegated to the containers default servlet.
Yesterday only I have implemented the above.
ReplyDeleteThanks for the article.If I have images outside the server context, how will I access through http.
ReplyDeleteWonderful article.How can we access images say from X directory through http call and display the same in webpage.
ReplyDeleteFinally I got what is the purpose of thanks a lot
ReplyDeleteThank you! Finally found mvc:default-servlet-handler
ReplyDelete