java - Spring Web应用程序初始化器

标签 java spring spring-mvc

最近在学习基于spring java的配置。我尝试用 WebConfigWebApplicationInitializer 替换 web.xml

每当我请求网址时:http://localhost:8080/spring-demo/greeting.html我收到 404 描述 请求的资源不可用。 以下是我的项目详细信息。

WebConfig.java

package com.soumya.spring;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "com.soumya.spring")
public class WebConfig {

}

WebAppInitializer.java

package com.soumya.spring;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRegistration;

import org.springframework.web.WebApplicationInitializer;
import org.springframework.web.context.ContextLoaderListener;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.DispatcherServlet;

public class WebAppInitializer implements WebApplicationInitializer {

    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {      
        WebApplicationContext context = getContext();
        servletContext.addListener(new ContextLoaderListener(context));
        ServletRegistration.Dynamic dispatcher = servletContext.addServlet("DispatcherServlet", new DispatcherServlet(context));
        dispatcher.setLoadOnStartup(1);
        dispatcher.addMapping("*.html");
    }

    private AnnotationConfigWebApplicationContext getContext() {
        AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
        context.setConfigLocation("com.soumya.spring.WebConfig");
        return context;
    }

}

Controller

package com.soumya.spring.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class HelloController {

    @RequestMapping(value = "/greeting")
    public String greeting(Model model) {
        model.addAttribute("greeting", "Hello World!");
        return "greeting.jsp";
    }

}

项目结构图

Project Structure

最佳答案

首先,您的网址末尾不应有 .html 或 .jsp。网址将为http://localhost:8080/spring-demo/greeting

在您的特定 WebApplicationInitalizer 中,您的 DispatcherServlet 应映射到 /greeting Controller 而不是“*.html ”。

dispatcher.addMapping("/greeting");

此外,您的 DispatcherServlet(代码中的 WebConfig.class)没有定义 ViewResolver Bean。 ViewResolver 负责将 View 名称(如 HelloController 返回的“greeting.jsp”)映射到 View 实现(实际的“greeting.jsp”文件,可能存在于/WEB-INF/文件夹中。

我已经更改了您的 WebConfig 类以包含 ViewResolver bean-

package com.soumya.spring;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.InternalResourceViewResolver;


@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "com.soumya.spring")
public class WebConfig extends WebMvcConfigurerAdapter {

@Bean
public ViewResolver viewResolver() {

        InternalResourceViewResolver irvr = new InternalResourceViewResolver();

        irvr.setPrefix("/WEB-INF/views/"); //your "greeting.jsp" file should be here
        irvr.setSuffix(".jsp");
        irvr.setExposeContextBeansAsAttributes(true);
        return irvr;

    }
}

关于java - Spring Web应用程序初始化器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35971082/

相关文章:

java - Spring Boot + JPA,PostgreSQL 驱动程序为 Heroku 远程数据库 URL 返回 null

java - Spring security - 休息服务的自定义过滤器和入口点

java - Spring Hibernate Template 执行方法为 Oracle 上的计数查询返回什么对象类型?

java - 安卓 : startActivityForResult() with BACK button functionality

java - 使用 Jackson 进行 XML 反序列化

java - 从 spring 4.3.2 升级到 5.0.2 导致缺少 @AliasFor 错误

java - 如何使用 jSTL 和 EL 迭代 JSP 中的对象列表?

java - 从 jsp 中的 ModelAndView 检索模型

java - 有没有办法删除 Grizzly 服务器中的 header ?

java - JFrame 中的自定义绘图不显示