Spring 4:无法配置Servlet的映射

时间:2014-10-21 11:42:49

标签: java spring jsp spring-mvc servlets

我正在努力使用servlet配置的Spring MVC web-app

  • 我正在使用Intellij IDEA IDE;
  • 引入spring-boot-starter-parent,版本1.1.8.RELEASE,作为Maven的pom.xml中的父级,spring-boot-starter-webspring-webmvc作为依赖项;
  • 使用以下bean定义了一个Config类:

`

@Configuration
@EnableAutoConfiguration
@ComponentScan(basePackages = {"sblog", "sblog.controller", "sblog.repository", "sblog.service"})
@EnableJpaRepositories("sblog.repository")
@EnableTransactionManagement
@EnableWebMvc
public class Config {
    ...
    @Bean
    public DispatcherServlet dispatcherServlet() {
        return new DispatcherServlet(); 
    }

    @Bean
    public ServletRegistrationBean dispatcherRegistration() {
        ServletRegistrationBean registration = new ServletRegistrationBean(
                dispatcherServlet(), "/*", "/index");
        registration.setLoadOnStartup(1);
        System.err.println(registration.getServletName());
        System.err.println(registration.getUrlMappings());
        return registration;
    }
    @Bean
    public InternalResourceViewResolver viewResolver() {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/resources/");
        resolver.setSuffix(".jsp");
        return resolver;
    }
  • 定义了一个类应用程序:

`

public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Config.class, args);
    }
}

`   - 增加了一个简单的控制器:

`

@Controller
public class ApplicationController {

    @RequestMapping(method = GET, value = "/")
    public String index(Model model) {
        System.err.println("Index");
        return "index";
    }
  • 并定义了以下项目结构:

`

sblog/
├── pom.xml
├── sblog.iml
├── src
│   ├── main
│   │   └── java
│   │       └── sblog
│   │           ├── Application.java
│   │           ├── Config.java
│   │           ├── controller
│   │           │   ├── ApplicationController.java
│   │           │   ├── PageController.java
│   │           │   ├── PostController.java
│   │           │   └── SessionController.java
│   │           ├── orm
│   │           │   ├── Author.java
│   │           │   └── Post.java
│   │           ├── repository
│   │           │   ├── AuthorRepository.java
│   │           │   └── PostRepository.java
│   │           ├── service
│   │           │   └── PostService.java
│   │           └── WebMVCApplicationInitializer.java
│   └── resources
│       └── index.jsp

`

但是每次访问root时我都会o.s.web.servlet.PageNotFound : No mapping found for HTTP request with URI [/resources/index.jsp] in DispatcherServlet with name 'dispatcherServletRegistration'

提前感谢您,任何帮助将不胜感激! :)

2 个答案:

答案 0 :(得分:0)

首先,我使用了相同的结构,除了我的资源'文件夹位于' main'夹。其次,我使用了如下配置。

@Configuration
@EnableAutoConfiguration
public class CoreConfig {
    @Bean
    public WebMvcConfigurerAdapter initAdapter(){
        return new WebMvcConfigurerAdapter() {
            @Override
            public void addResourceHandlers(ResourceHandlerRegistry registry) {
                registry.addResourceHandler("/**").addResourceLocations("/resources/");
            }
        };
    }

    @Bean
    public InternalResourceViewResolver getInternalResourceViewResolver() {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setSuffix(".jsp");
        return resolver;
    }
}

如果您想了解更多详情,请查看GitHub上的示例项目。

答案 1 :(得分:0)

首先,我建议阅读Spring Boot可以为您做什么,您正在努力不使用Spring启动。

我建议删除@Configuration@EnableAutoConfiguration@ComponentScan之外的所有注释。其他所有内容都将由Spring Boot添加/提供。我还建议将您的ConfigApplication类合并为一个。离开时请注意以下事项(是的,没有@Bean方法)..

@Configuration
@EnableAutoConfiguration
@ComponentScan
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Config.class, args);
    }
}

您只需要添加spring-boot-starter-webspring-boot-starter-data-jpa作为依赖项,其他必要的依赖项(spring-webmvc等)将自动添加。当然,您仍然需要将hibernate添加为依赖项。

Spring Boot将检测Spring Web并为您配置DispatcherServlet和其他bean。

接下来,src/resources目录尚不清楚,因此它不会作为资源提供,因此无法找到。我还建议不要使用JSP作为视图层。如the reference guide中所述,JSP和Spring Boot存在一些问题。如果您真的必须明确配置InternalResourceViewResolver,但要将application.properties文件添加到src/main/resources,并将以下内容添加到属性中。

spring.view.prefix=
spring.view.suffix=.jsp

对应于InternalResourceViewResolver的前缀和后缀属性。有关属性列表,请选中the reference guide

我建议不要使用src/main/resources/resources文件夹来存储JSP页面,因为该目录也是公开可读的(默认情况下在Spring Boot中)。我建议使用views目录。这将导致以下属性

spring.view.prefix=/views/
spring.view.suffix=.jsp

最后一点说明Spring Boot驱动的应用程序无法检测到WebApplicationInitializer所以如果你在其中做了一些事情,那么Spring Boot应用程序将无法完成(除非它是特定的Spring Boot {{1} })。