【问题标题】:Spring mvc 4 can't render jspSpring mvc 4无法渲染jsp
【发布时间】:2023-12-30 06:02:01
【问题描述】:

我正在尝试在不使用 web.xml 的情况下学习 Spring MVC 4,而是使用以下内容:

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.bookstr.WebConfig");
    return context;
}

}

@Configuration
@EnableWebMvc
@ComponentScan({ "com.bookstr.*" })
public class WebConfig {

}

由于某种原因,当我使用以下控制器时,我创建并放置在 src->main->webapp 文件夹中的 home.jsp 文件将不会呈现:

@Controller
public class HomeController {

    @RequestMapping(value = "/home", method = RequestMethod.GET)
    public String getHome(Model model){
        model.addAttribute("home", "Hello world");

        return "home";
    }
}

而JSP文件如下:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Home</title>
</head>
<body>
${home}
</body>
</html>

更新!

按要求提供文件夹结构。

我可以看到 HomeController 没有被调用。

【问题讨论】:

  • 您注册ViewResolver 来解析您的jsp 视图了吗?
  • 不,我没有@AliDehghani

标签: spring jsp spring-mvc


【解决方案1】:

在您的WebConfig 中注册ViewResolver

@Configuration
@EnableWebMvc
@ComponentScan("com.bookstr")
public class WebConfig {
    @Bean
    public InternalResourceViewResolver viewResolver() {
        InternalResourceViewResolver viewResover = new InternalResourceViewResolver();
        viewResolver.setPrefix("/WEB-INF/views/");
        viewResolver.setSuffix(".jsp");

        return viewResolver;
    }
}

这样,当您从控制器返回 home 时,它将尝试渲染 /WEB-INF/views/home.jsp 视图。对于以编程方式配置DispatcherServlet,使用AbstractAnnotationConfigDispatcherServletInitializer 更容易。例如,您可以:

public class WebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return null;
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class<?>[] { WebConfig.class };
    }

    @Override
    protected String[] getServletMappings() {
        return new String[] { "/*.html" };
    }
}

【讨论】:

  • 你确定你的控制器被调用了吗?在您的控制器中放置一个断点并确保这一点。另外,你把你的观点放在哪里了?
  • 注册解析器并在src/main/webapp/WEB-INF/views/home.jsp中创建home.jsp。另外,将webapp 文件夹添加到标记为src/main 中。