How to define <welcome-file-list> and <error-page> in servlet 3.0's web.xml-less?
I have existing web-app which I want to convert into web.xml-less of servlet's 3.0. I've managed to make it working, however there are 2 tags in web.xml which I still don't know the equivalent code in web.xml-less environment.
<welcome-file-list>
<welcome-file>/index.jsp</welcome-file>
</welcome-file-list>
<error-page>
<error-code>404</error-code>
<location>/pageNotFound</location>
</error-page>
Any help is appreciated
Solution 1:
In Servlets 3.0 you don't need a web.xml for many cases, however, sometimes it's required or just useful. Your case is just one of them - there is no special annotations to define welcome-file list or error-pages.
Another thing is - would you really like to have them hardcoded? There are some valid use-cases for annotation / programmatic based configuration and for declarative configuration in XML. Moving to Servlets 3.0 doesn't necessarily means getting rid of web.xml at all cost.
I would find the entries you posted a better example of configuration in XML. Firstly - they can be changed from deployment to deployment and secondly - they affect whole application and not any particular Servlet.
Solution 2:
For analog welcome-page-list put this in
@EnableWebMvc
@Configuration
@ComponentScan("com.springapp.mvc")
public class MvcConfig extends WebMvcConfigurerAdapter {
...
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/*.html").addResourceLocations("/WEB-INF/pages/");
}
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/").setViewName("forward:/index.html");
}
...
}
Solution 3:
In Spring Boot or general Spring MVC app for following scenario:
Static files can be served from locations registered with a custom ResourceHandlerRegistry. We have a static resource index.html and it can accessed at localhost:8080/index.html. We want to just redirect localhost:8080/ request to localhost:8080/index.html, following code will can be used.
package in.geekmj.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
@Configuration
@EnableWebMvc
public class WebConfiguration extends WebMvcConfigurerAdapter {
private static final String[] CLASSPATH_RESOURCE_LOCATIONS = { "classpath:/META-INF/resources/",
"classpath:/resources/", "classpath:/static/", "classpath:/public/" };
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/**").addResourceLocations(CLASSPATH_RESOURCE_LOCATIONS);
}
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addRedirectViewController("/", "/index.html");
}
}
Now accessing localhost:8080/ will redirect to localhost:8080/index.html
Solution 4:
In Spring Boot 2.0 you can use this code
@Configuration
public class TomcatInitializer implements
WebServerFactoryCustomizer<TomcatServletWebServerFactory> , TomcatContextCustomizer {
@Override
public void customize(TomcatServletWebServerFactory factory) {
factory.addContextCustomizers(this);
}
private ErrorPage createStatusErrorPage(int errorCode, String location) {
ErrorPage errorPage = new ErrorPage();
errorPage.setErrorCode(errorCode);
errorPage.setLocation(location);
return errorPage;
}
private ErrorPage createExceptionErrorPage(Class<?> klass, String location) {
ErrorPage errorPage = new ErrorPage();
errorPage.setExceptionType(klass);
errorPage.setLocation(location);
return errorPage;
}
@Override
public void customize(Context context) {
context.addWelcomeFile("/index.jsp");
context.addErrorPage(createStatusErrorPage(404, "/404.jsp"));
context.addErrorPage(createExeptionErrorPage(Exception.class, "exception.jsp"));
context.setSessionTimeout(120);
}
}