I'm currently trying to move my project from Java EE to Spring Boot project. However, i've been stucked and confused on the part with dispatcher servlet and web.xml and it seems like web.xml is no longer being read by the project anymore. The current project is running on tomcat 7.
In my web.xml
file, I have lots of servlet
, servlet-mapping
, filter
and filter mapping
and I don't really understand how to do the mapping in the dispatcher.
I've attached a sample of my web.xml
below and the version is 2.5.
<?xml version="1.0" encoding="UTF-8"?>
<web-app metadata-complete="true" version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<display-name>displayName</display-name>
<description>description</description>
<resource-ref>
...
</resource-ref>
<filter>
<filter-name>Some Filter Name</filter-name>
<filter-class>Some Filter Class</filter-class>
<init-param>
<param-name>Some Param Name</param-name>
<param-value>Some Value</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Some Filter Name</filter-name>
<url-pattern>Some url-pattern</url-pattern>
</filter-mapping>
<context-param>
<param-name>Some Param Name</param-name>
<param-value>Some Param Value</param-value>
</context-param>
<servlet>
<servlet-name>Some Servlet Name</servlet-name>
<servlet-class>Some Servlet Class</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Some Servlet Name</servlet-name>
<url-pattern>Some Url Pattern</url-pattern>
</servlet-mapping>
</web-app>
Qns:
- Should I convert all the stuff in my
web.xml
to rely on the spring dispatcher, if yes how can I achieve that? - Is moving away from the
web.xml
the way to go for spring boot project?
Can anyone please guide me along here? Thanks!!
Spring-boot prefer annotations over xml based configurations, so in your case instead of using
web.xml
to configure theservlet, servlet-mapping, filter
andfilter mapping
, you can use annotation based automatic bean creations to register beans.For that you need to :@Bean
annotations so that spring-boot will automatically take them up during component scan.For reference: https://docs.spring.io/spring-boot/docs/current/reference/html/howto-traditional-deployment.html
@Configuration
or@Component
annotation and create bean ofFilterRegistrationBean
to register the filter.You can also create the beans of filter itself there by using @Bean annotation.For example, the equivalent of the following xml based filter
The equivalent annotation based will be:
web.xml
.For example :Web.xml
and in another file dispatcher.xml you can create beans as :
Note that Spring
web.xml
will usually live insrc/main/webapp/WEB-INF
.You can refer : https://www.baeldung.com/register-servlet
Spent quite some time so sharing three things I remember to make it working from command line.
In your mvc config file
@Configuration public class MvcConfig extends WebMvcConfigurerAdapter { @Bean public InternalResourceViewResolver viewResolver(){ InternalResourceViewResolver resolver = new InternalResourceViewResolver(); resolver.setPrefix("/Representation/"); resolver.setSuffix(".jsp"); return resolver; }
pom.xml
. The way to go with spring boot is moving all your xml configuration, web.xml etc to spring boot's auto configuration + your java configuration.Spring boot works very good when you do everything in java configuration and follow its principals. From my experience with it, when you start merging XML configuration and the legacy spring it starts breaking the auto configuration process and its much better to try as much as you can to comply with the new spring boot best practices.
You can keep your
web.xml
, but it needs to addin
web.xml
. And, required dependency ofpom.xml
.All listener classes, filters converts in Java class. This class would be
@Configuration.
If you have an interceptor, that can be moved to configuration class.