31

我有现有的网络应用程序,我想将其转换为 servlet 3.0 的 web.xml-less。我已经设法让它工作,但是 web.xml 中有 2 个标签,我仍然不知道 web.xml-less 环境中的等效代码。

<welcome-file-list>
    <welcome-file>/index.jsp</welcome-file>
</welcome-file-list>

<error-page>
    <error-code>404</error-code>
    <location>/pageNotFound</location>
</error-page>

任何帮助表示赞赏

4

4 回答 4

31

在 Servlets 3.0 中,很多情况下您不需要 web.xml,但是,有时它是必需的或只是有用的。您的案例只是其中之一 - 没有特殊的注释来定义欢迎文件列表或错误页面。

另一件事是——你真的想让它们硬编码吗?对于基于注释/编程的配置和 XML 中的声明性配置,有一些有效的用例。迁移到 Servlets 3.0 并不一定意味着不惜一切代价摆脱 web.xml。

我会发现您发布的条目是 XML 配置的更好示例。首先 - 它们可以从部署更改为部署,其次 - 它们影响整个应用程序而不是任何特定的 Servlet。

于 2012-11-19T08:37:55.517 回答
10

对于模拟欢迎页面列表,将其放入

@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");
    }
...
}
于 2014-12-05T07:26:49.333 回答
2

在 Spring Boot 或一般 Spring MVC 应用程序中用于以下场景:

可以从使用自定义 ResourceHandlerRegistry 注册的位置提供静态文件。我们有一个静态资源index.html,它可以在localhost:8080/index.html访问。我们只想将localhost:8080/请求重定向到localhost:8080/index.html,可以使用以下代码。

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");
}
}

现在访问localhost:8080/将重定向到localhost:8080/index.html

于 2016-04-03T07:00:47.277 回答
1

在 Spring Boot 2.0 中,您可以使用此代码

@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);
    }
}     
    
于 2021-04-17T05:38:26.700 回答